Domanda

Sto lavorando a un gioco a scorrimento 2D per iPhone. Ho uno sfondo di immagini di grandi dimensioni, ad esempio 480 × 6000 pixel, di una sola parte è visibile (vale esattamente uno schermo, 480 × 320 pixel). Qual è il modo migliore per ottenere un tale sfondo sullo schermo?

Attualmente ho lo sfondo diviso in diverse trame (per aggirare il limite massimo delle dimensioni della trama) e disegnare l'intero sfondo in ogni fotogramma come una striscia triangolare strutturata. Lo scorrimento viene effettuato traducendo la matrice modelview. La scatola delle forbici è impostata sulla dimensione della finestra, 480 × 320 pixel. Questo non vuole essere veloce, volevo solo un codice funzionante prima di arrivare all'ottimizzazione.

Ho pensato che forse l'implementazione di OpenGL sarebbe stata abbastanza intelligente da scartare la parte invisibile dello sfondo, ma secondo un codice di misurazione che ho scritto sembra che lo sfondo impieghi 7 & nbsp; ms per disegnare in media e 84 & nbsp; ms al massimo. (Questo è misurato nel simulatore.) Questo è circa la metà dell'intero loop di rendering, cioè. abbastanza lento per me.

Disegnare lo sfondo dovrebbe essere facile come copiare circa 480 × 320 pixel da una parte della VRAM a un'altra, o, in altre parole, velocissimo. Qual è il modo migliore per avvicinarsi a tali prestazioni?

È stato utile?

Soluzione

Questo è il modo rapido di farlo. Cose che puoi fare per migliorare le prestazioni:

  • Prova diversi formati di trama. Presumibilmente i documenti SDK hanno dettagli sul formato preferito e presumibilmente più piccolo è meglio.
  • Elimina le tessere interamente fuori schermo
  • Dividi l'immagine in trame più piccole

Suppongo che stai disegnando a un livello di zoom 1: 1; è così?

Modifica: Oops. Avendo letto la tua domanda più attentamente, devo offrire un altro consiglio: I tempi fatti sul simulatore sono inutili.

Altri suggerimenti

La soluzione rapida:

  • Crea una matrice geometrica di riquadri (preferibilmente quadrupli) in modo che vi sia almeno una riga / colonna di riquadri fuori schermo su tutti i lati dell'area visualizzabile.

  • Mappa le trame su tutte quelle tessere.

  • Non appena una tessera si trova al di fuori dell'area visibile è possibile rilasciare questa trama e legarne una nuova.

  • Sposta le tessere usando un modulo della larghezza e dell'altezza delle tessere come posizione (in modo che la tessera si riposizionerà nella sua posizione iniziale quando ha spostato esattamente una tessera di lunghezza). Ricorda anche di rimappare le trame durante quell'operazione. Ciò consente di avere una griglia molto piccola / memoria di trama molto piccola caricata in un dato momento. Il che immagino sia particolarmente importante in GL ES.

Se hai memoria da risparmiare e sei ancora afflitto da una bassa velocità di caricamento (anche se non dovresti per quella quantità di trame). È possibile creare un motore di streaming delle trame che precarichi le trame in una memoria più veloce (qualunque cosa si trovi sul dispositivo di destinazione) quando si raggiunge una nuova area. La mappatura come trame in quel caso passerà da quella memoria più veloce quando necessario. Assicurati solo di essere in grado di precaricarlo senza utilizzare tutta la memoria e ricorda di rilasciarlo in modo dinamico quando non è necessario.

Ecco un collegamento a un motore di tessere GL (non ES). Non l'ho usato da solo, quindi non posso garantire la sua funzionalità, ma potrebbe essere in grado di aiutarti: http://www.mesa3d.org/brianp/TR.html

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top