2010-03-23 9 views
6

Mi chiedevo se qualcuno potesse consigliare un buon modello per caricare le trame in un'app OpenGL ES Java Java &.Caricamento di trame in un'app OpenGL ES per Android

La mia prima preoccupazione è determinare quanti nomi di trama allocare e come posso fare in modo efficiente prima di eseguire il rendering dei vertici.

La mia seconda preoccupazione è nel caricare le trame, devo dedurre la trama da caricare in base ai miei dati di gioco. Questo significa che giocherò con le stringhe, che capisco è qualcosa che non dovrei fare nel mio thread GL.

Nel complesso capisco cosa succede quando carico le trame, voglio solo ottenere il miglior ciclo di vita da esso. Ci sono altre cose che dovrei considerare?

risposta

14

1) È necessario assegnare tutti i nomi di trama necessari. Uno per ogni trama che stai usando.

Il caricamento di una trama è un'operazione molto pesante che blocca la pipeline di rendering. Quindi, non dovresti mai caricare trame all'interno del tuo ciclo di gioco. Dovresti avere uno stato di caricamento prima dello stato dell'applicazione in cui esegui il rendering delle trame. Lo stato di caricamento è responsabile del caricamento di tutte le trame necessarie nel rendering. Quindi, quando hai bisogno di renderizzare la tua geometria, avrai caricato tutte le trame e non dovrai più preoccupartene.

Si noti che dopo aver non più necessario le trame, è necessario eliminarli utilizzando glDeleteTextures.

2) Se si intende per deduzione che sono necessarie trame diverse per livelli diversi o qualcosa di simile, è necessario elaborare i dati di livello nello stato di caricamento e decidere quali trame devono essere caricate.

D'altra parte, se è necessario dipingere del testo (come il punteggio corrente), le cose si complicano in OpenGL. Avrai le seguenti opzioni: prerender il testo necessario per trame (facile), implementa il tuo motore di font bitmap (più difficile) o usa la coppia Bitmap e Canvas per generare trame al volo (lento).

Se si dispone di un numero limitato di messaggi da mostrare durante il gioco, quindi probabilmente li prerenderò alle trame poiché l'implementazione è piuttosto banale.

Per il punteggio corrente è sufficiente avere una trama che abbia un glifo per i numeri da 0 a 9 e utilizzarlo per il rendering di valori arbitrari. L'implementazione sarà abbastanza semplice.

Se sono necessari testi localizzati più lunghi, è necessario iniziare a pensare alle trame generando al volo. Fondamentalmente si dovrebbe creare una bitmap in cui si esegue il rendering del testo utilizzando una tela. Quindi lo caricherai come trama e lo renderesti come qualsiasi altra trama. Dopo che non ne avrai più bisogno, lo elimineresti. Questa opzione è lenta e dovrebbe essere evitata all'interno del ciclo dell'applicazione.

3) Per quanto riguarda le trame e per ottenere il meglio dalla GPU dovresti tenere almeno le seguenti cose nella tua mente (queste cose diventeranno un po 'più avanzate, e dovresti preoccuparti di loro solo dopo aver ottenuto l'applicazione attivo e funzionante e se è necessario ottimizzare la frequenza dei fotogrammi):

  • Ridurre al minimo le modifiche della trama poiché si tratta di un'operazione lenta. In modo ottimale dovresti rendere tutti gli oggetti usando la stessa texture in un batch. Quindi cambia la trama e rendi gli oggetti che ne hanno bisogno e così via.
  • Utilizzare atlanti di trama per ridurre il numero di trame (e modifiche di trama)
  • Se si dispone di molte trame, potrebbe essere necessario utilizzare altre profondità di bit di 8888 per inserire tutte le trame nella memoria. L'utilizzo di profondità di bit inferiori può anche migliorare le prestazioni.
+2

Quando si dice "stato di caricamento", va bene che sia nello stesso momento in cui inizializzo il mio renderer? Il mio pensiero corrente è di inizializzare il mio grafico di scena e interrogare tutti gli oggetti nel grafico di scena per le trame che finiranno per richiedere (facendogli dedurre nomi dal modello di gioco). Ogni oggetto che richiedeva una trama sarebbe stato fornito con il "nome" intero OpenGL corrispondente delle trame richieste. Sembra strano? –

+2

Mi piace modellare la logica di applicazione di alto livello utilizzando macchine a stati. Quindi il termine stato di caricamento. È assolutamente giusto farlo allo stesso tempo si fa il resto dell'inizializzazione. È solo questione di come si desidera progettare la logica dell'applicazione. Quindi sembra sano. – Lauri

2

Questo dovrebbe essere un commento alla risposta di Lauri, ma non posso commentare con 1 rappresentante, e c'è una cosa che dovrebbe essere sottolineato:

texture Si dovrebbe ri-carico ogni volta tua Il contesto EGL è perso (cioè quando le tue applicazioni vengono messe in secondo piano e viceversa). Quindi, il percorso corretto per (ri) caricarli è nel metodo

public void onSurfaceChanged(GL10 gl, int width, int height) 

del renderer. Ovviamente, se hai diversi set di trame da caricare in base (ad esempio) al livello di gioco che stai giocando, quando cambi livello dovrai eliminare le trame che non utilizzerai e caricare le nuove trame. Inoltre, devi tenere traccia di ciò che devi ricaricare quando il contesto EGL viene perso.