我听过有人建议在制作游戏时将逻辑分离并渲染成不同的线程。显然,虽然渲染需要在~60fps时发生,但逻辑可能只需要在~10fps时发生。
我对此有几个问题:
如果逻辑改变了场景,渲染如何比逻辑更快?当然渲染线程将重复绘制完全相同的图像,直到逻辑开始在屏幕上移动实体等等?
这不会产生各种令人讨厌的并发问题,因为逻辑和渲染可能需要同时访问游戏的对象吗?
我可以假设将逻辑和渲染保持在同一个线程中是完全可以接受的吗?我正在使用LWJGL,其教程似乎都暗示了一个包含逻辑和渲染的常见“游戏循环”。
答案 0 :(得分:2)
如果你的游戏逻辑没有改变场景,你的渲染线程可以通过给场景dirty flag
来检测这个。如果场景不脏,则渲染线程可以再次返回旧的渲染场景。有时,即使游戏由于草,树或旗帜等动画物品而无效,场景也会发生变化。
这将发生,因为两个线程确实访问相同的数据。但是如果游戏逻辑线程在本地处理对象的堆并且以原子方式更新这些块,则在处理该数据时应该减少对相同数据的并发访问。我想说的是,不要以细粒度的方式处理同时访问的数据,而是以粗粒度的方式来减少锁定。
在我看来,如果不需要,你不应该过度复杂化设计。如果你有足够的时间在一秒钟内处理场景10次并绘制它,那么你不应该使用多个线程。所有较旧的游戏都是一个线程,它工作。一旦你的游戏变得越来越复杂并且一个线程无法在1/60秒内完成所有的操作,你可能想要使用多个线程来利用多核机器。但是在引入许多线程之前,你应该等到需要。
答案 1 :(得分:1)
精灵可以通过一系列帧动画,但不需要游戏逻辑(崩溃检测,移动等)。
您需要使用某种形式的同步或锁定。
这取决于渲染和逻辑代码部分的工作量。