Как сохранить EGL-контекст при приостановке приложения Android ndk - PullRequest
0 голосов
/ 12 мая 2019

Я пытаюсь улучшить openframeworks, чтобы контекст GL сохранялся при приостановке и возобновлении игры. Так что мне не нужно перезагружать все текстуры после каждой паузы. Я не ожидаю, что вы знаете код openframeworks, я объясню мою проблему независимо от него.

У меня есть действие Java, которое загружает файл main_layout.xml с RelativeLayout внутри другого RelativeLayout. Затем я создаю экземпляр GLSurfaceView и добавляю его во внутренний RelativeLayout, используя glContainer.addView(glView, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));. В функции onPause я вызываю glView.onPause(); в GLSurfaceView, а в onResume я вызываю glView.onResume(); в GLSurfaceView.

Этот код работает, но он уничтожает поверхность gl в onPause (GLSurfaceView.surfaceDestroyed вызывается в моем GLSurfaceView, который расширен до OFGLSurfaceView, так что я могу перехватить этот вызов).

Чтобы исправить это, я добавил вызов GLSurfaceView.setPreserveEGLContextOnPause с параметром 'true' для инициализации моего GLSurfaceView. Теперь я вижу только черный экран после приостановки и возобновления игры. Я обнаружил, что я могу это исправить, удалив GLSurfaceView из родительского RelativeLayout и сразу добавив его обратно в функцию onResume: glContainer.removeView( glView ); glContainer.addView( glView, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT) );. Однако это снова разрушает поверхность gl и вынуждает меня перезагружать текстуры.

Нет повторных реализаций ни одного из RelativeLayouts или GLSurfaceView (я проверил его, просмотрев код, а затем проверив идентичность этих экземпляров с помощью System.identityHashCode).

main_layout.xml:

<?xml version="1.0" encoding="utf-8"?>
   <RelativeLayout android:id="@+id/relativeLayout1" android:layout_width="fill_parent" android:layout_height="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android">
        <RelativeLayout android:id="@+id/of_gl_surface_container" android:layout_width="fill_parent" android:layout_height="fill_parent"/>
        <!-- add here other views' layouts -->
    </RelativeLayout>

Код в OFAndroidLifeCycle.java, который обрабатывает события, полученные от Activity:

public static void glCreateSurface()
{
    if(mGLView == null)
    {
        mGLView = new OFGLSurfaceView(m_activity);

        OFGLSurfaceView glView = getGLView();

        glView.setPreserveEGLContextOnPause( true );

        ViewGroup parent = (ViewGroup)glView.getParent();
        if( parent == null )
        {
            ViewGroup glContainer = getActivity().getSurfaceContainer();
            glContainer.addView(glView, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
        }
    }
}

public static void glPause()
{
    OFGLSurfaceView glView = getGLView();
    if( glView != null )
        glView.onPause();   
}

public static void glResume(ViewGroup glContainer)
{
    OFGLSurfaceView glView = getGLView();

    if( glView != null )
    {
        glView.onResume();

        glContainer.removeView( glView );
        glContainer.addView( glView, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT) );
    }
}

Ну, я просто запутался. Может кто-нибудь немного рассказать о том, как это сделать, какие подводные камни или какие подходы мне следует попробовать?

Спасибо.

1 Ответ

0 голосов
/ 16 мая 2019

Я позже также создал этот вопрос на gamedev.stackexchange.com, а сегодня я разместил там решение:

https://gamedev.stackexchange.com/questions/171908/how-to-preserve-egl-context-when-pausing-android-ndk-app

...