如何停止Open GL渲染器

时间:2012-02-03 15:58:44

标签: android opengl-es

出于某种原因,我需要重新启动一个GLSurfaceView.Renderer,所以我想在我的应用程序中第二次调用setRenderer(newRenderer),Android不喜欢并抛出IllegalStateException,说“已经调用了setRenderer” ” ...

现在,我知道这是因为渲染器附加到GLSurfaceView,我需要将此渲染器解除绑定到表面视图,因此我可以再次调用setRenderer。

任何人都有解决方案吗?

P.S .: 代码如下所示:

render = new Renderer(this);

setContentView(R.layout.main);
graphicView = (GLSurfaceView) this.findViewById(R.id.graphicView);

//DO STUFF

graphicView.setRenderer(render);

//DO STUFF

Renderer newRender = new Renderer();
graphicView.setRenderer(newRender); <= ...and Android hates this line sooo much

谢谢!

3 个答案:

答案 0 :(得分:5)

找到答案here,这个“LemonDev”确实拯救了我的生命:

可以停止/销毁OpenGL表面视图并通过调用OnPause()将新的GLSurfaceView设置为新的渲染器,并使用Handler和Runnable postDelayed destroy,如下所示:

final Renderer newRender = new GRenderer(this);
final LinearLayout ll = (LinearLayout) this.findViewById(R.id.main);
graphicView.onPause();

Handler handler = new Handler();
class RefreshRunnable implements Runnable{

    public RefreshRunnable(){

    }

    public void run(){
        ll.removeView(findViewById(R.id.graphicView));

        GLSurfaceView surfaceview = new GLSurfaceView(getApplication());
        surfaceview.setId(R.id.graphicView);
        surfaceview.setRenderer(newRender);

        ll.addView(surfaceview);

        graphicView = (GLSurfaceView) findViewById(R.id.graphicView);
    }
};

RefreshRunnable r = new RefreshRunnable(this);
handler.postDelayed(r, 500);

这将创建一个新的渲染器并暂停GLSurfaceView。然后应用程序将“销毁”一些你无法用SDK接触的内部东西...之后,你可以销毁GLSurfaceView,创建另一个并为其设置新的渲染器。

我现在的问题是纹理还没有刷新,但是,这仍然很棒!

答案 1 :(得分:4)

你真的需要两次调用setRenderer吗?

android documentation提及:

  

此方法应在a的生命周期中调用一次且仅调用一次   GLSurfaceView。

相反,我想你想暂停渲染?

使用setRenderMode(RENDERMODE_WHEN_DIRTY);暂停渲染器

答案 2 :(得分:2)

我发现了一种更简单的刷新纹理的方法。在你的Activity类中调用invalidate()然后在你的表面视图类中你的onDrawFrame将每次都被调用。所以你可以在这里加载你的纹理,从而你的工作将完成!