Android: отключить переключатель контекста opengl ES при повороте устройства - PullRequest
2 голосов
/ 18 апреля 2011

У меня полноэкранное приложение для Android с открытым экраном.

когда устройство поворачивается из портретной в альбомную и обратно контекст gl уничтожается и воссоздается.т.е. всегда оставаться в портретной или альбомной ориентации?

изменить: у меня уже есть этот код в моей деятельности:

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

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

Ответы [ 3 ]

5 голосов
/ 20 октября 2011

К сожалению, до уровня API 11 (3.0) GLSurfaceView всегда будет уничтожать контекст GL. Для 11 и выше у вас есть способность setPreserveEGLContextOnPause (boolean preserveOnPause).

Существуют способы обойти это путем изменения источника GLSurfaceView, но любые проблемы, с которыми вы столкнетесь, будут намного сложнее получить помощь от других.

2 голосов
/ 18 мая 2016

Возможно сохранить ваш GlContext, когда ваше приложение вращается, чтобы оно не разрушалось

Вместо того чтобы переписывать весь GlSurfaceView, вы можете просто предоставить EGLContextFactory, чтобы изменить способ создания / уничтожения 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);
    }
}
1 голос
/ 25 августа 2011

Если вы хотите сохранить свой контекст GL в безопасности, не уничтожая его, вам необходимо переопределить функции в классе Activity OnPause () и OnResume (), вызвав вас GLSurfaceView (). OnPause и GLSurfaceView (). Resume ().

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

// то же самое и для onResume.

Если вы хотите ограничить свое приложение только портретной или альбомной ориентацией, вы можете указать это в файле манифеста.

android: screenOrientation = "landscape" в теге активности.

Надеюсь, это поможет

...