Android, OpenGL e extensão GLSurfaceView?


12

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 GLSurfaceViewa 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.Renderercomo eu fiz

Ainda assim, o grande volume de perguntas em que o problema tem a ver apenas com a extensão GLSurfaceViewestá 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?

Documentação do Android openGL


boa pergunta que eu estou interessado sobre resposta ..
— Tofeeq

Uma razão pela qual a extensão do GLSurfaceView pode ser encontrada aqui: gamedev.stackexchange.com/questions/12629/… Sem perceber, na verdade eu já havia evitado os problemas mencionados nesta pergunta em meu próprio aplicativo, recarregando texturas etc.onResume()
— Spoon Thumb

Respostas:


2

Eu tenho uma extensão muito mínima para o meu GLSurfaceViewe a maior parte da sabedoria pertence à minha implementação do GLSurfaceView.Renderer. Eu tive os três motivos a seguir para usar um wrapper para GLSurfaceView:

  1. A base GLSurfaceViewnão oferece como recuperar a Rendererinstâ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 substituo setRenderere mantenho a referência na minha classe estendida.

  2. GLSurfaceView.Renderernão recebe notificações para onDetachedFromWindow()ou surfaceDestroyed(). Isso causou alguns problemas na minha implementação. Minha extensão GLSurfaceViewsubstitui esses métodos e informa o mRenderer . É possível por causa do §1 .

  3. 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.


Eu comecei a fazer isso também, embora a pergunta seja mais direcionada para o motivo de você colocar a lógica real de uma maneira estendida em GLSurfaceViewvez de GLSurfaceView.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
— Colher Thumb

Tudo bem se você tiver um representante. Mas, como eu disse antes, temos muitos rendrers, e eles se conectam a diferentes SurfaceViews - uma bagunça!
— Alex Cohn

0

Pelo menos um bom motivo para estender o GLSurfaceView é poder instancia-lo diretamente de um arquivo xml de layout, assim como qualquer outro widget:

    <RelativeLayout ... >
      <com.example.MyGlSurfaceView
        android:id="@+id/my_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
      />
     </RelativeLayout>

1
Você pode fazer isso de qualquer maneira utilizando<android.opengl.GLSurfaceView android:id="@+id/graphics_glsurfaceview1" android:layout_width="fill_parent" android:layout_height="fill_parent" />
— Colher Thumb

Bom ponto. A diferença é que, no meu exemplo, a estrutura do Android infla e configura tudo sem precisar de linhas extras de código. Seu método é mais código, mas flexível para substituir a implementação. Fora isso, os dois lados parecem semelhantes.
— Amir Uval

-1

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


2
Sim, mas GLSurfaceViewfaz isso (inicia um thread de renderização), mesmo que você não o estenda. Eu uso GLSurfaceView, 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
— Colher Thumb

welp, eu tentei :) Eu posso pesquisar mais tarde, agora também estou interessado!
— Greg
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.