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
}