我正在使用Android上的Java构建一个openGL ES 2游戏。
我目前有两个主题。 Android UI和openGL。
据我所知,为了获得最佳性能,我需要有另一个游戏逻辑线程,因此openGL线程可以尽可能快地呈现。
这将给我带来3. Android UI,openGL和Game Logic。 (我们称之为UI,OGL和GL。)
如果我错了,请纠正我:
UI启动,生成OGL和GL。 OGL和GL运行,查询UI输入。 GL将绘图调用发送到OGL中的队列。
这里有两种情况。 如果GL循环比OGL花费更长的时间,则下一个OGL循环需要等待GL完成才能开始下一个循环,以避免仅渲染最后一帧的一半调用。 如果OGL花费的时间比GL长,那么GL需要等到OGL完成再次启动/发送更多的绘制调用。
要做到这一点:
当GL完成它的循环时,它会检查OGL以查看它是否已完成绘制当前的绘制调用队列。如果是这样,它会启动GL和OGL的下一个循环。如果没有,它会等待。
当OGL完成时,它会检查GL。如果GL完成,则再次启动两个循环。如果没有,它等待GL,完成后将检查OGL,并再次启动。
对不起,如果这有点令人困惑的话......
要弄明白我的想法:
diagram http://img840.imageshack.us/img840/2816/stackoverflowthredpictu.jpg
澄清我的问题: - 用这种方式铺设工作吗? - 如果没有,哪种方法会更好?
- 我应该查看哪些特定主题才能完成此任务? - 我不知道如何制作线程或在它们之间发送信息。
这是我第一次在这里提问,希望我能正确地做到。 :) 谢谢!
答案 0 :(得分:0)
- 以这种方式铺设工作吗? - 如果没有,哪种方法会更好?
是的,但这种策略可能会造成比必要更复杂的情况。两个线程必须等待时才很容易死锁。
我认为您可以使用RENDERMODE_WHEN_DIRTY
:
setRenderMode(RENDERMODE_WHEN_DIRTY);
在该模式下,渲染器仅在(1)创建曲面或(2)调用requestRender()
时渲染帧。因此,您的游戏逻辑线程会调用queueEvent()
(或类似)将绘图调用推送到渲染器,然后在游戏逻辑循环结束时调用requestRender()
。
如果你仍然发现游戏逻辑线程需要等待渲染器完成,你可以在游戏逻辑线程中创建一个Semaphore
,它将阻止它直到渲染器发出信号(通过调用release()
在Semaphore
上,它已经完成渲染帧。
免责声明:我不是游戏开发者,但希望这能为您提供一些探索之路。