Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android OpenGL ES 2.0-在onDestroy()中使用glDelete*)_Java_Android_C_Android Ndk_Opengl Es 2.0 - Fatal编程技术网

Java Android OpenGL ES 2.0-在onDestroy()中使用glDelete*)

Java Android OpenGL ES 2.0-在onDestroy()中使用glDelete*),java,android,c,android-ndk,opengl-es-2.0,Java,Android,C,Android Ndk,Opengl Es 2.0,我想在我的android游戏中释放纹理、缓冲区和着色器,如果用户点击后退按钮,调用finish()活动方法,进入ondestory(),我将其覆盖以清理游戏数据、关闭服务器连接等。 我在清单中设置了安卓:launchMode=“singleTask”,因此调用活动的finish()总是导致立即销毁。 但要使用glDeleteBuffers(…),例如,它必须从带有EGL上下文的线程(渲染器线程)中调用,但即使从渲染器类中设置并调用这些方法,我也不会得到-OpenGL ES上下文错误 我使用NDK

我想在我的android游戏中释放纹理、缓冲区和着色器,如果用户点击后退按钮,调用finish()活动方法,进入ondestory(),我将其覆盖以清理游戏数据、关闭服务器连接等。
我在清单中设置了安卓:launchMode=“singleTask”,因此调用活动的finish()总是导致立即销毁。
但要使用glDeleteBuffers(…),例如,它必须从带有EGL上下文的线程(渲染器线程)中调用,但即使从渲染器类中设置并调用这些方法,我也不会得到-OpenGL ES上下文错误

我使用NDK,因此NativeLib.调用C/C++函数,如

JNIEXPORT void JNICALL /*class path*/_NativeLib_onDrawFrame(JNIEnv* env, jclass _class)
{
 glClear(GL_COLOR_BUFFER_BIT);
 ...
}
看法

public class OGLES2View extends GLSurfaceView
{

  private static class OGLES2Renderer implements GLSurfaceView.Renderer
  {
    public void onDrawFrame(GL10 unused)
    {
        NativeLib.onDrawFrame();
    }

    public void onSurfaceChanged(GL10 unused, int width, int height)
    {
        NativeLib.onSurfaceChanged(width, height);
    }

    public void onSurfaceCreated(GL10 unused, EGLConfig unusedConfig)
    {
        NativeLib.onSurfaceCreated();
    }

    public void onSurfaceDestroy()
    {
        Log.i(LOG_TAG, "Destroying Opengl objects");
        NativeLib.onGLDestroy();//Don't work - call to OpenGL API with current context
    }

}

public OGLES2Renderer renderer = null; 
public OGLES2View(Context context)
{
    super(context);
    setRenderer(renderer = new OGLES2Renderer());
}
活跃

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    ogles2View = new OGLES2View(this);
    setContentView(ogles2View);
}

@Override
protected void onDestroy()
{
    Log.i(LOG_TAG, "Got finish request for game");
    super.onDestroy();
    ogles2View.render.onSurfaceDestroy(); // Don't not work
}

一旦EGL上下文被销毁,所有GL缓冲区等都将随之被销毁,因此这是不必要的。

如果任何人在销毁
EGLContext
(或在给定方法之外的任何执行点)之前确实需要在GLThread上运行某些东西,您可以使用
GLSurfaceView
的方法将
Runnable
发布到GLThread。请注意,在使用
queueEvent()
之前,必须调用
setRenderer()

示例(针对OP的问题):

...

public void onSurfaceDestroy()
{
    queueEvent(new Runnable() {
        @Override
        public void run() {
            Log.i(LOG_TAG, "Destroying Opengl objects");
            NativeLib.onGLDestroy(); //Works since it's called on the GLThread
        }
    }
}

...