Allegro Doublebuffering problem...



  • Wollte nem Kumpel helfen der grad mit Allegro rumhantiert.Und zwar hat er folgendes Problem,er hatte beim bewegen des Bitmaps ein Flackern,das hat er mit Doublebuffering gelößt,nur nach kurzer zeit geht garnichts mehr oder zumindest total ruckelig.Ich denke das hat irgendwie mit der Freigabe des Buffers zutun....hier sein Quelltext.

    if(key[KEY_RIGHT])
    {
     BITMAP *doublebuffer1 =create_bitmap(SCREEN_W,SCREEN_H);
     BITMAP *logo =load_bitmap("00.bmp",NULL);
     acquire_bitmap(doublebuffer1);
     clear(doublebuffer1);
     blit(logo,doublebuffer1,0,0,x,y,logo->w,logo->h);
     x+=1;
     if(x+logo->w>SCREEN_W){x=SCREEN_W-logo->w;};
     release_bitmap(doublebuffer1);
     blit(doublebuffer1,screen,0,0,0,0,SCREEN_W,SCREEN_H);
    }
    if(key[KEY_LEFT])
    {
     BITMAP *doublebuffer2 =create_bitmap(SCREEN_W,SCREEN_H);
     BITMAP *logo =load_bitmap("01.bmp",NULL);
     acquire_bitmap(doublebuffer2);
     clear(doublebuffer2);
     blit(logo,doublebuffer2,0,0,x,y,logo->w,logo->h);
     x-=1;
     if(x<0){x=0;};
     release_bitmap(doublebuffer2);
     blit(doublebuffer2,screen,0,0,0,0,SCREEN_W,SCREEN_H);
    }
    if(key[KEY_DOWN])
    {
     BITMAP *doublebuffer3 =create_bitmap(SCREEN_W,SCREEN_H);
     BITMAP *logo =load_bitmap("02.bmp",NULL);
     acquire_bitmap(doublebuffer3);
     clear(doublebuffer3);
     blit(logo,doublebuffer3,0,0,x,y,logo->w,logo->h);
     y+=1;
     if(y+logo->h>SCREEN_H){y=SCREEN_H-logo->h;};
     release_bitmap(doublebuffer3);
     blit(doublebuffer3,screen,0,0,0,0,SCREEN_W,SCREEN_H);
    }
    if(key[KEY_UP])
    {
     BITMAP *doublebuffer4 =create_bitmap(SCREEN_W,SCREEN_H);
     BITMAP *logo =load_bitmap("03.bmp",NULL);
     acquire_bitmap(doublebuffer4);
     clear(doublebuffer4);
     blit(logo,doublebuffer4,0,0,x,y,logo->w,logo->h);
     y-=1;
     if(y<0){y=0;};
     release_bitmap(doublebuffer4);
     blit(doublebuffer4,screen,0,0,0,0,SCREEN_W,SCREEN_H);
    }
    

    Also der Speicher wird doch mit release_bitmap()freigegeben?Wieso ruckelt es dann noch?wir haben auch schon release_screen() versucht wird auch nicht besser...



  • Zur Laufzeit sollte man möglichst kein Buffer anlegen/löschen.

    Bye, TGGC (Der Held bei Dir!)



  • Tipp: leg nur einen doublebuffer an, und verwend immer den 😉



  • hallo,
    Kein wunder das dein programm mit der zeit langsam wird du erstellst bei jeden hauptschleifendurchlauf mehrere bitmaps.

    //...........
    BITMAP *logo =load_bitmap("00.bmp",NULL); 
    BITMAP *buffer = create_bitmap(SCREEN_W,SCREEN_H); 
    //der doublebuffer wird zu biginn des programms erstellt!!
    
    while(true){
    
    acquire_bitmap(buffer); 
    clear(buffer); 
    
      if(key[KEY_RIGHT]){ //tastenabfrage
        x++;
        blit(logo,buffer,0,0,x,y,logo->w,logo->h); 
        //....
      }
    
      //.............
    
      release_bitmap(buffer); 
      blit(buffer,screen,0,0,0,0,SCREEN_W,SCREEN_H); 
    
    }
    
    destroy_bitmap(buffer);
    destroy_bitmap(logo);
    

    😃



  • Danke!Das hat geholfen....


Log in to reply