Как остановить Open GL рендерер - PullRequest
6 голосов
/ 03 февраля 2012

По какой-то причине мне нужно перезапустить GLSurfaceView.Renderer, поэтому я хочу, чтобы какое-то время в моем приложении вызывался setRenderer (newRenderer) второй раз, что не нравится Android, и выдает исключение IllegalStateException, говорящее «setRenderer уже вызван"...

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

Anyoneесть решение для этого?

PS: код выглядит так:

render = new Renderer(this);

setContentView(R.layout.main);
graphicView = (GLSurfaceView) this.findViewById(R.id.graphicView);

//DO STUFF

graphicView.setRenderer(render);

//DO STUFF

Renderer newRender = new Renderer();
graphicView.setRenderer(newRender); <= ...and Android hates this line sooo much

Спасибо!

Ответы [ 3 ]

5 голосов
/ 08 февраля 2012

Нашел ответ здесь , этот "LemonDev" спас мне жизнь:

Можно остановить / уничтожить представление поверхности OpenGL и установить новый GLSurfaceView новым средством визуализации, вызвав OnPause() и postDelayed уничтожение с помощью обработчика и Runnable, например:

final Renderer newRender = new GRenderer(this);
final LinearLayout ll = (LinearLayout) this.findViewById(R.id.main);
graphicView.onPause();

Handler handler = new Handler();
class RefreshRunnable implements Runnable{

    public RefreshRunnable(){

    }

    public void run(){
        ll.removeView(findViewById(R.id.graphicView));

        GLSurfaceView surfaceview = new GLSurfaceView(getApplication());
        surfaceview.setId(R.id.graphicView);
        surfaceview.setRenderer(newRender);

        ll.addView(surfaceview);

        graphicView = (GLSurfaceView) findViewById(R.id.graphicView);
    }
};

RefreshRunnable r = new RefreshRunnable(this);
handler.postDelayed(r, 500);

Это создаст новый рендерер и приостановит GLSurfaceView.Затем приложение «уничтожит» некоторые внутренние компоненты, которые вы не можете затронуть с помощью SDK ... После этого вы можете уничтожить GLSurfaceView, создать еще один и установить для него новый рендерер.

Моя проблематеперь текстуры еще не обновлены, но, тем не менее, это здорово!

4 голосов
/ 03 февраля 2012

Вам действительно нужно дважды вызывать setRenderer?

В документации для Android упоминается:

Этот метод должен вызываться один раз и только один раз в жизненном цикле GLSurfaceView.

Вместо этого, я полагаю, вы хотите приостановить рендеринг?

Используйте setRenderMode(RENDERMODE_WHEN_DIRTY);, чтобы приостановить рендеринг

2 голосов
/ 04 мая 2012

Я нашел более простой способ обновления текстур. В вашем классе Activity вызовите invalidate (), а затем в вашем классе представления поверхности ваш onDrawFrame будет вызываться каждый раз ... Так что вы можете загрузить свою текстуру здесь, и, таким образом, ваша работа будет выполнена!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...