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?)想要重绘表面时(或者我错了?),我才能更新游戏逻辑.
经过一些谷歌搜索后,我得出结论,我必须为更新循环创建另一个线程.但后来我遇到了另一个问题 - 一个线程负责绘图,另一个负责更新游戏逻辑,我不知道如何让它们合作.首先,它们是两个独立的类(至少在我的实现中),所以他们不能使用相同的游戏变量和对象(精灵,定时器,不同的变量,计数器等等......几乎所有这两个类需要做的事情他们的工作).现在我想我可以以某种方式将它们打包成一个班级.但是 - 第二,我需要以某种方式同步两个线程.
最后,我提出了这个一般性的想法:
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...
}
}
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(设备?)需要时都会进行绘图.
很多说话,对不起,我差不多写完了这篇文章.;)所以无论如何 - 这(如上所述)有效,我甚至根据这个'模板'写了一些游戏,但我认为我的想法可能很疯狂,人们可以更好地设计它.我非常感谢所有的意见和建议.
您的解决方案可能会起作用,尽管它的性能可能不是最佳的。如果您考虑一下,渲染线程和更新线程实际上并不需要 100% 独占。
我最近花了一段时间为我的游戏思考这个问题,这就是我最终得出的结论(不一定更好,但只是需要考虑的事情):
对于每个可渲染对象,我有一个由更新线程拥有的对象,以及另一个由渲染线程拥有的对象,该对象只是一个普通容器,其中包含如何绘制对象的指令(模型矩阵、统一值、meshID 等)。我运行更新线程,计算可渲染对象的所有最终位置和值,然后同步一个小窗口,在该窗口中将该帧期间更改的任何值传递给可渲染线程中的对象。然后,一旦新信息通过,帧渲染就开始,同时下一个更新帧运行。因为只有一个小的排除窗口,所以它允许更新和绘制线程在大多数时间同时运行。
| 归档时间: |
|
| 查看次数: |
2797 次 |
| 最近记录: |