Как классические боковые скроллеры реализовали синхронизированные события и триггеры анимации? - PullRequest
6 голосов
/ 13 ноября 2010

Я всегда был поражен серией Super Mario на Snes. Я думаю, что это было в основном сделано в сборке Z80. Но так как не было часов реального времени, как они справились со всеми этими синхронизированными событиями со сборкой и без часов реального времени?

Спасибо

Ответы [ 4 ]

5 голосов
/ 13 ноября 2010

Важно помнить о скорости VSync.Вот как часто электронная пушка в телевизоре (или аналог в современных телевизорах) заканчивает рисовать экран и медленно продвигается к верхней части экрана.

Поскольку это происходит с постоянной скоростью (60раз в секунду в NTSC, 50 в PAL), большинство игр используют это в качестве таймера, с кодом, который примерно эквивалентен этому:

void main() {
    while(true) {
        updateGame();
        updateSprites();
        waitForVSync();
    }
}

Очевидно, что это существенно упрощено, но это то, что происходит.Некоторые игры были настолько сложными, что заняли слишком много времени и пропустили период VSync.В этом случае они будут ждать второй VSync и, следовательно, будут работать со скоростью 30 (/ 25) FPS.

Иногда вы заметите замедление в играх NES (например).Это когда рабочая нагрузка настолько велика, что в одном кадре пропускается несколько периодов VSync.

Но да, в этом суть того, как работает синхронизация на старых консолях (На самом деле, даже на многих новых консолях и ПКигры используют ту же систему, а не только старые консоли!)

2 голосов
/ 13 ноября 2010

Игры, тогда, как и сейчас, обычно запускают цикл с фиксированным временным шагом (см. Ответ Майка Каронса). Первоначально это было главным образом для удобства; Ваш рендеринг был синхронизирован с частотой обновления дисплея, чтобы избежать разрывов, может также выполняться вся временная обработка один раз за кадр.

В настоящее время большинство игр все еще продвигают время дискретными шагами, которые кратны некоторой базовой скорости, обычно 50/60 Гц или что-то вроде 100 Гц - в некоторых играх по-прежнему используется синхронизация на основе VSync, но большинство просто используют обычные таймеры сейчас. В настоящее время мы используем фиксированные временные шаги по несколько иным причинам: во-первых, в играх обычно выполняется какое-то физическое моделирование, и очень трудно получить физическое моделирование со стабильными переменными временными шагами - особенно в приложениях реального времени, таких как игры, где вы не может легко использовать больше вычислительной мощности, используя более точные методы интеграции и тому подобное. Во-вторых, если у вас есть любой сетевой режим многопользовательской игры, вы должны убедиться, что игра синхронизирована для всех игроков. Это почти невозможно управлять (и отлаживать), если все работают по разному таймеру и обрабатывают события с разной скоростью. Принуждение всех к использованию общего временного шага облегчает решение проблемы на несколько порядков, потому что можно смело предположить, что два игрока, начинающих в одинаковом состоянии и получающих одинаковый ввод, все равно будут находиться в одинаковом состоянии через 5 секунд, даже если игроки смотрят на разные вещи или имеют разные машины, все из которых влияют на фактическую частоту кадров, на которой работает игра (и, следовательно, также на скорость, с которой игра может обрабатывать события).

2 голосов
/ 13 ноября 2010

Очень распространенная техника, используемая на старом оборудовании, заключалась в том, чтобы полагаться на то же оборудование синхронизации, которое использовалось для отображения графики. Старое оборудование буквально выводило данные из своего графического порта (композитное видео, или чаще RF), считывая значение пикселя из памяти и выводя его на порт вместе с некоторыми «синхронизирующими» сигналами, чтобы управлять сканирующей электронной пушкой в телевидение.

Приятным моментом является то, что сигнал вертикальной синхронизации, который заставляет пистолет поворачиваться от нижней части экрана к верхней части, обычно подключается к аппаратному прерыванию на процессоре консоли, и в этот самый момент, это происходит ровно 29,97 раза в секунду (почти 30 кадров в секунду) в момент, когда никакие данные не передаются по видео вообще, поскольку требуется некоторое время, чтобы луч «вылетел» обратно в верхнюю часть экрана. Изменения, внесенные в видеопамять в это время, будут без мерцания!

0 голосов
/ 13 ноября 2010

Z80 поддерживает несколько аппаратных прерываний - возможно, одно из них было подключено к периодическому таймеру (например, каждые 10 мс). У некоторых ранних игровых приставок было время, связанное с обновлением телевизионного сканирования, так что это могло быть подключено. Я не знаю SNES, поэтому я размышляю, основываясь на том, как работали другие современные системы.

Википедия говорит, что SNES была 16-битной системой, поэтому это не был Z80, который является 8-битным. На самом деле он говорит, что это был 65c816

http://en.wikipedia.org/wiki/Super_Nintendo_Entertainment_System

(приведенная выше ссылка говорит о прерываниях синхронизации видео, поэтому я, вероятно, на правильных линиях, если вы правы относительно часов реального времени)

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