Чёрный Думер wrote:
Зато она куда более простая, переносимая между WAD / GIF / APNG и, что самое важное, не требующая изменений в карте если вдруг понадобилось изменить скорость анимации.
Они одинаково простые. Но время лучше.
ar888 wrote:
Нет, я давно его не смотрел. Да и с чего там по-другому должно быть? Мы же Сменой текстуры запускаем анимацию сначала.
Не совсем тоже самое. Но может стать лучше при плохой связи.
В мастере когда пришел пакет к клиенту - тогда и смена анимации (и не важно что оно пришло через 10 секунд после нажатия кнопки и лага в сети!).
В рендерах эти 10 секунд автоматически промотаются. При серьёзных проблемах с сетью у всех анимация будет примерно одинаково идти.
При хорошей синхронизации игрового времени (сейчас не очень хорошая) отставания будут меньше тика.
Чёрный Думер wrote:
А как сервер тогда вообще кадры считает чтобы их у игроков синхронизировать? Разве нельзя просто текущий счётчик времени нацело поделить на дельту и получить текущий номер кадра рендерера, из которого взятием остатка уже получить номер кадра анимации?
Никак не считает. Буквально.
Он просто запоминает время когда анимация началась и раздает её клиентам когда надо. И нигде ничего не считает сам.
Дальше клиент(рендер) сам разбирается какой ему кадр нужен и как его рисовать. Выбирает кадр примерно так как ты описал.
Упрощённо для зацикленных анимаций:
frame = (current_time - panel[id].animation_start_time) / animation_fps % total_frames
current_time постоянно синхронизируется с сервером.
panel[id].animation_start_time получается клиентом при входе на сервер или когда используется триггер "Сменить текстуру".
animation_fps и
total_frames берутся из файла текстуры, сервер их не знает так как не умеет загружать текстуры.
А еще пакет аж на 1 байт меньше.
Новый (renders_updated) шлёт 4-байтовое абсолютное время.
А старый (master) слал 4-байт номер кадра + 1-байт delay counter (тиков относительно начала кадра N). Подфиксить лаг проблематичнее не имея абсолютного времени.
В общем одни плюсы от использования времени. Нет причин не использовать его.