多线程游戏 - 更新,渲染以及如何拆分它们

Cod*_*nny 5 java performance multithreading

所以,我正在开发一款游戏引擎,并取得了不错的进步.但是,我的引擎是单线程的,将更新和渲染拆分为单独的线程的优点听起来是一个非常好的主意.

我该怎么做?单线程游戏引擎(概念上)非常容易制作,你有一个循环,你更新 - >渲染 - >睡眠 - >重复.但是,我想不出一个打破更新和渲染分离的好方法,特别是如果我改变他们的更新速率(比如我经历更新循环25x一秒,并且有60fps用于渲染) - 如果我开始中途更新怎么办?通过渲染循环,反之亦然?

Vic*_*kin 6

将更新逻辑放在某种Updater工作类(实现Runnable)中,并将渲染器放入单独的工作类中.当您需要更新数据时,让Updater将该更新放入Updater和Producer共享的队列中.最方便的是使用已经内置多线程支持的队列,比如子类BlockingQueue.例如代码,请参阅javadoc for BlockingQueue.

如果您需要渲染所有更改(甚至是过时的更改),则使用队列是很自然的.如果您只想渲染最新的更改,请使用ConcurrentHashMap而不是队列.

不要忘记使更新成为不可变对象,因此在渲染时更新可能无法更改.

正如Nirmal指出的那样,您可以使用某种线程池来限制线程数并简化线程的启动/停止.请参阅JDK中的Executor接口和Executors实用程序类以在此处查看可用选项.