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面试收集录 OpenGL ES

Android:了解 OnDrawFrame、FPS 和 VSync (OpenGL ES 2.0)

将顶点数组和面索引加载到OpenGL-ES中的最快方法?

使用 OpenGL-ES 绘制应用程序中的模糊效果(湿中湿效果)

如何让 OpenGL-ES 在带有 SDL2 的 Raspberry Pi 上工作?