Вопрос немного сложен, поскольку в настоящее время сформулирован потому, что он неоднозначен.Ответы могут быть связаны с игровыми циклами, архитектурой сетевого сервера, архитектурой сетевого клиента, игровой логикой и т. Д.
Но, игнорируя все это, я попытаюсь ответить на последний вопрос:
Являются ли «сердцебиения» лучшим методом для использования для нелинейных событий в движке, основанном на времени?
Некоторая форма «сердцебиения» - это самый низкий способ реализации системы, основанной на времени.Но я не могу сказать, что этого достаточно, не зная требований вашей конкретной системы или игры.
Построение сердцебиения
Как вы сказали, не имея возможностиполагаться на характер компьютерной системы в реальном времени (точное количество тактовых циклов в секунду, точное количество тактовых циклов каждой инструкции, только выполнение вашей программы, отсутствие аппаратных прерываний и т. д.), время для генерации этого тактового импульса может стать значительно большесложно.Вы также не можете полагаться на системные или аппаратные таймеры или команды «Thread Sleep» для реализации стабильного пульса. См. Эту статью о времени Win32 , если вы верите по-другому:)
В этой популярной статье вы можете ознакомиться с некоторыми идеями о том, как стать более гибкими, исделайте ваше сердце более стабильным.В статье рассказывается о создании временного «накопителя» и запуске функции обновления / обратного вызова, как только накопится достаточно времени.Речь идет об игровом цикле, запускающем обновления физики, но в конечном итоге игровое сердцебиение также должно исходить из игрового цикла.
Что делать с сердцебиением
Один разу вас стабильное сердцебиение, тогда реализация логики игры может стать утомительной.В такой игре, как Quake 1, работает нормально, когда для каждого объекта вызывается функция «думай» каждые 10 мс, но в более крупной игре с большим количеством объектов (например, MMO) она очень быстро становится неразрешимой.
Механизм более высокого уровня, который вы можете построить поверх этого, - это «таймер» или «секундомер», который вызывает настраиваемую функцию обратного вызова по таймеру после ее истечения или вызывает ее периодически (например, каждые 5 секунд).Таким образом, вы можете выполнять общую проверку времени («это уже 5 секунд?») И позволить игровой логике реализовывать только то, о чем она заботится.
Сетевое программирование
Сетевая игра, такая как MMO, будет более сложной, чем эта.Вы упомянули MMO, но не упомянули такие вещи, как задержка в сети, потери данных, проблемы синхронизации клиент / сервер и т. Д. Поэтому я не буду вдаваться в подробности.Это удобно, потому что адекватный ответ на эти вопросы, вероятно, заполнит большую статью, если не книгу.