Esta pergunta é parte técnica, parte meta, parte subjetiva e muito específica:
Sou desenvolvedor de jogos indie trabalhando no Android e, nos últimos 6 meses, lutei e finalmente consegui criar meu próprio aplicativo de jogo em 3D para Android. Então pensei em usar o SO e ajudar outras pessoas que enfrentam o Android e o openGL-ES
No entanto, a grande maioria das perguntas se refere à extensão GLSurfaceView
. Eu fiz meu aplicativo inteiro sem estender GLSurfaceView
(e ele funciona bem). Não vejo nenhum motivo para estender GLSurfaceView
a maioria das perguntas que me deparo.
Pior, a documentação do Android implica que você deve, mas não fornece explicações detalhadas sobre por que ou quais são os prós / contras, não estendendo e fazendo tudo através da implementação do seu, GLSurfaceView.Renderer
como eu fiz
Ainda assim, o grande volume de perguntas em que o problema tem a ver apenas com a extensão GLSurfaceView
está me fazendo pensar se realmente há alguma razão realmente boa para fazê-lo dessa maneira, em comparação com o que eu tenho feito (e sugerindo nas minhas respostas a outras pessoas) façam).
Então, está faltando alguma coisa? Devo parar de responder perguntas enquanto isso?
onResume()
Respostas:
Eu tenho uma extensão muito mínima para o meu
GLSurfaceView
e a maior parte da sabedoria pertence à minha implementação doGLSurfaceView.Renderer
. Eu tive os três motivos a seguir para usar um wrapper paraGLSurfaceView
:A base
GLSurfaceView
não oferece como recuperar aRenderer
instância. Tenho várias superfícies e, quando recebo um evento de interface do usuário para uma delas, desejo passar o comando para o representante correspondente. Então, eu substituosetRenderer
e mantenho a referência na minha classe estendida.GLSurfaceView.Renderer
não recebe notificações paraonDetachedFromWindow()
ousurfaceDestroyed()
. Isso causou alguns problemas na minha implementação. Minha extensãoGLSurfaceView
substitui esses métodos e informa o mRenderer . É possível por causa do §1 .Alguns métodos são agrupados apenas para adicionar o
try { super.
que; } catch() { log(
quer que seja) }
. Por exemplo,queueEvent()
será lançado se o Renderer não estiver definido; mas para mim, não há problema em simplesmente ignorar essas inconsistências na linha do tempo.fonte
GLSurfaceView
vez deGLSurfaceView.Renderer
. Embora no ponto 1, mantenho o renderizador como uma variável em minha atividade. Em teoria, eu pode obtê-lo de qualquer lugar, lançando o contexto:((MyActivity)view.getContext()).getRenderer()
. Talvez um pouco mais perigoso como o objeto de contexto podem não ser necessariamenteMyActivity
Pelo menos um bom motivo para estender o GLSurfaceView é poder instancia-lo diretamente de um arquivo xml de layout, assim como qualquer outro widget:
fonte
<android.opengl.GLSurfaceView android:id="@+id/graphics_glsurfaceview1" android:layout_width="fill_parent" android:layout_height="fill_parent" />
Bem ... GLSurfaceView é, como eu tenho certeza que você notou, apenas um invólucro para o bem comum. Ele encapsula toda a funcionalidade que seria necessária para renderizar com o opengl, com a opção de incorporá-lo perfeitamente à hierarquia do Android View.
Você não forneceu sua alternativa, por isso é impossível comparar, mas espero que você tenha gerado outro encadeamento para renderização como o GLSurfaceView, ou a entrada do usuário pode ficar lenta.
Novamente: GLSurfaceView fornece um novo thread para renderização, para que você não precise se preocupar com o atraso na entrada do usuário
fonte
GLSurfaceView
faz isso (inicia um thread de renderização), mesmo que você não o estenda. Eu usoGLSurfaceView
, mas não o estendo. Estou perguntando o que são os benefícios de estender-lo e overrriding os diferentes métodos nele ao invés de apenas ter tudo naRenderer