2009-06-12 19 views
9

Lavoro su uno sparatutto in 2D con molti oggetti in movimento sullo schermo (proiettili, ecc.).Vsync in Flex/Flash/AS3?

Uso BitmapData.copyPixels (...) per eseguire il rendering dell'intero schermo su un buffer: BitmapData. Quindi "copyPixels" da "buffer" alla schermata: BitmapData. Il framerate è 60.

private var bitmap:Bitmap = new Bitmap(); 
private var buffer:Bitmap = new Bitmap(); 

private function start():void { 
    addChild(bitmap); 
} 

private function onEnterFrame():void { 
    // render into "buffer" 
    // copy "buffer" -> "bitmap" 
} 

Il problema è che gli sprite sono lacerando: una parte di uno sprite ottenuto spostato orizzontalmente.

Sembra un gioco per PC con VSYNC disattivato.

Qualcuno ha risolto questo problema?

UPDATE: la questione non riguarda le prestazioni, ma di sbarazzarsi di screen tearing. [!]

UPDATE: Ho creato another question e qui si può provare entrambe le implementazioni: usando modo Flash o BitmapData + copyPixels()

+0

Lo strappo dello schermo è correlato alle prestazioni. Questo è l'unico modo per aggiustare la tua lacrimazione. – Kekoa

+3

@Kekoa Non posso essere d'accordo. Le prestazioni non hanno nulla a che fare con lo strappo dello schermo, perché uso il doppio buffer. In caso di prestazioni scadenti avrei un FPS inferiore ma non uno strappo dello schermo. – oshyshko

+0

gli altri hanno ragione, che questo approccio non è molto adatto per il flash player ... tuttavia, sono stupito, non funziona affatto ... alcune domande: - hai provato a bloccare il bitmapData che sei attingere? (se no, questo può essere di grande aiuto!) - stai usando bitmap trasparenti? (killer delle prestazioni generali) - dir provate 'Stage :: invalidate' e il rendering su' Event.RENDER' invece del rendering? greetz back2dos – back2dos

risposta

7

Sento il tuo dolore mentre sono attualmente in trincea a sviluppare il mio gioco. Con le impostazioni predefinite, il renderizzatore di Flash produce problemi di lacerazione dello schermo/v-sync orribili, indipendentemente dal codice che si produce.

Questo è il motivo per cui sono stato contento di aver trovato la risposta più semplice ed elegante, che non era il codice di ri-factoring (che non aiuta un singolo bit, il problema è il lettore Flash, non il codice).

Abilitare semplicemente l'accelerazione hardware nelle impostazioni di pubblicazione. Sono disponibili due opzioni:

Livello 1: diretto; e Livello 2: GPU.

Per ulteriori informazioni, consultare la documentazione ufficiale: Specify publish settings for SWF files e decidere quale opzione è migliore per il proprio gioco.

Il mercato di destinazione gioca qui un fattore, se si tratta di un gioco serio per i giocatori, non è necessario preoccuparsi di possibili problemi di prestazioni, poiché molti giocatori hanno le GPU.

This article non mi ha fornito specificamente la soluzione, ma mi guida nella giusta direzione. MA, se il tuo gioco si trova in una finestra del browser, potresti dover utilizzare la stessa tecnica per impostare wmode su direct o gpu.

+0

Ti capita di sapere se esiste un attributo di tag metadata che può essere specificato per quello? (Per giochi Flash-Show AS-only, senza FLAs). Qualcosa lungo le linee: [SWF (hardwareAcc = "gpu")] esiste? – bigp

+0

L'unico altro parametro che conosco è wmode, che può essere impostato nel file html che incorpora il file Flash. Sono sicuro che ci deve essere qualcosa che può raggiungere questo obiettivo senza l'IDE Flash. –

+0

Qual è la conclusione? Questo è davvero un problema di Flash Player e non possiamo fare nulla per migliorarlo? –

-4

prima cosa si potrebbe desiderare di fare è smettere di trattare il Flash Player come se fosse DOS. Il Flash Player è un motore di gioco 2D altamente ottimizzato così com'è e non capisco perché stai cercando di reinventare la ruota copiando molte sezioni di bitmap. Ovviamente avrai problemi di prestazioni.

Flash Player non consente di sincronizzarsi con spazi vuoti verticali o orizzontali perché il Flash Player semplicemente non ha alcun concetto di questo.

Personalmente penso che dovresti ripensare ad avvicinarti se vuoi un'animazione più "fluida". Il Flash Player è sicuramente in grado di farlo, stai solo provando l'approccio sbagliato.

+2

Strana cosa, copiare mandrini di byte (bitmap) nella memoria dovrebbe essere più semplice per il computer piuttosto che renderlo matematico calcoli. Ci dovrebbe essere una ragione per cui "cacheAsBitmap" esiste in Flash. Inoltre, controlla questo: http://aralbalkan.com/759 – oshyshko

+0

I tuoi Sprites (DisplayObject's) non devono necessariamente essere vettoriali. Flash Player è ottimizzato per far fronte a questo. Quando inizi a ricreare in ActionScript con bitmap ciò che il Flash Player già fa molto bene e viene ottimizzato, allora ti manca solo il punto. Penso che dovresti leggere di più sul blog di Tinic Uro: http://www.kaourantin.net – Luke

+2

@Luke: la tua risposta sarebbe più utile se suggerisse un'alternativa pratica, piuttosto che dire che l'approccio originale è sbagliato. Ci sono diverse fonti online che suggeriscono l'uso di bitmap e copyToPixels nel contesto della creazione di giochi 2D, quindi non è il poster originale a reinventare. – Kylotan

-5

Non salvare le cose in BitmapData, che ucciderà, ucciderà assolutamente la tua app. Bitmap Data non è molto performante.

Rendi tutti gli elementi di gioco in flash, come Sprites (o MovieClip se necessario), e poi lavora come Flash doveva funzionare, come una piattaforma di animazione vettoriale. Non è mai stato ottimizzato per la grafica bitmap 2d. La grafica vettoriale 2D funziona bene e, anche se importi bitmap, funzioneranno meglio spostandoli in un oggetto BitmapData.

+0

Se dovrò rinunciare al buffering e aggiungere bitmap come sprite nativi Flash (ancora bitmap), allora risolverà il problema VSYNC? – oshyshko

+0

No non lo farà. Ma sembrerà molto meglio di quello che hai attualmente. Come ho detto nella mia risposta alla tua domanda, il Flash Player non ha alcun concetto di vsync. Quando imposti il ​​fps su 60 (il che è assurdo ma è accanto al punto), il Flash Player tenterà di generare 60 fps. In realtà non lo realizzerà quasi mai. – Luke

+1

Ho trovato che ci sono definitivamente volte che dovresti usare Bitmapdata per migliorare le prestazioni. –

Problemi correlati