游戏引擎的线程模型

时间:2010-06-23 06:28:00

标签: c++ multithreading

我有兴趣在我的业余时间使用我正在研究的小型引擎,但我很好奇最好的approuch是什么。我很好奇推荐的物理线程与引擎其余部分同步的方法,类似于ThisGuy。我正在使用Bullet Physics SDK,它已经使用了他描述的数据复制方法,但我想知道,一旦子弹经过一次模拟,然后将数据同步回其他线程,不会导致像垂直同步,渲染线程,处理数据的一半突然开始使用更新和不同的信息集?

这是观众能够注意到的吗?如果某个类型的爆炸与要破坏的物体一起出现怎么办?

如果这是一个问题,那么解决它的最佳方法是什么?

锁定物理线程,这样它才能做任何事情,直到渲染线程(基本上每个其他线程)都经过它的帧?这似乎会浪费一些CPU时间。或者是三重缓冲区的优选方法,将物理数据复制到第二个位置,继续物理模拟,然后在准备好后将数据复制到渲染线程?

你们推荐什么方法?

1 个答案:

答案 0 :(得分:2)

最简单且最常用的变体是并行运行physical,render,ai,...线程,并在每个线程完成一个帧/时间步长后同步它们。 这不是最快的解决方案,而是问题最少的解决方案。 在运行时将数据写回渲染线程会导致大量同步问题(例如,您必须在更新时锁定每个向量/矩阵)。 为了使paralellisation有效,你必须尽量减少同步的数据量,例如只能将数据写入渲染线程,可以渲染。

如果不在每帧之后同步,你可能会得到效果,physic / ai使用所有cpu功率产生60fps,而渲染器只渲染10fps,这在大多数情况下不是,你想要的。

双缓冲也会提高性能,但您仍需要同步线程。问题是ai和物理或类似线程,因为它们可能需要修改相同的数据