2012-01-09 10 views
18

Devo scrivere un gioco per Android, devo scegliere tra canvas o opengl per disegnare. Ho letto che la tela non ha un buon framerate, ma cosa è buono? Immagina che stavi per scrivere un gioco di uccelli arrabbiati, sarebbe bastato che il framerate fosse sufficiente?gioco per android, canvas o opengl?

+2

hai letto i documenti grafici sul sito degli sviluppatori? http://developer.android.com/guide/topics/graphics/index.html vorrei andare con opengl ma in Android 3.0 e sopra tela può essere accelerato hardware che migliorerà le prestazioni – RyanSullivan

+5

Se si scarica l'applicazione di prova metodo sprite da qui http://code.google.com/p/apps-for-android/ crea e installa, esegue benchmark utilizzando i diversi metodi di rendering. ha un sacco di estensioni che è possibile modificare e visualizzare l'effetto – RyanSullivan

risposta

1

Se avete intenzione di fare un grande gioco come si dovrebbe assolutamente considerare l'utilizzo di AndEngine: http://www.andengine.org/

Se usato bene, è un grande aiuto. Purtroppo non c'è documentazione nel codice. Ma il forum sul sito è abbastanza ok. E anche qui su SO appaiono sempre più domande riguardanti AndEngine. Fortunatamente ci sono un sacco di buoni esempi per iniziare.

AndEngine utilizza OpenGL - in modo da non dover scherzare con framerate possibilmente bassi mentre si disegna sul canvas.

Scopri i migliori esempi App: https://market.android.com/details?id=org.anddev.andengine.examples

+0

grazie. avrò uno sguardo – seipey

3

Tutto dipende dal tipo di gioco è necessario implementare.

Considerando che stai richiedendo un'implementazione su tela, suppongo che tu ti stia riferendo a un gioco di sprite in 2D puro.

Se gli sprite non sono molti e il numero è molto basso, la verità è che potenzialmente si nota una grande differenza (si consideri che molti giochi con grafica 2D di base utilizzano la tela).

Se le prestazioni sono importanti o se si dispone di un numero molto elevato di sprite, vale la pena implementare un sistema basato su OpenGL.

Considera che l'utilizzo di OpenGL ti consentirà di usufruire dell'hardware dedicato della GPU in modo che la CPU venga scaricata dall'onere del rendering grafico.

Inoltre, beneficerete di molta più flessibilità di un'implementazione su tela utilizzando effetti di fusione, illuminazione e post elaborazione. Non c'è davvero alcun limite in quello che puoi fare.

Un semplice esempio è rotazione e ridimensionamento che utilizzando un motore 3D come OpenGL è molto economico e offre risultati eccellenti.

La tela deve essere realmente adottata per implementazioni semplici.

P.S. se utilizzi OpenGL ES 2.0 e pipeline programmabile, non hai davvero limiti in ciò che ottieni (incandescente, sfocato e migliaia di opzioni diverse). Il limite è davvero la nostra fantasia in quel caso.

:)

+0

ho già lavorato con opengl e hai ragione, non ha limiti. Grazie per la tua risposta. – seipey

45

inizialmente ho scritto il mio gioco utilizzando tela, ma poi necessari per passare a OpenGL per i seguenti motivi:

  • Utilizzando Canvas, i tuoi sprite vengono memorizzati sul mucchio (a meno che non specificamente memorizzandoli in cache sul disco) ciò pone un limite alle dimensioni totali delle risorse dello sprite a seconda del telefono: non va bene! Ho trovato che era circa 42mb sul mio telefono - nota questa è la dimensione non compressa di bitmap. Se hai diversi tipi di entità, ciascuna con animazioni diverse, puoi raggiungere questa dimensione molto velocemente.

  • OpenGL memorizza le risorse dello sprite separatamente nell'heap, aumentando notevolmente la memoria disponibile.

  • La tela non viene ridimensionata molto bene. Maggiore è il numero di richiami (...), più lento verrà eseguito. La relazione è abbastanza lineare.

  • Utilizzando OpenGL è possibile raggruppare le chiamate di estrazione per migliorare le prestazioni.

Può essere intimidatorio a partire da OpenGL che rende la tela sembrare allettante. Tuttavia dall'esperienza vorrei aver appena iniziato con OpenGL. La mia raccomandazione sarebbe quella di "mordere il proiettile" e andare con OpenGL se stai facendo un gioco.

Per rendere le cose un po 'più facili per iniziare, ho scritto alcune utili classi di utilità che fanno tutto il nitty grintoso OpenGL per te. Ti consentono di effettuare semplici chiamate .draw (..) simili a quando utilizzi Canvas. Il seguente video tutorial dovrebbe iniziare:

http://www.youtube.com/watch?v=xc93rN2CGNw

EDIT: 03/04/13

Sembra che come nuovi dispositivi Android e sistemi operativi escono Google hanno aumentato le prestazioni di tela di canapa . Un utente della classe di utilità I descritta sopra mi ha risposto con la seguente email dopo aver eseguito alcuni benchmark:

Disegno 500 sprite in posizioni casuali su tela per ogni fotogramma.

Ecco i risultati: Huawei onore (Gingerbread, single core 1.4 Ghz): SpriteBatcher: 19-20 FPS Tela: 23-24 FPS

Nexus 7 (Jellybean, 4 core 1.3 GHz): SpriteBatcher : 29-30 FPS, Tela: 57-58 FPS

Ora, nella mia risposta a questo utente ho spiegato che questo potrebbe essere a che fare con le inefficienze nel modo in cui ho scritto lo SpriteBatcher classe di utilità. Comunque dalla mia esperienza con Canvas su un HTC Desire con Froyo 2.2 posso dire che è stato decisamente più lento sprite per sprite!

Su sistemi operativi e dispositivi successivi potrebbe aver superato l'efficienza ma alcuni dei punti nella mia risposta originale sono ancora validi. Ad esempio, andare in giro colpendo una OutOfMemoryException senza dover ricorrere alla memorizzazione nella cache di trame sul disco ecc.

Se dovessi saperne di più, continuerò ad aggiornare questa risposta.

+0

Vorrei sottolineare il primo punto, che le bitmap sono archiviate nell'heap con l'approccio Canvas. Questo può essere molto limitante. A meno che il tuo gioco non sia molto semplice (come Pong o Breakout), con pochi sprite e nessun sprite animato, vorresti sicuramente avere più memoria per loro. –