私はGLSurfaceView.Rendererを次のように実装しています:
public class GL20Renderer implements GLSurfaceView.Renderer {
private static GL20Renderer mInstance = new GL20Renderer();
private GL20Renderer() {}
public static GL20Renderer getInstance() {
return mInstance;
}
@Override
public void onDrawFrame(GL10 gl) {
Log.e("App", "onDrawFrame()");
}
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
Log.e("App", "onSurfaceChanged()");
}
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
Log.e("App", "onSurfaceCreated()");
}
}
このクラスは MainActivity に実装されています。
public class MainActivity extends Activity {
private GLSurfaceView mGLView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
// Create a GLSurfaceView instance and set it as the ContentView for this Activity
mGLView = new GL20SurfaceView(this);
setContentView(mGLView);
}
@Override
protected void onPause() {
super.onPause();
mGLView.onPause();
}
@Override
protected void onResume() {
super.onResume();
mGLView.onResume();
}
}
GL20SurfaceView は:
public class GL20SurfaceView extends GLSurfaceView {
public GL20SurfaceView(Context context) {
super(context);
// Create an OpenGL ES 2.0 context.
setEGLContextClientVersion(2);
// Set the Renderer for drawing on the GLSurfaceView
setRenderer(GL20Renderer.getInstance());
}
}
ご覧のとおり非常にシンプルです。アプリを起動すると、onSurfaceCreated() メソッドが正しく呼び出され、続いて onSurfaceChanged() が 1 回呼び出されます。
問題は次のとおりです。デバイスの向きが変わるたびに、onSurfaceCreated() の別の呼び出しに続いて onSurfaceChanged() が呼び出されます。
私の理解では、新しいサーフェスを作成する必要があるときはいつでも onSurfaceCreated() メソッドが呼び出されます。私の質問は、デバイスの向きだけを変更するたびになぜそうするのですか? ビューポートを調整するには、onSurfaceChanged() 呼び出しをトリガーするだけで十分ではないでしょうか?
向きを変更するときにデバイスをスリープ状態にしないことに注意してください。