如何在多线程游戏引擎中同步世界数据?

5
我正在尝试为我想写的游戏创建一个简单的多线程游戏引擎。到目前为止,一切都没有问题,我甚至知道完成它所需的步骤。
唯一我不知道的事情是(从技术上讲,我知道解决方案,但我希望有更优雅、更快的方法):基本上,我的引擎的每个部分 - 图形、输入、物理、音频等都有一个独立的线程。
物理线程具有完整的世界场景节点结构,用于模拟所有内容。然而,现在我必须将这个结构传递给我的图形线程,并尽可能地减少开销。理想情况下,它应该只传输自上次更新以来发生变化的部分。
我已经准备好了传输这些数据的组件,唯一的问题就是生成它。
到目前为止,我想到了两种不同的方法:
1.每次更新都复制整个结构-非常简单,但可能会占用大量时间和内存(我没有使用大型引擎的经验-这样做可行吗?)
2.通过标记场景节点来跟踪场景的哪些部分发生了变化,然后仅复制更改的部分。
方法一会复制大量的内存,但没有太多的处理能力,方法二则相反:有足够的处理能力,复制的内存较少。
在典型的游戏环境中,哪种方法会更快呢?
1个回答

4
没有一个被广泛接受的通用答案,这是游戏开发中当前的研究领域。
我的建议是遵循传统智慧-选择哪种方法取决于你特定的用例-如果你的游戏有大量数据(即它非常占用内存,像大多数大片游戏),你可能只想传输更改。如果你的游戏不占用内存(例如街机游戏),你可能可以复制整个对象。
我建议实现两种方法,并连接性能计时器以查看哪种方法适合您;可以实现一种架构,可以在两种方法之间透明地处理。

一些理论:DDR2-1066 RAM的峰值传输速率为8533 MB/s,我希望每秒至少有100次更新,因此,一个更新必须小于85 MB。如果使用32位整数作为ID,则一个物理节点至少需要32字节(28个用于位置和方向,至少4个用于唯一ID)。假设有10,000个对象,这意味着每次更新需要复制312.5 kB(最大值的0.3%)。但是,这不包括节点层次结构的开销。应该很容易实现。 - Mononofu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接