Иногда излишнее планирование может быть пустой тратой времени.
В разных играх используются разные подходы, вы захотите взглянуть на блог разработчика на острове-реплике и код для различных советов о том, как организовать ваш код с помощью GLSurfaceView. http://replicaisland.net/
Я использую ваш последний подход, но он не такой небрежный, как вам кажется.
Вам на самом деле не нужен никакой логический код в GLSurfaceView, просто вызовы ваших классов, когда происходят определенные события. (onDraw, onTouch, onKey и т. д.)
Не уверен, что в этом плохого, я придерживаюсь своей логики в их соответствующих классах.
Например, в моем onDrawFrame () я просто делаю MyAreaManager.draw (gl)
Класс MyAreaManager будет поддерживать свою собственную логику и знать, что рисовать.
Что касается часов, вам, скорее всего, понадобятся два потока. Один для рендеринга (поток GLSurfaceView) и один для игровой логики, которая работает с определенной частотой кадров логики.
Логическая рамка просто изменила бы состояние объектов холста, а рамка рисования просто нарисовала бы их как можно быстрее.
Таким образом, вы рендеритесь максимально быстро и сохраняете стабильную частоту кадров логики.