Лучший способ сделать игровой цикл для Android с помощью OpengGLSurface

Из того, что я видел, если я хочу сделать цикл NON-opengl, я могу сделать игровой поток, который во время цикла обновит состояние игры (или физику игры), а также обновит графику, заблокировав a Canvas из (нормального) SurfaceView, делая рисунок с помощью методов Canvas.drawXXX(...), а затем разблокируя его, после чего графика обновляется для цикла.

Я действительно не понимаю, как это сделать при использовании GLSurfaceView и Renderer. Из того, что я понимаю, я больше не могу использовать свой ручной игровой трюк по требованию, как у меня с обычной поверхностью, а он Canvas, потому что теперь есть поток рендеринга, который вызовет Renderer.onDrawFrame() (при моей реализации рендерера класс, который я передаю в GLSurfaceView).

Мой вопрос в том, какой хороший способ создать игровой цикл с GLSurfaceView и Renderer? Должен ли я по-прежнему создавать отдельный игровой поток, но только обрабатывать его состояние (физику), а затем использовать это состояние игры в моей реализации Renderer.onDrawFrame(), чтобы на самом деле рисовать графику на основе текущего состояния? Должен ли я использовать поток Rendere для обновления состояния?

Ответ 1

Ну, как оказалось, лучший способ - использовать поток, предоставляемый GLSurface. Крюк к нему приходит через реализацию интерфейса Renderer. Эффективно метод Renderer onDrawFrame() можно считать аналогичным регулярному методу Thread run(). Этот вид бросает в окно концепцию фиксированной обновления в секунду парадигмы (на самом деле, но это слишком сложно сделать в этом контексте), но, с другой стороны, вы получаете оптимальные обновления графики.

Здесь есть отличный учебник по Android и OpenGL:

http://insanitydesign.com/wp/projects/nehe-android-ports/