Производительность в CesiumJS определяется взаимодействием нескольких подсистем: рендеринга WebGL, потоковой загрузки тайлов, управления памятью и планировщика запросов. Каждая из этих областей формирует отдельный слой метрик, которые необходимо отслеживать одновременно для получения полной картины.
Основные категории метрик:
CesiumJS строится вокруг непрерывного цикла Scene,
поэтому любые задержки в одном из слоёв немедленно отражаются на
итоговом FPS.
Базовая метрика — частота кадров. В CesiumJS встроен механизм отображения FPS через сцену:
viewer.scene.debugShowFramesPerSecond = true;
При включении отображается не только FPS, но и усреднённое время кадра, что позволяет отличать кратковременные пики от устойчивых проблем.
Более детализированное измерение включает разбиение времени кадра:
update);render);Для глубокой диагностики используется
performance.now():
const start = performance.now();
viewer.render();
const end = performance.now();
console.log("Frame time:", end - start);
В высоконагруженных сценах с 3D Tiles важно учитывать не только среднее значение, но и 95-й перцентиль времени кадра, так как именно он определяет ощущаемую плавность.
Подсистема 3D Tiles является основным источником вариативности
производительности. Объекты Cesium3DTileset предоставляют
встроенные статистики:
const tileset = new Cesium.Cesium3DTileset({ url });
viewer.scene.primitives.add(tileset);
tileset.tileLoad.addEventListener(function(tile) {
console.log("Tile loaded:", tile);
});
Ключевые метрики:
Дополнительно используется:
viewer.scene.primitives.addEventListener("tileFailed", function(error) {
console.log(error);
});
Увеличение количества активных тайлов напрямую влияет на GPU fill rate и память текстур.
CesiumJS использует внутренний RequestScheduler, который
управляет параллелизмом сетевых запросов.
Основные параметры:
Наблюдение за сетевой активностью позволяет выявлять узкие места:
viewer.scene.requestRenderMode = true;
viewer.scene.maximumRenderTimeChange = 0;
При включении request-based режима можно фиксировать моменты, когда рендер инициируется исключительно загрузкой данных.
CesiumJS содержит набор встроенных debug-инструментов:
viewer.scene.debugShowCommands = true;
viewer.scene.debugShowFrustums = true;
viewer.scene.debugShowFramesPerSecond = true;
viewer.scene.debugShowDepthFrustum = true;
Эти режимы позволяют анализировать:
Дополнительно важен инструмент:
viewer.scene.globe.showWireframe = true;
Он помогает выявлять избыточную геометрию и проблемы с LOD.
Производительность GPU напрямую связана с количеством draw calls и размером буферов. В WebGL-контексте CesiumJS это выражается в следующих параметрах:
Для мониторинга WebGL используется браузерный Performance Panel, однако Cesium добавляет дополнительные индикаторы через статистику сцены:
console.log(viewer.scene.frameState);
Внутри frameState содержится информация:
Более точная диагностика достигается через стандартный Performance API:
performance.mark("cesium-start");
viewer.render();
performance.mark("cesium-end");
performance.measure("cesium-frame", "cesium-start", "cesium-end");
console.log(performance.getEntriesByName("cesium-frame"));
Это позволяет интегрировать CesiumJS в системные профилировщики Chrome DevTools и фиксировать регрессии между сборками.
CesiumJS активно использует WebGL ресурсы, которые не всегда отражаются в JS heap.
Основные зоны контроля:
VertexArray);Мониторинг JS памяти:
console.log(performance.memory);
Рост usedJSHeapSize при стабильной сцене указывает на
утечки в кэшировании тайлов или повторном создании сущностей.
Imagery layers и terrain влияют на ранний этап рендеринга сцены. Их загрузка конкурирует за сетевые ресурсы с 3D Tiles.
Метрики:
Оптимизационные признаки:
frameState является центральной структурой
диагностики:
viewer.scene.preRender.addEventListener(function(scene, time) {
const state = scene.frameState;
console.log(state.commandList.length);
});
Ключевые параметры:
commandList — набор draw calls;cullingVolume — активные ограничения видимости;passes — стадии рендеринга;tilesToRender — активные 3D Tiles.Рост commandList напрямую коррелирует с падением
FPS.
Режим управляемого рендера снижает нагрузку при статичных сценах:
viewer.scene.requestRenderMode = true;
viewer.scene.maximumRenderTimeChange = Infinity;
В этом режиме кадры отрисовываются только при изменении состояния сцены:
Помимо FPS важен анализ стабильности времени кадра:
Анализ jitter выполняется через распределение frame time:
const frameTimes = [];
viewer.scene.postRender.addEventListener(function() {
const now = performance.now();
frameTimes.push(now);
});
CesiumJS хорошо совместим с Chrome DevTools Performance tab:
Особенно важны long tasks (>50ms), которые блокируют render loop.
В высоконагруженных сценах используется стратегия деградации качества:
Пример управления LOD:
tileset.maximumScreenSpaceError = 8;
Меньшее значение увеличивает качество, но снижает производительность.
Для системного мониторинга формируются агрегированные показатели:
Эти метрики используются для построения профилей нагрузки и выявления деградации при изменении данных или камеры.