2013-01-10 16 views
6

per il mio gioco, sto pensando di disegnare elementi dell'interfaccia utente (TextView per la visualizzazione di tempo trascorso, i pulsanti per mettere in pausa/gioco riavvio) in cima alla mia GLSurfaceView usando RelativeLayout ...Disegno Android UI in cima GLSurfaceView

Fino ora, stavo disegnando tutti gli elementi dell'interfaccia utente direttamente su surfaceView ma considerando le ampie opzioni disponibili nell'interfaccia utente di Android (come cambiare il carattere tipografico di font e colori), ho deciso di usarlo.

Domande:

  • E 'buona pratica per disegnare elementi dell'interfaccia utente in cima GLSurfaceView o è meglio disegnare tutta la roba UI me direttamente a GLSurfaceView?
  • Aggiornerò il contenuto degli elementi dell'interfaccia utente (dire TextView) regolarmente (per ogni 16 ms) utilizzando il metodo runOnUiThread() ... È negativo?
  • Il mio gioco sarà suscettibile di chiusura forzata?

Ecco il codice Java di prova che sto usando per impostare il RelativeLayout ... glView è l'istanza GLSurfaceView.

rl = new RelativeLayout(this); 
    rl.addView(glView);   
    tv = new TextView(this); 
    RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
    lp.addRule(RelativeLayout.ALIGN_TOP); 
    tv.setLayoutParams(lp); 
    tv.setText("FPS: 0"); 
    tv.setBackgroundColor(0x4060ff70); 
    rl.addView(tv); 

    setContentView(rl); 

risposta

3
  • È una buona pratica di disegnare elementi dell'interfaccia utente in cima GLSurfaceView o è meglio disegnare tutta la roba UI me direttamente a GLSurfaceView?

Sembra una buona idea per disegnare i controlli Android in cima ad una GLSurfaceView se si desidera la flessibilità che il sistema di layout Android fornisce. Attenzione però che questi controlli possono essere disegnati molto più lentamente di glSurfaceView, quindi assicurati che l'interfaccia utente non abbia bisogno di troppa potenza grafica per eseguire il rendering e non si aggiorni troppo rapidamente.

Rendering tutto da soli è un'opzione, ma poi si perdono tutte le funzionalità che è possibile ottenere dal sistema di interfaccia utente Android.

  • sarò l'aggiornamento del contenuto degli elementi dell'interfaccia utente (ad esempio TextView) regolarmente (per ogni 16 ms) utilizzando il metodo runOnUiThread() ... E 'questo male?

Suona bene per me.

  • Sarà il mio gioco essere suscettibile di Forza Chiude?

Questo non ha nulla a che fare con le altre domande. Se segui il corretto utilizzo e non fai generare eccezioni, allora dovresti stare bene. Se causi eccezioni, la tua app verrà forzatamente chiusa (a meno che tu non gestisca correttamente le eccezioni).

2

Lo faccio attualmente in un gioco per Android sto facendo così ho pensato di condividere la mia esperienza con esso.

È una buona pratica di disegnare elementi dell'interfaccia utente in cima GLSurfaceView o è meglio per disegnare tutta la roba UI me direttamente a GLSurfaceView?

Personalmente penso che sia una buona pratica utilizzare i widget dell'interfaccia utente incorporati che Android ti offre per disegnare l'interfaccia utente. Ci sono alcune situazioni in cui non sarebbe adatto, ad es. Controlli dell'interfaccia utente che possono essere trascinati nell'area di gioco o che hanno animazioni o comportamenti complicati.

Se siete alla ricerca di pulsanti e textViews, suggerisco l'approccio suggerito.

sarò l'aggiornamento del contenuto degli elementi dell'interfaccia utente (Say TextView) regolarmente (per ogni 16 ms) usando il metodo runOnUiThread() ... È questo male?

Il mio gioco sarà suscettibile di chiusura forzata?

Io uso lo stesso sistema per aggiornare i miei componenti dell'interfaccia utente. Non ho bisogno di aggiornare tutte le volte che ogni 16 ms, ma certamente non ho alcun problema con la chiusura forzata o le interfacce utente non responsive.

Se molti componenti (di cui sto parlando 10-20 +) vengono aggiornati regolarmente, è possibile che si verifichino problemi di interfaccia utente non rispondenti.

È necessario aggiornare la vista ogni 16 ms (circa 60 FPS)? È possibile aggiornare il valore sottostante per mantenere la logica corretta, ma aggiornare la visualizzazione ogni 20-30 FPS per ridurre la quantità eseguita sul thread dell'interfaccia utente, se necessario.

Penso che le interfacce utente non debbano essere aggiornate tutte le volte che si apre la viewGL visto che non si hanno le cose che girano intorno allo stesso modo. Se una visualizzazione di testo viene aggiornata 20 volte al secondo, si otterrà comunque il senso di una modifica costante.

+0

Sì ... ha senso ... prenderesti in considerazione l'altra domanda che ho postato qualche tempo fa? http://stackoverflow.com/questions/14522715/passing-instructions-from-ui-thread-to-rendering-thread-glsurfaceview – BLOB

Problemi correlati