3

我正在构建一个 openGL ES 2 游戏,在 Android 上使用 Java。

我目前有两个线程。Android UI 和 openGL。

据我了解,为了获得最佳性能,我需要另外一个线程来处理游戏逻辑,这样openGL线程才能尽可能快地渲染。

这将给我留下 3。Android UI、openGL 和游戏逻辑。(我们称它们为 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,然后重新启动两者。

对不起,如果这有点令人困惑的措辞..

说明我的想法:

图 http://img840.imageshack.us/img840/2816/stackoverflowthredpictu.jpg

为了澄清我的问题:-以这种方式布置事情会奏效吗?——如果没有,什么会更好?

- 我应该查看哪些特定主题来完成此任务?--ie 我不知道如何创建线程或在它们之间发送信息。

这是我第一次在这里提问,希望我做的正确。:) 谢谢!

4

1 回答 1

0

- 这样布置会奏效吗?——如果没有,什么会更好?

是的,但是这种策略可能会产生不必要的复杂性。当两个线程必须相互等待时,很容易使它们死锁。

我想你可以使用RENDERMODE_WHEN_DIRTY

 setRenderMode(RENDERMODE_WHEN_DIRTY);

在该模式下,您的渲染器仅在 (1) 创建表面或 (2) 您调用requestRender(). 因此,您的游戏逻辑线程将调用queueEvent()(或类似的方法)将绘图调用推送到渲染器,然后requestRender()在游戏逻辑循环结束时调用。

如果您仍然发现游戏逻辑线程需要等待渲染器完成,您可以Semaphore在游戏逻辑线程中创建一个阻塞它,直到渲染器发出信号(通过调用release()Semaphore它已完成渲染帧。

免责声明:我不是游戏开发者,但希望这能给你一些探索的途径。

于 2012-11-03T23:50:25.257 回答