2012-10-28 36 views
3

我正在构建一个openGL ES 2游戏,在Android上使用Java。3 Android线程,如何构造

我目前有两个线程。 Android用户界面和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,然后再次启动。

很抱歉,如果这是一个有点混淆的措辞..

要illistrate我的想法:

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

为了澄清我的问题: - 将会铺设的事情了这样的工作? - 如果不是,哪个更好?

- 什么具体科目我应该看看做到这一点?我不知道如何在它们之间创建线程或发送信息。

这是我第一次在这里问一个问题,希望我做对了。 :) 谢谢!

+1

我对OpenGL并不熟悉,但对于Android上的一般多线程,最好避免使用'AsyncTask',并使用标准Java'Runnable'与Android'Handler'。 –

回答

0

将这样铺设的东西工作吗? - 如果不是,那会更好吗?

是的,但是这种策略可能会造成比必要的更多的复杂性。当两个线程必须等待另一个线程时,很容易死锁。

我想你可以使用RENDERMODE_WHEN_DIRTY

setRenderMode(RENDERMODE_WHEN_DIRTY); 

在这种模式下,渲染器将渲染只有当(1)创建面或(2)你叫requestRender()框架。所以,你的游戏逻辑线程会调用queueEvent()(或类似的)将绘图调用推送给渲染器,然后在游戏逻辑循环结束时调用requestRender()

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

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