Проблемы с GLSurface в onPause () / onResume () - PullRequest
2 голосов
/ 10 февраля 2012

У меня проблемы с моим GLSurfaceView.

В моей основной деятельности есть TabLayout. Я поместил GLSurfaceView во вкладку следующим образом:

    renderer = new GLRendererX(Interface.this);
    cube3d = new GLSurfaceView(Interface.this);
    cube3d.setRenderer(renderer);
    cube3d.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);

    cube3d.setOnTouchListener(new OnTouch());

    cube3d_tab_content = (LinearLayout) findViewById(R.id.tab1_5);
    cube3d_tab_content.addView(cube3d);

Согласно руководству разработчика Android, мне нужно вызвать методы onPause () и onResume ():

GLSurfaceView должен быть уведомлен, когда действие приостановлено и возобновлено. Клиенты GLSurfaceView обязаны вызывать onPause (), когда действие приостанавливается, и onResume (), когда действие возобновляется. Эти вызовы позволяют GLSurfaceView приостанавливать и возобновлять поток рендеринга, а также позволяют GLSurfaceView освобождать и воссоздавать отображение OpenGL.

Android Dev Guide

Поэтому я вставляю вызовы onResume () / onPause () в свою основную деятельность onResume () / onPause ():

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

    cube3d.onPause();
    //cube3d_tab_content.removeView(cube3d);

    currentTab = th.getCurrentTabTag();
}

и

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

    cube3d.onResume();

    if (prefs != null) {
        protocol.refresh();
    }
    th.setCurrentTabByTag(currentTab);

    cube.setFields(ffields, rfields, lfields, ufields, dfields, bfields);

    cube.display();
}

Теперь, когда я вызываю другое действие - например, через меню - и возвращаюсь (onResume), действие замораживается на пару секунд и, наконец, возвращается к моему основному действию.

Чтобы убедиться, что проблема возникает только с GLSurfaceView, я удалил код, касающийся GLSurfaceView. Работало как надо.

Так что я предполагаю, что что-то не так с моим cube3d.onPause () / .onResume ().

Кто-нибудь знает, как это исправить?

Заранее спасибо!

Адриан

Ответы [ 2 ]

1 голос
/ 14 сентября 2012

эти два метода вызываются в главном потоке (потоке пользовательского интерфейса): YourActivity.onPause / YourGLSurfaceView.onPause

поэтому, возможно, так должно быть в YourGLSurfaceView.java:

public void onPause() {
    queueEvent(new Runnable() {
        @Override
        public void run() {
            3dcube.onPause();
        }
    });

    super.onPause();
}
0 голосов
/ 24 сентября 2012

Вы должны зарегистрировать / отменить регистрацию в методе onpausse onresume (), и он будет отлично работать

...