1

Androidゲームでテクスチャ、バッファ、シェーダーを解放したいのですが、ユーザーが[戻る]ボタンを押すと、finish()メソッドのアクティビティが呼び出され、onDestroy()が表示されます。これをオーバーライドして、ゲームデータをクリーンアップしたり、サーバー接続を閉じたりします。マニフェストにandroid:launchMode = "singleTask"
を設定したので、アクティビティのfinish()を呼び出すと、常にすぐに破棄されます。 ただし、たとえばglDeleteBuffers(...)を使用するには、EGLコンテキストを持つスレッド(レンダラースレッド)から呼び出す必要がありますが、レンダラークラスからそのようなメソッドを設定して呼び出す場合でも、OpenGLESコンテキストエラーは発生しません。

私は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
}
4

2 に答える 2

1

EGLコンテキストが破棄されると、すべてのGLバッファーなどが破棄されるため、これは不要です。

于 2012-08-16T14:29:45.363 に答える
1

誰かEGLContext(または指定されたメソッドの外部の実行の任意の時点で)破棄する前にGLThreadで何かを実行する必要がある場合は、のqueueEvent()メソッドを使用してGLThreadGLSurfaceViewに投稿できます。を使用する前にRunnable呼び出す必要があることに注意してください。setRenderer()queueEvent()

例(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
        }
    }
}

...
于 2018-10-04T16:21:36.080 に答える