Я пытаюсь улучшить 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) );
}
}
Ну, я просто запутался. Может кто-нибудь немного рассказать о том, как это сделать, какие подводные камни или какие подходы мне следует попробовать?
Спасибо.