我正在尝试同步一对非 UI 线程,一个线程运行游戏逻辑,一个线程渲染,以便以逻辑和有效的顺序执行任务。我自己强加的一个约束是整个系统在无分配的稳定状态下运行,因此所有显示对象都被返回并“回收”,因此两个线程必须保持一种双向对话,当我调用'swapBuffers()' 方法。
在伪代码中,游戏线程中的事件顺序如下所示:
while(condition)
{
processUserInput();
runGameLogicCycle(set number of times);
waitForBuffersSwapped();
unloadRecycleBuffer(); //This function modifies one buffer
loadDisplayBuffer(); ///This function modifies another buffer
waitForRenderFinished();
renderThread.postTask(swapBuffersAndRender);
}
选择渲染线程来执行交换缓冲区的任务,以便游戏逻辑线程可以同时执行不修改缓冲区的任务。在我的代码中,我结合了交换缓冲区和渲染的任务,并将其定义为一个 Runnable 对象,该对象发布到渲染线程的处理程序。在伪代码中,该可运行文件如下所示:
{
//Swap the buffers
}
gameThread.notifyThatBuffersSwapped();
{
//Render items to screen
}
gameThread.notifyThatItemsRendered();
我的问题是实施问题。我熟悉处理程序、同步块和 ReentrantLocks 的概念。我知道 Lock.await() Lock.signal() 方法,但是当我试图了解它们在迭代循环中调用时的行为时,我发现文档不足。
如何实现 ReentrantLocks 以使两个线程以这种方式相互等待?如果可能,请在您的答案中包含一个实用的成语。