我正在构建一个OpenGL ES 2游戏,在Android上使用Java。
我现在有两个线程。android用户界面和opengl。
据我所知,为了获得最佳性能,我需要有另一个用于游戏逻辑的线程,这样opengl线程就可以尽可能快地呈现。
我只剩下3个了。android用户界面、opengl和游戏逻辑。(我们称它们为ui、ogl和gl。)
如果我错了,请纠正我:
ui启动,生成ogl和gl。
ogl和gl运行,查询ui以获取输入。
gl向ogl中的队列发送draw调用。
这里有两个案子。
如果gl的循环时间比ogl长,则ogl的下一个循环需要等待gl完成,然后才开始下一个循环,以免只呈现上一帧的一半调用。
如果ogl需要比gl更长的时间,gl需要等到ogl完成才能再次启动/发送更多的draw调用。
要做到这一点:
当gl完成循环时,它会检查ogl是否完成绘制当前的draw调用队列。如果是,它将启动gl和ogl的下一个循环。如果没有,它会等待。
当ogl完成时,它检查gl。如果gl完成,它将再次启动两个循环。如果没有,它将等待gl,完成后将检查ogl,并再次启动两者。
抱歉,如果这是一个有点混乱的措辞..
我的想法:
diagram http://img840.imageshack.us/img840/2816/stackoverflowthredpictu.jpg
为了澄清我的问题:
-这样安排行吗?
--如果没有,还有什么更好的呢?
-我应该找哪些具体的科目来完成这项工作?
--我不知道如何在它们之间编线或发送信息。
这是我第一次在这里提问,希望我做得对。:)
谢谢!

最佳答案

-这样安排行吗?--如果没有,还有什么更好的呢?
是的,但这种策略可能会造成比必要的更复杂的情况。当两个线程必须彼此等待时,它们很容易死锁。
我想你可以用RENDERMODE_WHEN_DIRTY

 setRenderMode(RENDERMODE_WHEN_DIRTY);

在该模式下,渲染器将仅在(1)创建曲面或(2)调用requestRender()时渲染帧。因此,您的游戏逻辑线程将调用queueEvent()(或类似)将绘图调用推送到渲染器,然后在游戏逻辑循环的末尾调用requestRender()
如果您仍然发现游戏逻辑线程需要等待渲染器完成,您可以在游戏逻辑线程中创建一个Semaphore来阻止它,直到渲染器发出信号(通过在release()上调用Semaphore)它完成帧的渲染。
免责声明:我不是一个游戏开发商,但希望这能给你一些探索的途径。

07-25 23:21