2011-04-18 3 views
2

私はアンドロイドフルスクリーンのOpenGLアプリケーションを持っています。アンドロイド:デバイスローテーション時にOpenGL ESコンテキストスイッチを無効にする

デバイスがポートレートからランドスケープに回転して戻ってきたときに、glコンテキストが破棄されて再作成されます。

これを回避する方法はありますか?すなわち、常に肖像または風景のままであるか?

編集:私はすでに私の活動でこのコードを持っている:

@Override 
protected void onResume() 
{ 
    super.onResume(); 
    mGLSurfaceView.onResume();  
} 

@Override 
protected void onPause() 
{  
    super.onPause(); 
    mGLSurfaceView.onPause(); 
} 

答えて

1

あなたがあなたのActivityクラスOnPause()とOnResume内の関数をオーバーライドする必要があり、その後に破壊されることなく、安全にお使いGLコンテキストを維持したい場合()OnPauseとGLSurfaceView()。Resume()を呼び出してGLSurfaceView()を呼び出すことで、

@Override 
protected void onPause() 
{ 
super.onPause(); 
GLSurfaceView_Class.OnPause(); 
} 

// onResumeも同じです。

アプリをpotraitまたはlandscapeのいずれかに制限する場合は、マニフェストファイルでアプリを定義できます。

あなたのアクティビティタグにandroid:screenOrientation = "landscape"

私はこれが

+0

私はすでにglsurfaceviewでonpauseとonresumeを呼び出していますが、毎回glcontextを再作成します。 – clamp

4

残念ながら、APIレベルまで11 (3.0)の支援を期待GLSurfaceViewは常にGLコンテキストを破壊します。 11以上の場合はsetPreserveEGLContextOnPause (boolean preserveOnPause)になります。

GLSurfaceViewのソースを変更することでこれを回避する方法がありますが、発生した問題は他の人の助けを得ることがずっと難しくなります。

1

それはあなたのアプリはそれが

の代わりに、あなただけのGlContextが破壊/作成されている方法を変更するEGLContextFactoryを提供することができます全体GlSurfaceViewの書き換えを破壊しません回転しているとき、あなたのGlContextを保持することが可能です。

public class ConfigChangesGlSurfaceView extends GLSurfaceView { 

    private static final int EGL_CONTEXT_CLIENT_VERSION_VALUE = 2; 
    private static EGLContext retainedGlContext = null; 
    private boolean changingConfigurations = false; 

    public ConfigChangesGlSurfaceView(Context context) { 
     super(context); 
     init(); 
    } 

    public ConfigChangesGlSurfaceView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init(); 
    } 

    private void init() { 
     changingConfigurations = false; 
     setEGLContextClientVersion(EGL_CONTEXT_CLIENT_VERSION_VALUE); 
     setEGLContextFactory(new GLSurfaceView.EGLContextFactory() { 
      private final int EGL_CONTEXT_CLIENT_VERSION = 0x3098; 

      public EGLContext createContext(EGL10 egl, EGLDisplay display, EGLConfig config) { 
       if (retainedGlContext != null) { 
        // Return retained context 
        final EGLContext eglContext = retainedGlContext; 
        retainedGlContext = null; 
        return eglContext; 
       } 

       int[] attrib_list = {EGL_CONTEXT_CLIENT_VERSION, EGL_CONTEXT_CLIENT_VERSION_VALUE, EGL10.EGL_NONE}; 
       return egl.eglCreateContext(display, config, EGL10.EGL_NO_CONTEXT, attrib_list); 
      } 

      public void destroyContext(EGL10 egl, EGLDisplay display, EGLContext context) { 
       if (changingConfigurations) { 
        // Don't destroy and retain 
        retainedGlContext = context; 
        return; 
       } 

       if (!egl.eglDestroyContext(display, context)) { 
        throw new RuntimeException("eglDestroyContext failed: error " + egl.eglGetError()); 
       } 
      } 
     }); 
    } 

    @Override 
    public void onPause() { 
     changingConfigurations = getActivity().isChangingConfigurations(); 
     super.onPause(); 
    } 

    private Activity getActivity() { 
     Context context = getContext(); 
     while (!(context instanceof Activity) && context instanceof ContextWrapper) { 
      context = ((ContextWrapper) context).getBaseContext(); 
     } 
     if (context instanceof Activity) { 
      return (Activity) context; 
     } 
     throw new IllegalStateException("Unable to find an activity: " + context); 
    } 
} 
関連する問題