Нет линейных событий в движке, основанном на времени - PullRequest
0 голосов
/ 14 августа 2011

В простых «пошаговых» графических движках движение объекта напрямую связано с частотой кадров. Это было хорошо в 1980-х, когда аппаратное обеспечение было идентичным.

В течение многих лет двигатели были «основаны на времени» с d = s / t. Это означает, что объекту потребуется от А до В одно и то же время, независимо от частоты кадров или мощности компьютера.

Если все основано на времени, как мы можем выполнять такие действия, как очки жизни персонажей, уменьшающиеся на x при попадании NPC? «Удар» может производиться каждые 5 секунд.

Насколько я могу судить, эта 5-секундная задержка называется «сердцебиение». Многие ММО используют подобное сердцебиение, которое является глобальным для множества действий.

Являются ли «сердцебиения» лучшим методом для использования при отсутствии линейных событий в движке, основанном на времени?

UPDATE:

Спасибо за ваш подробный ответ. Я постараюсь уточнить, если это возможно. Я пытаюсь решить, какие параметры использовать для сервера MMO для внутреннего моделирования мира, которым он управляет.

Как я понимаю, в системе есть 3 основных "стимула", которые вызывают изменения объектов: ПРИМЕЧАНИЕ , они являются внутренними только для Сервера.

  1. Линейные интегрированные операции. Это делается внутри игрового цикла. Например перемещение NPC от А до Б.

  2. Клиентские события. Это происходит в на первый взгляд случайные моменты, когда речь идет о сервере. Например, пользователь нажимает огонь.

  3. В зависимости от времени. Это происходит с интервалами сердцебиения. Например, проверьте на наличие неработающих NPC и дайте им что-нибудь сделать.

Шаг 3 - это тот, с которым я борюсь и ищу разъяснения относительно правильности этого метода. Я надеюсь, что это проясняет мой вопрос.

1 Ответ

1 голос
/ 16 августа 2011

Вопрос немного сложен, поскольку в настоящее время сформулирован потому, что он неоднозначен.Ответы могут быть связаны с игровыми циклами, архитектурой сетевого сервера, архитектурой сетевого клиента, игровой логикой и т. Д.

Но, игнорируя все это, я попытаюсь ответить на последний вопрос:

Являются ли «сердцебиения» лучшим методом для использования для нелинейных событий в движке, основанном на времени?

Некоторая форма «сердцебиения» - это самый низкий способ реализации системы, основанной на времени.Но я не могу сказать, что этого достаточно, не зная требований вашей конкретной системы или игры.

Построение сердцебиения

Как вы сказали, не имея возможностиполагаться на характер компьютерной системы в реальном времени (точное количество тактовых циклов в секунду, точное количество тактовых циклов каждой инструкции, только выполнение вашей программы, отсутствие аппаратных прерываний и т. д.), время для генерации этого тактового импульса может стать значительно большесложно.Вы также не можете полагаться на системные или аппаратные таймеры или команды «Thread Sleep» для реализации стабильного пульса. См. Эту статью о времени Win32 , если вы верите по-другому:)

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

Что делать с сердцебиением

Один разу вас стабильное сердцебиение, тогда реализация логики игры может стать утомительной.В такой игре, как Quake 1, работает нормально, когда для каждого объекта вызывается функция «думай» каждые 10 мс, но в более крупной игре с большим количеством объектов (например, MMO) она очень быстро становится неразрешимой.

Механизм более высокого уровня, который вы можете построить поверх этого, - это «таймер» или «секундомер», который вызывает настраиваемую функцию обратного вызова по таймеру после ее истечения или вызывает ее периодически (например, каждые 5 секунд).Таким образом, вы можете выполнять общую проверку времени («это уже 5 секунд?») И позволить игровой логике реализовывать только то, о чем она заботится.

Сетевое программирование

Сетевая игра, такая как MMO, будет более сложной, чем эта.Вы упомянули MMO, но не упомянули такие вещи, как задержка в сети, потери данных, проблемы синхронизации клиент / сервер и т. Д. Поэтому я не буду вдаваться в подробности.Это удобно, потому что адекватный ответ на эти вопросы, вероятно, заполнит большую статью, если не книгу.

...