3个Android线程,如何构建结构

3

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

当前我有两个线程,一个是Android UI,另一个是OpenGL。

据我所知,为了获得最佳性能,我需要再加一个线程来处理游戏逻辑,以便OpenGL线程可以尽可能快地进行渲染。

这将使我拥有三个线程,分别为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,当GL完成时将检查OGL,并重新开始两个循环。
抱歉如果措辞有点混乱。
为了说明我的想法: diagram http://img840.imageshack.us/img840/2816/stackoverflowthredpictu.jpg 为了澄清我的问题: -这样布局会起作用吗? --如果不行,有什么更好的方法?
-我应该查找哪些具体的主题来实现这一点? --例如,我不知道如何创建线程或在它们之间发送信息。
这是我第一次在这里提问,希望我做得正确。 :) 谢谢!

1
我不熟悉OpenGL,但是对于Android上的一般多线程处理,最好避免使用AsyncTask,而是使用标准的Java Runnable结合Android的Handler - Todd Sjolander
1个回答

0
-这样布局会有效吗?--如果不行,有什么更好的方法?
是的,但这种策略可能会比必要的复杂。当两个线程必须互相等待时,很容易出现死锁。
我认为你可以使用RENDERMODE_WHEN_DIRTY
 setRenderMode(RENDERMODE_WHEN_DIRTY);

在这种模式下,您的渲染器只有在(1)创建表面或(2)调用requestRender()时才会渲染帧。因此,您的游戏逻辑线程将调用queueEvent()(或类似方法)将绘图调用推送到渲染器,然后在游戏逻辑循环结束时调用requestRender()
如果您仍然发现游戏逻辑线程需要等待渲染器完成,则可以在游戏逻辑线程中创建一个Semaphore,该信号量将阻止它,直到渲染器通过在Semaphore上调用release()来发出信号,表示已完成渲染帧。
免责声明:我不是游戏开发人员,但希望这能为您提供一些探索的方向。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接