2015-05-04 3 views
4

Я создаю Android приложения с использованием OpenGL ES, и я следующая проблема:onSurfaceChanged вызывается дважды

Когда я свернуть приложение, а затем открыть его, onSurfaceChanged в моем GLSurfaceView.Renderer называется 2 раза.

У меня есть следующий код в onSurfaceChanged (и аналогичный код в onSurfaceCreated, onDrawFrame):

Log.e("onSurfaceChanged",Integer.toString(width)+" "+Integer.toString(height)); 

Так что я получаю следующий журнал:

 
onSurfaceCreated 
onSurfaceChanged 480 800 
onDrawFrame 
onSurfaceChanged 480 800 
onDrawFrame 
onDrawFrame 
onDrawFrame 
onDrawFrame 
onDrawFrame 
onDrawFrame 
(...) 

Когда я минимизировать изменение ориентации экрана от портрет в альбом, затем снова открыть, onSurfaceChanged называется 3 раза. И бревна:

 
onSurfaceCreated 
onSurfaceChanged 480 800 
onDrawFrame 
onSurfaceChanged 480 800 
onDrawFrame 
onDrawFrame 
onDrawFrame 
onSurfaceChanged 800 480 
onDrawFrame 
onDrawFrame 
onDrawFrame 
onDrawFrame 
onDrawFrame 
onDrawFrame 
(...) 

Мой вопрос: это ошибка? В моем приложении или ошибка Android? Есть способ, чтобы onSurfaceChanged вызывается только один раз? (Потому что в onSurfaceCreated я выполнение кода, который замедляет работу приложения)

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

+0

Отметьте этот ответ - http://stackoverflow.com/a/19067259/2514069. Не такая же проблема, но она близка. –

ответ

3

Это не ошибка. Лично я не очень люблю onSurfaceChanged в моем классе, который наследуется от GLSurfaceView. Я установил только окно просмотра в соответствии с новым разрешением и сохранил текущие размеры разрешения для переменной.

Атрибуты OpenGL, такие как текстуры, не нужно воссоздавать на onSurfaceChanged, вместо этого выбирайте нужное место в ActivityCycle для создания и уничтожения ваших активов OpenGL.

Я запускаю свою игру на нескольких платформах, таких как Android, Amazon Fire TV и OUYA. То, что я нашел, что работает на всех этих платформах, - это уничтожить активы GL на onPause, onStop и onRestart, но я также сохраняю флаг, чтобы увидеть, были ли активы уже уничтожены, поэтому я не буду уничтожать его дважды в raw.

Я создаю активы OpenGL в onCreate, onRestart и onResume (также используя флаг, чтобы не создавать его дважды). Если вы не хотите, чтобы игра потеряла свое состояние во время паузы, вам придется сериализовать состояние игры и записать ее в файл и загрузить ее позже, когда будете возобновлены.

Надеюсь, это поможет.

Опять же, вы не можете предсказать, сколько из onSurfaceCreated вы получите, особенно, чтобы оно могло вести себя по-разному на разных устройствах. Однако вы всегда можете доверять действию ActivityCycle, как описано в Google.

+0

При повороте телефона кажется, что onPause вызывается и происходит сбор мусора. Начало приложение (по вертикали) '' ' * OnCreate * onResume * onSurfaceCreated * onSurfaceChanged ' '' Поворот (по горизонтали) '' ' * OnPause (garbageCollect) * OnCreate * onResume * onSurfaceCreated * onSurfaceChanged '' ' – endavid