c – 游戏引擎的线程模型

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

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

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

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

你们推荐什么方法?

最佳答案 最简单且可能最常用的变体是并行运行physical,render,ai,…线程,并在每个线程完成一个帧/时间步长后同步它们.

这不是最快的解决方案,而是问题最少的解决方案.

在运行时将数据写回渲染线程会导致大量同步问题(例如,您必须在更新时锁定每个向量/矩阵).

为了使paralellisation有效,你必须尽量减少同步的数据量,例如只能将数据写入渲染线程,可以渲染.

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

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

点赞