Oppure

Loading
03/10/10 16:46
bios1993
Salve, volevo chiedervi un opinione.
Il mio problema è che sto cercando di "disegnare a schermo" delle Surface, ma il processo è abbastanza lento, per non dire lentissimo

void WORLD::draw(SDL_Surface *screen,int scroll_x,int scroll_y,int &numnpg)
{
    SDL_Rect scroll;//scroll della mappa
    scroll.x = scroll_x;
    scroll.y = scroll_y;
    SDL_BlitSurface(WORLD::layer1,NULL,temp_screen,NULL);
    SDL_BlitSurface(WORLD::layer2,NULL,temp_screen,NULL);
    SDL_BlitSurface(WORLD::temp_screen,NULL,screen,&scroll);
}


la strategia che ho utilizzato mi serve per lo scroll sul video dell'immagine, per caso conoscete come si puo ottimizzare questo processo o conoscete un metodo migliore per lo scroll
aaa
03/10/10 18:19
ti conviene creare un doppiobuffering che agisca indipententemente e poi modifichi solamente le cordinate dell'oggetto che vuoi disegnare

esempio :

void doublebuffering()
{
 ...
}

...

void WORLD::draw(<classe> map,int scroll_x,int scroll_y)
{
  map.draw(x,y);
}


dove map è una classe che contiene una SDL_Surface per l'immagine da caricare
e map.draw(x,y) è un metodo che fa il blit dell'immagine nelle cordinate specificate
03/10/10 21:53
TheKaneB
@carlduke: SDL gestisce in automatico il double buffering. Basta creare la surface dello schermo con le opzioni HWSURFACE e DOUBLEBUFFERING (consulta il manuale), e alla fine di tutte le operazioni di blitting basta chiamare SDL_Flip(screen).
aaa
04/10/10 13:28
Postato originariamente da TheKaneB:

@carlduke: SDL gestisce in automatico il double buffering. Basta creare la surface dello schermo con le opzioni HWSURFACE e DOUBLEBUFFERING (consulta il manuale), e alla fine di tutte le operazioni di blitting basta chiamare SDL_Flip(screen).



è vero ma se tu crei un metodo doppiobuffering() che fa il Flip in automatico dello schermo, alla fine di ogni operazione di blittng non hai bisogno di richiamarlo xD
04/10/10 14:04
TheKaneB
Postato originariamente da carlduke:

Postato originariamente da TheKaneB:

@carlduke: SDL gestisce in automatico il double buffering. Basta creare la surface dello schermo con le opzioni HWSURFACE e DOUBLEBUFFERING (consulta il manuale), e alla fine di tutte le operazioni di blitting basta chiamare SDL_Flip(screen).



è vero ma se tu crei un metodo doppiobuffering() che fa il Flip in automatico dello schermo, alla fine di ogni operazione di blittng non hai bisogno di richiamarlo xD


No, in realtà in quel modo crei un TRIPLO buffering, un backbuffer glielo metti tu, e il secondo glielo mette SDL. Oltre ad essere uno spreco di memoria, aumenta ancora di più il lagging...
aaa
04/10/10 15:49
mmm...ma con il metodo non devi piu richiamare SDL_Flip(SDL_Surface*)
04/10/10 16:29
TheKaneB
Postato originariamente da carlduke:

mmm...ma con il metodo non devi piu richiamare SDL_Flip(SDL_Surface*)


avresti comunque delle prestazioni basse, perchè dovresti rifare un trasferimento verso la memoria video. La scrittura su memoria video è un processo notoriamente lento.
Il doppio buffering gestito via hardware, tramite SDL, tiene entrambi i framebuffers sulla memoria video.

In questo modo il flip si traduce in un semplice scambio di puntatori nei registri della GPU.
aaa