GLSurfaceView onPause показывает только черный экран

1

Я разрабатываю небольшую активность OpenGL, которая состоит из этого макета:

<RelativeLayout  
                android:id="@+id/vt_layout_opengl"
                android:orientation="horizontal" 
                android:layout_width="wrap_content" 
                android:layout_height="wrap_content"
                android:visibility="gone"


        >

            <android.opengl.GLSurfaceView
                    android:id="@+id/surface_vt"
                    android:layout_width="900dp" 
                    android:layout_height="285dp"

            />   

            <RelativeLayout
                    android:layout_width="fill_parent" 
                    android:layout_height="fill_parent"
                    android:layout_below="@id/surface_vt"
                    android:layout_marginTop="5dp"
                    android:background="@drawable/barra_menu_vt"

                  >

                    <ImageButton android:id="@+id/vt_left_arrow" 
                                 android:layout_width="wrap_content" 
                                 android:layout_height="wrap_content"
                                 android:layout_alignParentLeft="true"
                                 android:layout_marginLeft="20dp"
                                 android:background="@drawable/prev_a"
                                 android:onClick="prec"

                    />
                    <ImageButton android:id="@+id/vt_right_arrow" 
                                 android:layout_width="wrap_content" 
                                 android:layout_height="wrap_content"
                                 android:background="@drawable/next_a"
                                 android:layout_toRightOf="@+id/vt_left_arrow"
                                 android:layout_marginLeft="20dp"
                                 android:onClick="next"
                    />
                    <TextView
                        android:id="@+id/vt_description" 
                        android:layout_width="wrap_content" 
                        android:layout_height="wrap_content"
                        android:layout_toRightOf="@+id/vt_right_arrow"
                        android:layout_marginLeft="30dp"
                        android:maxLength="30"
                        android:singleLine="true"
                        android:ellipsize="marquee"
                    />

                    <ImageButton android:id="@+id/vt_information" 
                                 android:layout_width="wrap_content" 
                                 android:layout_height="wrap_content"
                                 android:layout_toLeftOf="@+id/vt_addbookmarks"
                                 android:layout_marginRight="20dp"
                                 android:background="@drawable/info_a"
                                 android:onClick="info"

                    />
                    <ImageButton android:id="@+id/vt_addbookmarks" 
                                 android:layout_width="wrap_content" 
                                 android:layout_height="wrap_content"
                                 android:layout_toLeftOf="@+id/vt_preferences"
                                 android:layout_marginRight="20dp"
                                 android:background="@drawable/book_a"
                                 android:onClick="bookmark"
                    />
                    <ImageButton android:id="@+id/vt_preferences" 
                                 android:layout_width="wrap_content" 
                                 android:layout_height="wrap_content"
                                 android:layout_alignParentRight="true"
                                 android:layout_marginRight="20dp"
                                 android:background="@drawable/sett_a"
                                 android:onClick="settings"
                    />




                </RelativeLayout>


        </RelativeLayout>

Он показывает вид, подобный этому:

Изображение 174551

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

Примерно через две минуты система говорит: Изображение 174551

Я очень расстраиваю, я называю GLSurface onPause() и onResume(), когда моя активность вызывает соответствующие методы.

Кто-то может мне помочь!!????

Я размещаю некоторый код:

@Override
    public void onCreate(Bundle savedInstanceState) {
    Log.d(TAG,"onCreate()");
        super.onCreate(savedInstanceState);
        setContentView(R.layout.virtualtour);
        loading_ly = (RelativeLayout) findViewById(R.id.vt_layout_loading);
        panorama_description = (TextView) findViewById(R.id.vt_description);
        virtualtour_relatively = (RelativeLayout) findViewById(R.id.vt_layout_opengl);
        vt_handler = new VirtualTourHandler(this);
        ext_container = new GLExtensionContainer();
        th_checkGL = new ThreadCheckOpenGL(ext_container, extensions_requested,vt_handler);
       th_checkGL.start();
        mFacebook = new Facebook(ArounderTouchMainActivity.APP_ID);
        mAsyncRunner = new AsyncFacebookRunner(mFacebook);
        msg = vt_handler.obtainMessage();
        output_thread =  msg.getData();
        output_thread.putInt(VirtualTour.TYPE_TAG, VirtualTour.START_TAG);
        vt_handler.handleMessage(msg);
      }

Это внутренний класс Handler (я использую его для текстуры коммутатора, когда пользователи выполняют какое-либо действие)

@Override
        public void handleMessage(Message msg) {


            bd = msg.getData();
            type = bd.getInt(TYPE_TAG);
            bd = msg.getData();

            switch (type) {
                case GL_EXTENSIONS_CHECK_TAG:
                    showDialog(GL_EXTENSIONS_CHECK_DIALOG);
                    break;
                case START_TAG:
                    Log.d(TAG, "START_TAG");
                    loading_ly.setVisibility(View.VISIBLE);
                    virtualtour_relatively.setVisibility(View.GONE);
                    progress_bar.setProgress(0);
                    thread = new DownloadImageProgressBar(vt_handler,getActivity());
                    thread.execute(panorama_input.get(position).getUrl_virtual());
                    break;
                case BAR_TAG:
                    progress = bd.getInt(PROGRESS_TAG);
                    if(progress <= 100)
                        progress_bar.setProgress(progress);
                    break;

                case SHUTDOWN_TAG:
                    finish();
                    break;
                case SHOW_TAG:
                Log.d(TAG, "SHOW_TAG");
                if(first_visualization){
                    glSurface = (GLSurfaceView) findViewById(R.id.surface_vt);
                    glSurface.setDebugFlags(GLSurfaceView.DEBUG_CHECK_GL_ERROR);
                    renderer = new OpenGLRenderer(first_data,second_data,sphere,vt_handler,ext_container, ( (panorama_input.get(position)).getType().compareTo(CardImage.SPHERE) == 0));
                    glSurface.setRenderer(renderer);
                    first_visualization = false;
                }
                // potrebbe essere fatto molto meglio: ricorda! 
                panorama_description.setText(panorama_input.get(position).getTitolo());
                loading_ly.setVisibility(View.GONE);
                virtualtour_relatively.setVisibility(View.VISIBLE);

                renderer.setImage(first_data, second_data,( (panorama_input.get(position)).getType().compareTo(CardImage.SPHERE) == 0));
                renderer.resetZoom();
                renderer.resetAngle();
                renderer.startTimer();  
                enable_touch = false;
                case NOCONNECTION_ERROR_TAG:
                    showDialog(OUTOFMEMORY_ERROR_DIALOG);
                    break;

                case OUTOFMEMORY_ERROR_TAG:
                    showDialog(OUTOFMEMORY_ERROR_DIALOG);
                    break;


                default:
                    break;
            }
            return;

        }


    }

DownloadImageProgressBar - это AsyncTask, который загружает изображения из Интернета и выполняет некоторые действия пользовательского интерфейса с помощью обработчика операций.

Есть мои методы onPause и onResume:

 @Override
protected void onResume() {
    Log.d(TAG,"onResume()");
    super.onResume();
    if(glSurface != null)
        glSurface.onResume();
}

   @Override
protected void onPause() {
     Log.d(TAG,"onPause()");   
     super.onPause();
     glSurface.onPause();
}

Я вызываю эти методы в onSurfaceChanged и onSurfaceCreated:

public void setGLTexture(GL10 gl10) {

        GL11 gl = (GL11) gl10;

        //Generate one texture pointer...
        gl.glGenTextures(2, textures_id);
        gl.glClearColor(0.2f, 0.2f, 0.2f, 1.0f);
        //...and bind it to our array
        gl.glBindTexture(GL10.GL_TEXTURE_2D, textures_id.get(0));
        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR);
        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR);
        gl.glTexParameterf( GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_CLAMP_TO_EDGE );
        gl.glTexParameterf( GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_CLAMP_TO_EDGE );
        GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, first, 0);
        gl.glBindTexture(GL10.GL_TEXTURE_2D, textures_id.get(1));
        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR);
        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR);
        gl.glTexParameterf( GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_CLAMP_TO_EDGE );
        gl.glTexParameterf( GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_CLAMP_TO_EDGE );
        GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, second, 0);
        return;
    }

У меня есть другой вопрос, когда моя активность переключается в фоновом режиме, текстуры, загруженные ранее, удаляются?

Возможно ли, что это проблемы?

  • 0
    Можете ли вы опубликовать некоторый (абстрагированный) код, чтобы мы понимали, что вы делаете, когда перезапускается действие?
Теги:
opengl-es

1 ответ

6

Когда вы нажимаете "home", контекст GL теряется.

Из документации для Android:

Бывают ситуации, когда EGL контекст рендеринга будет потерян. Эта обычно происходит, когда устройство просыпается после засыпания. Когда EGL контекст потерян, все ресурсы OpenGL (например, текстуры), которые связаны с этим контекстом будет автоматически удаляется. Чтобы сохранить рендеринг правильно, рендеринг должны воссоздать любые утраченные ресурсы, которые он все еще нуждается. onSurfaceCreated (GL10, EGLConfig) метод - удобное место для это.

Вы можете прочитать об этом здесь.

Чтобы устранить проблему, выполните всю текстуру и инициализацию OpenGL в рендерере onSurfaceChanged.

  • 0
    Но почему я ничего не видел ...? Если вы правы, я не мог видеть только GLSurfaceView. Я все равно попробую сейчас и покажу результат. Спасибо
  • 0
    Конечно, он прав. Я написал почти тот же ответ, но он оказался там за 30 секунд до меня. :)
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню