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
C/C++ - [SDL]Problemi di performance
Forum - C/C++ - [SDL]Problemi di performance

Avatar
bios1993 (Normal User)
Pro


Messaggi: 64
Iscritto: 18/01/2009

Segnala al moderatore
Postato alle 18:46
Domenica, 03/10/2010
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

Codice sorgente - presumibilmente C#

  1. void WORLD::draw(SDL_Surface *screen,int scroll_x,int scroll_y,int &numnpg)
  2. {
  3.     SDL_Rect scroll;//scroll della mappa
  4.     scroll.x = scroll_x;
  5.     scroll.y = scroll_y;
  6.     SDL_BlitSurface(WORLD::layer1,NULL,temp_screen,NULL);
  7.     SDL_BlitSurface(WORLD::layer2,NULL,temp_screen,NULL);
  8.     SDL_BlitSurface(WORLD::temp_screen,NULL,screen,&scroll);
  9. }



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


PM
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1787
Iscritto: 26/06/2009

Up
1
Down
V
Segnala al moderatore
Postato alle 16:04
Lunedì, 04/10/2010
Testo quotato

Postato originariamente da carlduke:

Testo quotato

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...


Software Failure: Guru Meditation
Forum su Informatica, Elettronica, Robotica e Tecnologia: http://www.nonsoloamiga.com
PM
Avatar
()
Newbie


Messaggi:
Iscritto:

Up
1
Down
V
Segnala al moderatore
Postato alle 17:49
Lunedì, 04/10/2010
mmm...ma con il metodo non devi piu richiamare SDL_Flip(SDL_Surface*)

PM
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1787
Iscritto: 26/06/2009

Up
1
Down
V
Segnala al moderatore
Postato alle 18:29
Lunedì, 04/10/2010
Testo quotato

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.


Software Failure: Guru Meditation
Forum su Informatica, Elettronica, Robotica e Tecnologia: http://www.nonsoloamiga.com
PM
Avatar
()
Newbie


Messaggi:
Iscritto:

Up
0
Down
V
Segnala al moderatore
Postato alle 20:19
Domenica, 03/10/2010
ti conviene creare un doppiobuffering che agisca indipententemente e poi modifichi solamente le cordinate dell'oggetto che vuoi disegnare

esempio :

Codice sorgente - presumibilmente C++

  1. void doublebuffering()
  2. {
  3.  ...
  4. }
  5.  
  6. ...
  7.  
  8. void WORLD::draw(<classe> map,int scroll_x,int scroll_y)
  9. {
  10.   map.draw(x,y);
  11. }



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

PM
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1787
Iscritto: 26/06/2009

Up
0
Down
V
Segnala al moderatore
Postato alle 23:53
Domenica, 03/10/2010
@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).


Software Failure: Guru Meditation
Forum su Informatica, Elettronica, Robotica e Tecnologia: http://www.nonsoloamiga.com
PM
Avatar
()
Newbie


Messaggi:
Iscritto:

Up
0
Down
V
Segnala al moderatore
Postato alle 15:28
Lunedì, 04/10/2010
Testo quotato

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

PM