Prestazioni di rendering per i giochi Flash


11

Stavo leggendo su SO sul rendering flash nativo rispetto alla creazione di un BitmapDataframe buffer personalizzato e alcune delle risposte erano un po 'contrastanti, quindi mi chiedevo:

  1. In genere è consigliabile seguire il percorso del buffer Bitmap personalizzato o lasciare il rendering al motore Flash?
  2. Se stai usando animazioni vettoriali MovieClipanziché sprite, la risposta cambia in quanto sopra?
  3. In tal caso, è consigliabile utilizzare animazioni basate su sprite?

(Sto prendendo di mira Flash 10 se questo fa la differenza)

Risposte:


14

1. Non esiste una migliore pratica generale.

Se hai molti elementi (di forma complessa), particelle ecc. Nel tuo gioco, l'approccio del buffer bitmap sarà molto più veloce. Anche il buffer bitmap si ridimensionerà meglio con l'aumentare della complessità degli sprite. Il vettore di rendering si diventerà più lento con forme più complesse o interpolazione (Shape Tween) animazioni, ha alcuni altri vantaggi però:

  • Puoi ridimensionare liberamente le tue risorse o persino ingrandire la scena senza perdita di qualità.
  • La rotazione o altre trasformazioni come l'inclinazione saranno molto più facili da eseguire sulla grafica vettoriale

Quindi, in conclusione, si riduce a che tipo di gioco stai costruendo.

2. Usare MovieClips invece di fogli sprite bitmap

Immagino volessi dire "fogli sprite bitmap" e non la classe Sprite AS3 ?

Questo non fa differenza, davvero. Puoi sempre trasformare le tue animazioni basate su MovieClip in bitmap animate. O manualmente, esportando il filmato in fotogrammi e trasformandoli in un foglio sprite , o dinamicamente, eseguendo il rendering di un foglio sprite dal MovieClip in fase di esecuzione. Ecco come farei questo:

  1. Crea un'istanza di MovieClip e di stop()essa.
  2. Crea un new BitmapDataoggetto con la stessa larghezza e altezza del Movie Clip.
  3. Utilizzare il metodo draw () per eseguire il rendering di MovieClip su BitmapData.
  4. Archivia l'oggetto BitmapData in una matrice o in un vettore.
  5. Vai al fotogramma successivo di MovieClip e ripeti i passaggi 2 - 4, fallo fino a quando non raggiungi l'ultimo fotogramma di MovieClip. È anche una buona idea aggiornare due variabili con la larghezza massima e l' altezza massima dei fotogrammi MovieClip (poiché possono cambiare da fotogramma a fotogramma).
  6. Ora puoi combinare tutti gli oggetti BitmapData memorizzati in un foglio Sprite (usa BitmapData.copyPixels () )

3. Animazioni basate su Sprite

Come menzionato nella risposta alla tua prima domanda, non esiste una risposta definitiva a questo. Se devi eseguire molte trasformazioni con i tuoi oggetti, ad es. ridimensionamento e rotazione probabilmente stai meglio usando il renderer nativo flash. Se hai animazioni predefinite che possono essere cotte su fogli di sprite (manualmente o dinamicamente) e se devi visualizzare centinaia di sprite contemporaneamente, scegli un motore di rendering bitmap.


Quando (se?) Flash inizia a utilizzare l'accelerazione hardware per il suo rendering, un renderer copyPixel sarà probabilmente più lento del render nativo.
Bart van Heukelom,

6

Direi che se stai costruendo un gioco basato su raster usando gli sprite, vai con la costruzione di una soluzione di rendering personalizzata usando BitmapData. Se stai costruendo un gioco basato su vettori, usa i meccanismi di animazione integrati usando MovieClips.

Se si procede con la creazione di una soluzione di rendering personalizzata, ci si dissocia praticamente da Flash utilizzando solo ActionScript per ottenere ciò di cui si ha bisogno. Il motore Flixel utilizza questo metodo ed è abbastanza carino. Preferisco scrivere il mio motore da zero, però, ma hai l'idea.

L'utilizzo dei meccanismi di animazione Flash integrati funziona meglio per i giochi basati su vettori perché è possibile creare facilmente le risorse della libreria come MovieClips che è quindi possibile creare un'istanza in ActionScript su richiesta. Si utilizza la sequenza temporale fornita dai clip filmato per gestire l'animazione e spostare di conseguenza la posizione dello sprite. Tutta la battaglia! giochi come Adventure Quest Worlds usano questo metodo. Sembra anche bello.

Suppongo che la tua ultima domanda si riferisca all'uso della classe Sprite invece della classe MovieClip per le animazioni vettoriali. Uno Sprite è un MovieClip senza una sequenza temporale, quindi perderai la comodità di avere le animazioni gestite per te.


3

Anche se è opinione diffusa che il blitting sia più veloce, non ho visto alcun benchmark che lo provi. Alcuni sviluppatori preferiscono semplicemente il blitting perché consente loro di trattare Flash come più di una macchina virtuale generica e di controllare autonomamente il rendering. Tuttavia, se ti piace l'elenco di visualizzazione integrato (cosa che faccio), Flash può felicemente spostare, ridimensionare, ruotare e applicare effetti piacevoli a centinaia di oggetti Display sullo schermo (ad esempio MovieClips, Sprites, Bitmap) con frame rate elevati, quindi purché di dimensioni piuttosto ridotte, ad esempio meno di 200x200 pixel ciascuno. Puoi usare MovieClips senza usare i vettori. La maggior parte dei giochi utilizzerà le risorse bitmap indipendentemente dal sistema utilizzato. Ma a volte è utile impaginare e animare gli asset bitmap sulla timeline, specialmente se stai lavorando con un designer specializzato in Flash piuttosto che con un pixel artist. Impostando la qualità del palco su BASSO otterrai prestazioni molto migliori a scapito di trasformazioni più brutte. Flash non renderà alcun oggetto fuori dallo schermo, quindi non ti rallenteranno.

Il punto in cui Flash può rallentare si sta spostando e trasformando bitmap molto grandi, ad esempio se si dispone di un livello di scorrimento molto elevato o di molti livelli di parallasse. Un approccio ibrido all'utilizzo di MovieClips per i tuoi oggetti di gioco mentre si esegue lo blitting dello sfondo da un buffer offscreen può essere più veloce e ti permetterà di avere livelli infinitamente grandi, pur consentendo la facilità d'uso di Sprites e MovieClips standard.


Le forme vettoriali complesse possono anche avere un impatto significativo sulle prestazioni. Se hai MovieClips animati con molti gradienti e se non presti attenzione al livello di dettaglio delle tue forme vettoriali, disegnerà molto più lentamente di una bitmap.
bummzack,

Puoi usare MovieClips senza usare i vettori. La maggior parte dei giochi utilizzerà le risorse bitmap indipendentemente dal sistema utilizzato. Ma a volte è utile impaginare e animare gli asset bitmap sulla timeline, specialmente se stai lavorando con un designer specializzato in Flash piuttosto che con un pixel artist.
Iain,

Sì, per i giochi flash consiglio di non usare i gradienti per tutto ciò che sarà vettoriale e renderizzato in flash ogni fotogramma, tranne alcune cose sull'HUD e lo sprite del giocatore. Le sfumature consumano prestazioni rapidamente.
Attaccando

Alcuni benchmark di rendering e aggiornamento: 8bitrocket.com/2007/12/23/…
Max Dohme
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.