【问题标题】:Separate logic and rendering threads?分离逻辑和渲染线程?
【发布时间】:2014-04-30 06:51:29
【问题描述】:

我听到有人建议在制作游戏时将逻辑和渲染分离到不同的线程中。显然,虽然渲染需要以 ~60fps 的速度进行,但逻辑可能只需要以 ~10fps 的速度进行。

我对此有几个问题:

  1. 如果逻辑改变了场景,渲染怎么能比逻辑快?渲染线程肯定会重复绘制完全相同的图像,直到逻辑启动以在屏幕上移动实体等?

  2. 这会不会造成各种令人讨厌的并发问题,因为逻辑和渲染可能需要同时访问游戏对象?

  3. 我可以假设将我的逻辑和渲染保持在同一个线程中是完全可以接受的吗?我正在使用 LWJGL,其教程似乎都建议了一个常见的“游戏循环”,其中包括逻辑和渲染。

【问题讨论】:

    标签: java multithreading logic rendering lwjgl


    【解决方案1】:
    1. 如果你的游戏逻辑没有改变场景,你的渲染线程可以通过给场景一个dirty flag来检测这个。如果场景不脏,渲染线程可能会再次返回旧的渲染场景。有时,即使游戏因为草、树或旗帜等动画对象什么也没做,场景也会发生变化。

    2. 这是因为两个线程确实访问了相同的数据。但是,如果游戏逻辑线程在本地处理对象的垃圾并以原子方式更新这些块,则在处理该数据时应该减少对相同数据的并发访问。我想说的是,不要以细粒度的方式处理并发访问的数据,而是以粗粒度的方式来减少锁定。

    3. 在我看来,如果不需要,您永远不应该过度复杂化设计。如果你有足够的时间在一秒钟内处理场景 10 次并绘制它,那么你不应该使用多个线程。所有较旧的游戏都使用了一个线程并且可以正常工作。一旦您的游戏变得越来越复杂并且一个线程无法在 1 / 60 秒内完成所有工作,您可能希望使用多个线程来利用多核机器。但是你应该等到需要的时候,再引入许多线程。

    【讨论】:

    • 感谢您非常详细的回答。由于我的游戏非常简单,我想我会只保留一个线程。此外,我希望实体以 60fps 的速度移动,因为我一直发现它看起来更流畅。如果需要,我想我可以单独处理碰撞。
    【解决方案2】:
    1. 精灵可以通过一系列帧进行动画处理,但可能不需要游戏逻辑(碰撞检测、移动等)。

    2. 您将需要使用某种形式的同步或锁定。

    3. 这取决于渲染和逻辑代码部分的工作量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-07
      • 1970-01-01
      • 2015-07-16
      • 2015-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多