我想在android中使用opengl编写一些简单的游戏,但立即遇到了主游戏循环的麻烦。当我在这里阅读:http://developer.android.com/resources/tutorials/opengl/opengl-es10.html每次需要重绘表面时,应用程序都会调用public void onDrawFrame(GL10 gl)
。或者像那样行事。我的问题是 - 如何创建一个独立于绘制调用的更新循环。我的意思是 - 它不能像那样工作,只有当设备(应用程序?)想重新绘制表面(或者我错了?)时,我才能更新游戏逻辑。如何用android opengl适当地创建更新/绘制循环?
经过一些谷歌搜索后,我得出了一个结论,我必须为更新循环创建另一个线程。但后来我遇到了另一个问题 - 一个线程负责绘制图形,另一个线程负责更新游戏逻辑,我不知道如何让它们合作。首先,他们是两个独立的类(至少在我的实现中),所以他们不能使用相同的游戏变量和对象(精灵,定时器,不同的变量,计数器等......几乎这两个类需要做的一切他们的工作)。现在我想我可以把它们都装进一个班级。但是 - 第二,我需要以某种方式同步这两个线程。
最后,我来到了这个总体思路:
- 3类:
public class MyRenderer implements GLSurfaceView.Renderer
与onSurfaceCreated()
方法以绘制public class UpdateThread implements Runnable
与run()
和update()
方法的照顾。run()
正在调用update()
方法每秒精确60次(我想要一个固定的步进循环)public class SpritesHolder
用作所有游戏对象/变量/东西(如精灵,定时器,状态变量等)的容器...)所有的领域都是公开的。
- 所以基本上
SpritesHolder
类是抱着箱子所有需要的变量在一个地方,所以MyRenderer
和UpdateThread
类可以访问它,使用它。 至于同步 - 我只是做了水木清华这样的:
public void update(float delta) { synchronized (spritesHolder) { // whole method code... } }
和:
public void onDrawFrame(GL10 gl) { synchronized (spritesHolder) { // whole method code... } }
使两个线程并没有在同一时间使用spritesHolder。所以更新每秒完成60次,并且每当app(设备?)需要时都进行绘制。
说很多话,对不起,我已经差不多完成了写这篇文章。 ;)无论如何 - 这个(上面描述的)工作,我甚至根据这个'模板'编写了一些游戏,但我认为我的想法可能是疯狂的,并且可以更好地设计它。我会非常感谢所有意见和建议。
只有一个词:http://obviam.net/ :) – akonsu 2012-03-28 20:23:04