В графических приложениях на базе WebGL значительную роль играет баланс между качеством изображения и производительностью. В библиотеке Babylon.js этот баланс регулируется рядом параметров движка, одним из ключевых является Hardware Scaling Level — коэффициент аппаратного масштабирования рендера.
Hardware Scaling Level определяет, в каком разрешении сцена фактически рендерится по отношению к размеру canvas, после чего полученное изображение масштабируется до реального размера экрана. Такой подход позволяет существенно снижать нагрузку на графический процессор.
Фактически параметр управляет внутренним разрешением рендеринга:
Если canvas имеет разрешение 1920×1080 и используется масштабирование
2, реальный рендеринг сцены будет происходить в
разрешении:
960 × 540
После рендера изображение увеличивается до размеров canvas.
В Babylon.js рендеринг сцены осуществляется через объект Engine, который управляет WebGL-контекстом, кадрами рендера и взаимодействием с GPU.
Параметр аппаратного масштабирования хранится внутри движка и влияет на:
Fill rate — это скорость, с которой GPU может заполнять пиксели. Именно этот показатель часто становится узким местом в WebGL-сценах с большим количеством пиксельных операций: освещение, пост-эффекты, прозрачность, PBR-материалы.
Уменьшение внутреннего разрешения напрямую уменьшает количество вычисляемых пикселей.
Например:
| Разрешение | Количество пикселей |
|---|---|
| 1920×1080 | 2 073 600 |
| 1280×720 | 921 600 |
| 960×540 | 518 400 |
Снижение разрешения до 960×540 уменьшает вычисления
примерно в 4 раза.
В Babylon.js изменение коэффициента выполняется через метод
setHardwareScalingLevel() объекта Engine.
Пример:
const canvas = document.getElementById("renderCanvas");
const engine = new BABYLON.Engine(canvas, true);
engine.setHardwareScalingLevel(1);
Значение 1 означает отсутствие масштабирования — сцена
рендерится в полном разрешении canvas.
engine.setHardwareScalingLevel(1);
Особенности:
engine.setHardwareScalingLevel(1.5);
Характеристики:
engine.setHardwareScalingLevel(2);
Особенности:
Babylon.js предоставляет метод для получения текущего значения:
const scale = engine.getHardwareScalingLevel();
Это полезно при создании систем динамической оптимизации производительности.
Hardware Scaling Level может изменяться во время работы сцены. Такой подход используется в адаптивных системах производительности.
Пример простой логики:
scene.onBeforeRenderObservable.add(() => {
const fps = engine.getFps();
if (fps < 40) {
engine.setHardwareScalingLevel(2);
} else if (fps > 55) {
engine.setHardwareScalingLevel(1);
}
});
Принцип работы:
На устройствах с высоким devicePixelRatio (например Retina-дисплеи) canvas автоматически масштабируется, чтобы изображение оставалось резким.
Babylon.js может учитывать DPI при создании движка:
const engine = new BABYLON.Engine(canvas, true, {
adaptToDeviceRatio: true
});
В этом случае фактическое разрешение canvas увеличивается
пропорционально devicePixelRatio.
Например:
| Экран | devicePixelRatio | Реальный canvas |
|---|---|---|
| 1920×1080 | 2 | 3840×2160 |
Без использования Hardware Scaling Level это может резко увеличить нагрузку на GPU.
Поэтому часто применяется комбинация:
engine.setHardwareScalingLevel(1.5);
Hardware Scaling Level влияет на внутренний render buffer, но не изменяет физический размер canvas.
Алгоритм работы движка:
Схема:
Canvas (1920x1080)
↓
Hardware Scaling = 2
↓
Render Buffer (960x540)
↓
Upscale
↓
Display (1920x1080)
Мобильные GPU значительно слабее настольных. Основные ограничения:
Поэтому для мобильных устройств часто используется масштабирование:
engine.setHardwareScalingLevel(2);
Иногда применяется даже более высокий коэффициент:
engine.setHardwareScalingLevel(3);
Это уменьшает рендеринг в 9 раз по количеству пикселей, что резко повышает FPS.
Babylon.js позволяет определить тип устройства через JavaScript и применить разные параметры.
Пример:
const isMobile = /Android|iPhone|iPad/i.test(navigator.userAgent);
if (isMobile) {
engine.setHardwareScalingLevel(2);
} else {
engine.setHardwareScalingLevel(1);
}
Такой подход используется во многих WebGL-проектах.
В крупных сценах Babylon.js применяется Adaptive Quality System, которая может автоматически изменять различные параметры:
Пример адаптивной системы:
let scaling = 1;
scene.onBeforeRenderObservable.add(() => {
const fps = engine.getFps();
if (fps < 45 && scaling < 2.5) {
scaling += 0.1;
engine.setHardwareScalingLevel(scaling);
}
if (fps > 58 && scaling > 1) {
scaling -= 0.1;
engine.setHardwareScalingLevel(scaling);
}
});
Плавное изменение коэффициента позволяет избежать резких скачков качества изображения.
Hardware Scaling Level влияет на работу post-processing effects:
Эти эффекты выполняются в пространстве экрана. При уменьшении внутреннего разрешения:
Поэтому в проектах с большим количеством пост-эффектов масштабирование часто является главным инструментом оптимизации.
Если используется MSAA или FXAA, снижение разрешения может влиять на качество сглаживания.
Например:
scaling = 2 edges становятся более мягкимиКомбинация:
Hardware Scaling + FXAA
часто используется для балансировки качества и производительности.
Важно понимать, что Hardware Scaling Level не изменяет:
Он влияет только на количество пикселей, которые обрабатывает GPU.
Таким образом оптимизируется именно pixel shading, а не vertex processing.
Типичные значения для разных типов устройств:
| Устройство | Scaling |
|---|---|
| High-end PC | 1 |
| Средний ноутбук | 1.25 – 1.5 |
| Планшет | 1.5 – 2 |
| Смартфон | 2 – 3 |
При изменении размера окна масштабирование продолжает работать автоматически, так как Babylon.js обновляет render buffers.
Пример:
window.addEventListener("resize", () => {
engine.resize();
});
После resize движок пересчитывает:
При разработке сцен полезно проверять влияние Hardware Scaling Level на FPS.
Пример вывода статистики:
console.log("FPS:", engine.getFps());
console.log("Scaling:", engine.getHardwareScalingLevel());
Также часто используется встроенный Inspector Babylon.js, где можно наблюдать производительность сцены в реальном времени.
Сильное уменьшение внутреннего разрешения может приводить к:
Поэтому масштабирование должно использоваться аккуратно и сочетаться с другими методами оптимизации:
Hardware Scaling Level является одним из наиболее эффективных инструментов оптимизации WebGL-сцен, поскольку напрямую снижает количество пиксельных вычислений. В сложных сценах Babylon.js изменение этого параметра может увеличить производительность в несколько раз без изменения геометрии, текстур или логики сцены.