Это старый пост, но он все еще появляется, поэтому я хотел добавить свои 2 цента здесь.
Первый список данных, которые должны храниться в потоке пользовательского интерфейса / отображения, а не в логическом потоке. В потоке пользовательского интерфейса вы можете включить 3d-сетку, текстуры, информацию о свете и копию данных о положении / повороте / направлении.
В игровой логике вам может понадобиться размер игрового объекта в 3d, ограничивающие примитивы (сфера, куб), упрощенные данные трехмерной сетки (например, для подробных столкновений), все атрибуты, влияющие на движение / поведение, такие как скорость объекта, коэффициент поворота и т. Д., а также данные положения / вращения / направления.
Если вы сравните два списка, вы увидите, что только копия данных о положении / повороте / направлении должна быть передана из логики в поток пользовательского интерфейса. Вам также может понадобиться некоторый идентификатор корреляции, чтобы определить, к какому игровому объекту относятся эти данные.
Как вы это сделаете, зависит от того, на каком языке вы работаете. В Scala вы можете использовать Software Transactional Memory, в Java / C ++ - какую-то блокировку / синхронизацию. Мне нравятся неизменные данные, поэтому я склонен возвращать новый неизменный объект для каждого обновления. Это пустая трата памяти, но с современными компьютерами это не такая уж большая проблема. Тем не менее, если вы хотите заблокировать общие структуры данных, вы можете сделать это. Проверьте класс Exchanger в Java, использование двух или более буферов может ускорить процесс.
Прежде чем приступить к обмену данными между потоками, определите, сколько данных вам действительно нужно передать. Если у вас есть октри, разделяющее ваше трехмерное пространство, и вы можете видеть 5 игровых объектов из 10 объектов в целом, даже если вашей логике нужно обновить все 10, вам нужно перерисовать только те 5, которые вы видите. Дополнительную информацию можно найти в этом блоге:
http://gameprogrammingpatterns.com/game-loop.html
Речь идет не о синхронизации, а о том, как игровая логика отделена от отображения и какие задачи вам необходимо преодолеть (FPS). Надеюсь это поможет,
отметка