Opengl-es 手动调用 onDrawFrame
Posted
技术标签:
【中文标题】Opengl-es 手动调用 onDrawFrame【英文标题】:Opengl-es calling onDrawFrame manually 【发布时间】:2011-09-14 19:35:35 【问题描述】:我正在创建一个游戏循环,如果我发现我落后于进程,我需要能够(从渲染器内部手动)调用 onDrawFrame 以便“跳过帧”。
目前我有一个 GLSurfaceView 类调用
setRenderer(glSurfaceRenderer);
通过此设置,我了解到 onDrawFrame 每次滴答都会被调用。
我尝试将上述调用放在一个方法中,以便我可以从我的游戏循环中调用它,但在游戏循环的第二次运行时,我崩溃并显示消息说
setRenderer has already been called for this instance
有没有办法每帧手动调用渲染器
只会调用
onDrawFrame
方法正常工作。或者在使用openGL时以这种方式控制渲染器不是一个好习惯
【问题讨论】:
【参考方案1】:我看不出在游戏循环中调用setRenderer()
或手动调用onDrawFrame()
将如何解决任何问题。您应该重构渲染调用以考虑绘制所需的时间,即基于时间的动画。在任何情况下,在任何绘图调用之前手动调用 onDrawFrame()
而不调用 eglMakeCurrent()
都将不起作用,因为您同时拥有渲染器和游戏循环线程绘图。
编辑:由于您使用的是 GLSurfaceView,如果您觉得 RENDERMODE_CONTINUOUSLY
对您来说太慢,您可以从游戏循环中调用 requestRender()
来触发渲染。
【讨论】:
我已经制作了一个基于时间的游戏循环(对不起,我没有说明,应该有)我需要的是一种方法来确保渲染器在被告知时绘制. 如果渲染器很慢,那么如果不投入更多硬件,您将无能为力。 这根本不是我的意思:/ 我使用的教程是关于 [反对谷物](obivam.net/index.php/the-android-game-loop) 唯一的问题是本教程使用画布而不是 GL 啊太棒了,我认为应该可以,我稍后会测试它。谢谢你:)以上是关于Opengl-es 手动调用 onDrawFrame的主要内容,如果未能解决你的问题,请参考以下文章
onDrawFrame、requestRender 和渲染线程? | OpenGL ES 2.0
Android:了解 OnDrawFrame、FPS 和 VSync (OpenGL ES 2.0)