Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
Guida SDL - Reblitting parziale

Guida SDL

Capitolo 9° - Reblitting parziale

<< Precedente Prossimo >>
Reblitting: il parziale è più rapido?



Uno dei più grandi problemi che ci possono assillare è l'ottimizzazione dell'applicazione, così da poterla rendere funzionale nei PC più lenti.

I più attenti, riguardo il capitolo precedente, si saranno chiesti: "Ridisegnando l'intera superficie ad ogni ciclo di gioco non rallenterà di molto l'applicazione?". Per capire se questo è vero tentiamo di realizzare un Reblitting parziale, cioè

Sappiamo che l'UpdateRect è già ottimizzato, in quanto aggiorna visivamente solo la superficie modificata con il BlitSurface, quindi perché non migliorare la nostra tecnica di Blitting?

    L'idea è questa: dobbiamo spostare l'immagine da un'area A ad una B; dopo aver calcolato l'area B, copiamo in una SDL_Rect temporanea A e, nel ciclo successivo prima si ridisegnerà lo sfondo solo nell'area A, poi si procederà con il Blitting dell'immagine in B (chiaramente tutto questo si farà solo se (A != B)).
Per sfruttare questo concetto anche con più oggetti dinamici è sufficiente creare una lista (preferibilmente puntata) di SDL_Rect che, ad ogni ciclo, conterranno le aree degli oggetti che si stanno spostando, basterà dunque ridisegnare lo sfondo solo dove c'è movimento.

La domanda più ovvia alla quale voglio dare una risposta è: "Dov'è il problema? Implementiamo questo concetto e tutto sarà più veloce". Non sono d'accordo perché penso al caso più pessimistico, e cioè ad un'applicazione con un numero di oggetti dinamici tale da rendere le operazioni di copia delle SDL_Rect temporanee complesse a tal punto da rallentare l'applicazione. E' evidente che è più rapido ridisegnare il meno possibile dello sfondo, ma si deve capire che la funzione SDL_BlitSurface è relativamente lenta, quindi è meglio richiamarla il meno volte possibile: è più efficace quindi disegnare una volta l'intero sfondo che molte volte piccoli pezzetti di esso. A sommarsi a questo c'è il tempo impiegato per la gestione delle aree temporanee, anche se si tratta di un problema minimo in confronto al richiamare più volte la funzione BlitSurface.

Ulteriore difficoltà da affrontare: se si intende utilizzare una mappa scorrevole e più sfondi, si devono gestire contemporaneamente il Reblitting e lo scroll, il che non è cosa da poco. Nelle applicazioni più avanzate viene calcolato un limite, valicato il quale questa tecnica diventa svantaggiosa; quindi utilizzo del metodo più vantaggioso.

Negli esempi preferisco non trattare questo problema in quanto intendo mantenere una semplicità di codice tale da renderne l'analisi il più facile possibile.

<< Precedente Prossimo >>
A proposito dell'autore

Laurea in Ingegneria Informatica. Conosco i linguaggi C/C++, Java, Delphi, jsp e servlet, php, SQL,Bash,R,Matlab; mi sono interessato di: librerie SDL e OpenGL, Ogre3D e Ode, MFC e CLR, winsock. Conoscenza base di: VB, Assembly. Ottenuti i certificati CCNA 1,2,3,4° semestre.