代码之家  ›  专栏  ›  技术社区  ›  Tomas

游戏引擎的线程模型

  •  4
  • Tomas  · 技术社区  · 16 年前

    我对在业余时间使用的小型发动机很感兴趣,但我很好奇最好的方法是什么。我很好奇推荐的将物理线程与其他引擎同步的方法,类似于 ThisGuy . 我正在使用bullet physics sdk,它已经使用了他描述的数据复制方法,但是我想知道,一旦bullet通过一个模拟,然后将数据同步回其他线程,它是否会导致类似垂直同步的结果,在这种情况下,渲染线程在处理数据的一半过程中突然开始使用一个新的D不同的信息集?

    这是观众能注意到的吗?如果一个爆炸发生在一个要被摧毁的物体上怎么办?

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

    锁定物理线程,以便它在渲染线程(以及基本上所有其他线程)通过其帧之前无法执行任何操作?这似乎会浪费一些CPU时间。还是比三重缓冲更可取的方法,将物理数据复制到第二个位置,继续物理模拟,然后在数据准备好后将其复制到渲染线程?

    你们推荐什么方法?

    1 回复  |  直到 10 年前
        1
  •  2
  •   Florianx    16 年前

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

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

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