Для анализа производительности веб-приложений с использованием Three.js часто используют библиотеку Stats.js. Она позволяет отслеживать количество кадров в секунду (FPS), время рендеринга и другие показатели, влияющие на плавность анимации.
Подключение может быть выполнено через CDN:
<script src="https://cdnjs.cloudflare.com/ajax/libs/stats.js/r17/Stats.min.js"></script>
После подключения создаётся объект Stats:
const stats = new Stats();
stats.showPanel(0); // 0 — FPS, 1 — миллисекунды, 2 — память
document.body.appendChild(stats.dom);
Для интеграции с циклом анимации Three.js используется метод
begin() и end():
function animate() {
stats.begin();
renderer.render(scene, camera);
stats.end();
requestAnimationFrame(animate);
}
animate();
Метод stats.begin() фиксирует начало кадра, а
stats.end() — окончание, позволяя отображать актуальные
показатели FPS.
FPS (Frames Per Second) — ключевой показатель производительности сцены. Для WebGL-приложений оптимальным считается значение 60 кадров в секунду. Если FPS стабильно ниже 30, необходимо анализировать узкие места:
Количество draw calls напрямую влияет на производительность. Каждая отдельная меш-геометрия с уникальным материалом генерирует отдельный draw call. Методы оптимизации:
BufferGeometryUtils.mergeBufferGeometries();Высокое разрешение текстур увеличивает нагрузку на GPU. Эффективные подходы:
THREE.TextureLoader с параметрами
minFilter и magFilter для оптимизации;texture.dispose().Chrome DevTools предоставляет мощные инструменты для анализа производительности WebGL-приложений.
F12 или
Ctrl+Shift+I).Отображается график FPS и детальный временной разбор: сколько времени занимает рендеринг каждого кадра, выполнение скриптов, layout и paint. Это помогает выявить узкие места и определить, какие части кода вызывают задержки.
Для WebGL критично следить за потреблением памяти. DevTools позволяет:
geometry.dispose(),
material.dispose()).На вкладке Rendering можно включить WebGL профилирование:
Stats.js хорошо показывает общую нагрузку на кадр, но для детального анализа следует использовать Chrome DevTools. Совместная работа позволяет:
InstancedMesh, что
позволяет сократить нагрузку на GPU без потери визуального
качества.const stats = new Stats();
stats.showPanel(0);
document.body.appendChild(stats.dom);
const clock = new THREE.Clock();
function animate() {
stats.begin();
const delta = clock.getDelta();
// обновление анимаций
mixer?.update(delta);
renderer.render(scene, camera);
stats.end();
requestAnimationFrame(animate);
}
animate();
Этот подход позволяет в реальном времени отслеживать FPS через Stats.js и одновременно анализировать производительность сцены через DevTools, выявляя узкие места и оптимизируя их для стабильного рендеринга.