К содержимому
Детерминизм
На этой странице

Детерминизм

Почему уровень с тем же сидом играется одинаково на любом устройстве, как устроена случайность и что это даёт

Уровень - функция времени

Уровень собирается на таймлайне. Каждый объект живёт на отрезке кадров и движется по ключам

Уровень не читает ваши действия. Поэтому кадр 1200 выглядит одинаково, живы вы, мертвы, в рывке или за вас играет бот

Влияние идёт в одну сторону. Уровень может менять размер аватара, замедлять его, забирать управление или выключать столкновения. Обратного канала от аватара к уровню нет

Триггеров нет. Разработчики обсуждают их для будущих версий, но ничего не решено

Уровень идёт по реальному времени. Частота кадров задаёт только то, как часто перерисовывается экран. Один и тот же забег идёт одинаково и на 30, и на 144 кадрах в секунду

Сид

Сид берётся из первого места, где он задан:

  1. Сид игрока на экране уровня (Случайно выбирает новый, Очистить убирает)
  2. собственный сид уровня, заданный автором
  3. новый сид на этот забег

0 значит "не задан". Поэтому обычный уровень берёт новый сид при каждой загрузке

Окно результата показывает сид забега, а рекорд его хранит. Так удачный забег можно повторить

Как устроена случайность

Случайное значение в уровне не берётся из генератора, который помнит своё состояние. Оно вычисляется по своему адресу:

Hash(seed, keyframe frame, layer, start frame, track, channel)

Один и тот же адрес всегда даёт одно и то же число. На любом устройстве и в любом порядке вычислений. Каждая часть адреса - то, что редактирует автор. Поэтому та же раскладка повторяет тот же забег

Что это даёт

  • Warm-бот рассчитывает маршрут через весь уровень до начала забега. Это возможно, потому что сыграется ровно тот уровень, под который он планировал
  • Reflex-бот строит кадры впереди текущего и уворачивается по ним
  • Отмотка к контрольной точке заново строит нужный кадр, а не отменяет что-либо
  • Редактор строит любой кадр с нуля, поэтому перемотка мгновенная
  • Рекорды и статистика значат одно и то же на любом устройстве

Известные ограничения

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

  • два препятствия задели аватара в одном кадре. Какое из них задаёт направление отбрасывания, может отличаться между забегами
  • часы аватара не сбрасываются при старте уровня. Рывок может длиться на кадр дольше или короче, смотря сколько грузился уровень

Повтор одного и того же забега бота на одной сборке совпал при замере до последней цифры. Значит, эти дефекты срабатывают не на каждом уровне. Из-за них забег воспроизводим на практике, но не гарантированно