所以,我正在开发一个游戏引擎,并且已经取得了很好的进展。然而,我的引擎是单线程的,将更新和渲染分成单独的线程的优点听起来是一个非常好的主意。
我该怎么做?单线程游戏引擎(概念上)非常容易制作,你有一个更新->渲染->睡眠->重复的循环。但是,我想不出一种将更新和渲染分开的好方法,特别是如果我更改它们的更新速率(假设我每秒执行 25 次更新循环,并且渲染速度为 60 fps) - 如果我中途开始更新怎么办通过渲染循环,或者反之亦然?
将您的更新逻辑放在某种Updater
工人阶级(实施Runnable
),并将渲染器放入单独的工作类中。当需要更新数据时,让Updater将该更新放入Updater和Producer共享的队列中。最方便的是使用已经具有内置多线程支持的队列,例如BlockingQueue
。示例代码请参见 javadocBlockingQueue
.
如果您需要渲染所有更改,甚至是过时的更改,那么使用队列是很自然的。如果您只想渲染最新的更改,请使用ConcurrentHashMap
而不是队列。
不要忘记使更新成为不可变对象,这样更新在渲染时就不可能更改。
正如 Nirmal 指出的,您可以使用某种线程池来限制线程数量并简化线程的启动/停止。参考Executor
接口和Executors
JDK 中的实用程序类可在此处查看可用选项。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)