如何使用android opengl适当地创建更新/绘制循环?

NPS*_*NPS 7 android loops opengl-es draw

我想使用opengl es在android中编写一些简单的游戏但是在主游戏循环中遇到了麻烦.正如我在这里读到的:http://developer.android.com/resources/tutorials/opengl/opengl-es10.html应用程序public void onDrawFrame(GL10 gl)每次需要重绘表面时调用.或者像这样.我的问题是 - 如何创建一个独立于绘制调用的更新循环.我的意思是 - 它不能像那样工作,只有当设备(app?)想要重绘表面时(或者我错了?),我才能更新游戏逻辑.

经过一些谷歌搜索后,我得出结论,我必须为更新循环创建另一个线程.但后来我遇到了另一个问题 - 一个线程负责绘图,另一个负责更新游戏逻辑,我不知道如何让它们合作.首先,它们是两个独立的类(至少在我的实现中),所以他们不能使用相同的游戏变量和对象(精灵,定时器,不同的变量,计数器等等......几乎所有这两个类需要做的事情他们的工作).现在我想我可以以某种方式将它们打包成一个班级.但是 - 第二,我需要以某种方式同步两个线程.

最后,我提出了这个一般性的想法:

  • 3班:
    1. public class MyRenderer implements GLSurfaceView.RendereronSurfaceCreated()方法照顾绘图
    2. public class UpdateThread implements Runnablerun()update()方法.run()正在调用update()方法每秒60次(我想要一个固定的步骤循环)
    3. public class SpritesHolder 用作所有游戏对象/变量/东西(如精灵,计时器,状态变量等等)的容器,所有字段都是公共的.
  • 所以基本上SpritesHolder类是抱着箱子所有需要的变量在一个地方,所以MyRendererUpdateThread类可以访问它,使用它.
  • 至于同步 - 我只是这样做了:

    public void update(float delta)
    {
        synchronized (spritesHolder)
        {
            // whole method code...
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

    和:

    public void onDrawFrame(GL10 gl)
    {
        synchronized (spritesHolder)
        {
            // whole method code...
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

    这样两个线程都不会同时使用spritesHolder.所以更新每秒进行60次,并且每当app(设备?)需要时都会进行绘图.

很多说话,对不起,我差不多写完了这篇文章.;)所以无论如何 - 这(如上所述)有效,我甚至根据这个'模板'写了一些游戏,但我认为我的想法可能很疯狂,人们可以更好地设计它.我非常感谢所有的意见和建议.

Tim*_*Tim 1

您的解决方案可能会起作用,尽管它的性能可能不是最佳的。如果您考虑一下,渲染线程和更新线程实际上并不需要 100% 独占。

我最近花了一段时间为我的游戏思考这个问题,这就是我最终得出的结论(不一定更好,但只是需要考虑的事情):

对于每个可渲染对象,我有一个由更新线程拥有的对象,以及另一个由渲染线程拥有的对象,该对象只是一个普通容器,其中包含如何绘制对象的指令(模型矩阵、统一值、meshID 等)。我运行更新线程,计算可渲染对象的所有最终位置和值,然后同步一个小窗口,在该窗口中将该帧期间更改的任何值传递给可渲染线程中的对象。然后,一旦新信息通过,帧渲染就开始,同时下一个更新帧运行。因为只有一个小的排除窗口,所以它允许更新和绘制线程在大多数时间同时运行。