这是旧帖子,但仍然弹出,因此想在这里加2美分。
应该存储在UI /显示线程与逻辑线程中的第一列表数据。在UI线程中,您可能包括3d网格,纹理,光照信息以及位置/旋转/方向数据的副本。
在游戏逻辑线程中,您可能需要3d中的游戏对象大小,边界图元(球形,立方体),简化的3d网格数据(例如,用于详细的碰撞),所有影响运动/行为的属性,例如对象速度,转弯比率等,以及位置/旋转/方向数据。
如果比较两个列表,可以看到仅需要将位置/旋转/方向数据的副本从逻辑传递到UI线程。您可能还需要某种相关ID,才能确定该数据属于哪个游戏对象。
您的操作方式取决于您使用的语言。在Scala中,您可以使用软件事务存储,而在Java / C ++中,则可以使用某种锁定/同步。我喜欢不可变数据,因此我倾向于每次更新都返回新的不可变对象。这有点内存浪费,但是对于现代计算机而言,这并不是什么大问题。不过,如果您想锁定共享数据结构,则可以执行此操作。在Java中签出Exchanger类,使用两个或多个缓冲区可以加快处理速度。
在开始在线程之间共享数据之前,请计算出实际需要传递多少数据。如果您有一个八叉树来划分您的3d空间,并且您可以看到总共10个对象中的5个游戏对象,即使您的逻辑需要更新所有10个对象,您也只需重绘所看到的5个对象。欲了解更多信息,请查看此博客:http :
//gameprogrammingpatterns.com/game-loop.html
这与同步无关,但它确实显示了游戏逻辑与显示的分离方式以及需要克服的挑战(FPS)。希望这可以帮助,
标记