Контроль скорости воспроизведения

В основе временной модели CesiumJS лежит единая система управления временем, построенная вокруг объекта Clock. Этот механизм определяет, как сцена интерпретирует поток времени, как изменяется состояние анимации и с какой скоростью происходит перемещение динамических объектов.


Визуализация в CesiumJS часто опирается не на статичное изображение сцены, а на непрерывную симуляцию. Центральным элементом этой системы является Viewer.clock, представляющий собой экземпляр Clock.

Clock управляет тремя ключевыми сущностями:

  • текущим временем симуляции (currentTime)
  • направлением движения времени (clockStep)
  • скоростью изменения времени (multiplier)

Именно параметр multiplier является основным инструментом управления скоростью воспроизведения.


Параметр multiplier как регулятор скорости

Скорость воспроизведения задаётся через свойство:

viewer.clock.multiplier = 1.0;

Значение интерпретируется как коэффициент отношения к реальному времени:

  • 1.0 — нормальная скорость (1 секунда симуляции = 1 секунда реального времени)
  • 2.0 — ускорение в 2 раза
  • 10.0 — ускоренная симуляция
  • 0.5 — замедление
  • отрицательные значения — обратное воспроизведение

Изменение этого параметра мгновенно влияет на поведение всех тайм-динамических сущностей сцены, включая анимации CZML, перемещения камер и интерполяции позиций.


Обратное воспроизведение времени

Использование отрицательных значений multiplier переводит систему в режим обратного движения времени:

viewer.clock.multiplier = -5.0;

При этом необходимо учитывать состояние clockStep:

viewer.clock.clockStep = Cesium.ClockStep.SYSTEM_CLOCK_MULTIPLIER;

или

viewer.clock.clockStep = Cesium.ClockStep.TICK_DEPENDENT;

Режим обратного воспроизведения требует корректной настройки диапазона времени (clockRange), иначе симуляция может остановиться на границах интервала.


ClockStep и влияние на скорость

Скорость воспроизведения тесно связана с режимом шага времени:

  • SYSTEM_CLOCK_MULTIPLIER — скорость зависит от реального времени и multiplier
  • TICK_DEPENDENT — скорость определяется количеством тиков обновления сцены

При TICK_DEPENDENT значение multiplier фактически масштабирует количество виртуального времени за один кадр, что позволяет создавать более стабильные симуляции при нестабильном FPS.


ClockRange и ограничение воспроизведения

Контроль скорости невозможен без учета границ времени:

  • UNBOUNDED — бесконечное воспроизведение
  • CLAMPED — остановка на границах диапазона
  • LOOP_STOP — циклическое повторение
viewer.clock.clockRange = Cesium.ClockRange.LOOP_STOP;

При высоких значениях multiplier режим LOOP_STOP часто используется для непрерывных симуляций, например движения спутников или авиационных траекторий.


Управление воспроизведением через pause и start

Скорость воспроизведения может быть обнулена остановкой Clock:

viewer.clock.shouldAnimate = false;

и возобновлена:

viewer.clock.shouldAnimate = true;

Этот флаг не изменяет значение multiplier, но полностью блокирует обновление симуляции.


Практическая комбинация параметров

Типичная конфигурация управления скоростью включает синхронизацию нескольких параметров:

viewer.clock.startTime = Cesium.JulianDate.fromIso8601("2024-01-01T00:00:00Z");
viewer.clock.currentTime = Cesium.JulianDate.fromIso8601("2024-01-01T00:00:00Z");
viewer.clock.stopTime = Cesium.JulianDate.fromIso8601("2024-01-02T00:00:00Z");

viewer.clock.clockRange = Cesium.ClockRange.LOOP_STOP;
viewer.clock.multiplier = 60;
viewer.clock.shouldAnimate = true;

В данном случае одна секунда реального времени соответствует одной минуте симуляции.


Динамическое изменение скорости во время выполнения

Изменение скорости может происходить в реальном времени без перезапуска сцены:

function setSpeed(level) {
    switch (level) {
        case "slow":
            viewer.clock.multiplier = 0.2;
            break;
        case "normal":
            viewer.clock.multiplier = 1.0;
            break;
        case "fast":
            viewer.clock.multiplier = 20.0;
            break;
        case "reverse":
            viewer.clock.multiplier = -5.0;
            break;
    }
}

Такая схема применяется при создании интерфейсов управления симуляцией, где скорость должна изменяться мгновенно.


Влияние скорости на интерполяцию данных

При увеличении multiplier возрастает нагрузка на систему интерполяции временных рядов. CesiumJS автоматически адаптирует вычисление позиций объектов, но при экстремальных значениях возможны:

  • пропуски промежуточных состояний
  • снижение точности траекторий
  • скачкообразное движение при недостаточной частоте данных

Особенно это проявляется при визуализации CZML-пакетов с редкими ключевыми кадрами.


Связь скорости и обновления сцены

Каждый тик Clock инициирует пересчет сцены через Scene.render. При высоких значениях multiplier:

  • увеличивается количество вычислений позиции объектов
  • возрастает нагрузка на GPU при сложных шейдерах
  • усиливается влияние синхронизации с датасорсами

Поэтому управление скоростью часто сопровождается оптимизацией уровня детализации (LOD) и фильтрацией сущностей.


Ограничение максимальной скорости

Практически применяемая стратегия заключается в ограничении multiplier для предотвращения деградации производительности:

viewer.clock.multiplier = Math.min(requestedSpeed, 100);

При этом верхняя граница зависит от:

  • плотности объектов на сцене
  • частоты обновления данных
  • сложности визуализации
  • производительности GPU

Синхронизация скорости с пользовательским интерфейсом

В интерфейсах управления часто используется привязка к ползунку:

speedSlider.onin put = function () {
    const value = parseFloat(this.value);
    viewer.clock.multiplier = value;
};

Диапазон обычно строится логарифмически, чтобы обеспечить удобное управление как малыми, так и большими значениями.


Особенности работы с реальным временем

При необходимости синхронизации с системным временем используется:

viewer.clock.clockStep = Cesium.ClockStep.SYSTEM_CLOCK;
viewer.clock.multiplier = 1.0;

В таком режиме управление скоростью становится ограниченным, так как Clock следует реальному времени, а не симуляционному шагу.


Адаптивное управление скоростью

В сложных приложениях скорость может автоматически изменяться в зависимости от нагрузки:

  • снижение multiplier при падении FPS
  • увеличение при простых сценах
  • динамическая корректировка при загрузке тайлов

Такая стратегия позволяет поддерживать стабильную визуализацию без ручного вмешательства.


Взаимодействие с анимациями и интерполяцией камеры

Изменение скорости напрямую влияет на:

  • перемещение камеры по пути (CameraFlyTo, CameraLookAt)
  • анимации сущностей (Entity availability)
  • временные интерполяции позиций

При резком изменении multiplier возможны скачки камеры, если анимация не привязана к фиксированному времени выполнения, а зависит от clock tick.