Как синхронизировать данные о мире в многопоточном игровом движке? - PullRequest
5 голосов
/ 18 апреля 2009

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

Есть только одна вещь, которую я не знаю (ну, технически, я знаю решение для нее, но я надеюсь, что есть что-то более элегантное и более быстрое): в основном, у меня есть отдельная нить для каждой части мой движок - графика, ввод, физика, аудио и т. д.

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

У меня есть компоненты для передачи этих данных, только проблема заключается в их генерации.

До сих пор я думал о двух разных подходах:

  • копировать всю структуру для каждого обновления - очень просто, но, возможно, время и память увеличиваются (у меня нет опыта работы с большими движками - это будет жизнеспособно?)
  • Отслеживайте, какие части сцены были изменены, помечая узлы сцены некоторыми флагами, а затем копируя только измененные части

При первом подходе будет скопирован большой объем памяти, но без большой вычислительной мощности, при втором подходе будет наоборот: много вычислительной мощности, меньше копируемой памяти.

Есть ли общий ответ, какой подход был бы быстрее в типичной игровой среде?

1 Ответ

4 голосов
/ 18 апреля 2009

Нет, нет общепринятого общего ответа, это актуальная область исследований в области разработки игр.

Мои 2 цента - это общепринятое мнение - какой из них использовать, действительно зависит от вашего конкретного случая использования - если ваша игра содержит много данных (то есть, она очень интенсивно использует память, как и большинство названий блокбастеров), вы, вероятно, захотите просто передать изменения. Если ваша игра не требует большого объема памяти (например, аркадных игр), вы, вероятно, можете копировать весь объект.

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

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