2011-12-21 7 views
6

Attualmente sto sviluppando un progetto con SDL. In pratica disegna e sposta immagini (superfici) sullo schermo.Qual è il modo più rapido per cancellare un blocco di memoria (o una superficie SDL)?

Per spostare un'immagine senza lasciare una traccia, è necessario prima rimuovere la superficie schermo, più o meno come glClear(), e sto facendo attualmente con un semplice ciclo for iterazione sopra pixel della superficie (anche disegno una scatola nera sulla superficie o memset).

Mentre le soluzioni precedenti funzionano bene per le piccole superfici, diventano sempre più lente man mano che la superficie si ingrandisce, quindi ho cercato il modo più veloce per cancellare (zero) un blocco di memoria.

Inoltre, un amico ha sottolineato che l'utilizzo delle istruzioni SIMD poteva fare il lavoro molto velocemente, ma l'ultima volta che ho fatto ASM era su un 8085, qualsiasi intuizione su questo potrebbe anche essere utile.

risposta

13

Il modo più veloce è utilizzare memset.

memset(ptr, 0, length); 

Questo utilizza automaticamente SIMD su architetture che supportano *. Non hai intenzione di batterlo. È già legato alla memoria, quindi scrive gli zeri tanto velocemente quanto il processore può sputarli. Non so chi ti abbia detto che memset è più lento per i blocchi più grandi, ma dovresti smettere di ascoltare quella persona.

* Ci sono alcuni toolchain che non ti danno un veloce memset. È improbabile che ne stiate usando uno.

+1

In realtà, si applica solo alle funzioni SDL, non ha verificato accuratamente memset. <* Ci sono alcuni toolchain che non ti danno un memset veloce> Alcuni toolchains PIC MCU, per esempio (non il caso ovviamente) – NeonMan

+0

Beh, è ​​un po 'strano eseguire SDL su un microcontrollore PIC, dopo tutto, e il PIC non ha SIMD. –

+0

YMMV. La mia esperienza è che memset è abbastanza lento. Quelli che ho guardato all'origine per fare solo set di byte. Ho avuto un grande successo scrivendo il mio che (per aree più grandi) usa scritture più grandi per le sezioni centrali (solo usando piccole scritture alle estremità come necessario). –

3

Si consiglia di provare memset, l'implementazione deve essere altamente ottimizzata per sfruttare tutte le istruzioni disponibili sul sistema.