Allegro Doublebuffering Problem -> Geschwindigkeitsverlust
-
Wahh, hast recht! Allegro ist ja wieder was Anderes. Nur die Performance scheint genau so mies zu sein, sonst gelten die "Meine Blit-Aufrufe sind zu langsam" ja immer der SDL.
Bye, TGGC (Für echte Fans)
-
Also was ich jetzt nicht verstehe, wo erstelle/lösche ich denn andauernd Bitmaps?!
Ich erstelle sie doch vor/nach der while-Schleife und nicht mittendrin.
Das möchte ich mal erklärt haben
-
also ich hab mich mit allegro noch nicht so sehr befasst, aber aquire_bitmap() deutet darauf hin, dass Speicher allokiert wird. während release_bitmap() danach klingt, den speicher wieder frei zu geben.
@ TGGC - sowas kommt vor.. bei mir ständig.
Die SDL ist übrigens ziemlich schnell, wenn man es richtig macht. Wenn mann allerdings anstelle den DirectX-Modus zu nutzen beim Initialisieren der SDL den Layer für die WinAPI nutzt, ist man selbst schuld..
Naja, ich nutze die SDL auch nur zum Initialisieren von openGL, etc..
-
Ok,ich gehe heute erst mal in der Schule Karneval feiern und dann versuche ich mal,den Buffer mit draw_sprite direkt zu zeichnen (geht mit "screen").Hab das auch shcon genmacht und es läuft sehr schnell,aber da verfälschen sich die Werte der Farbtiefe,da muss ich nochmal nachhaken und schauen,wie man das bei der Funktion Draw_Sprite einstellt.
Ich poste dann mal das ergebnis!
-
Joa, mache das. Immerhin soll das Forum nicht nur denen helfen die die Fragen stellen..
-
uhm.... also ich hab schon lang nix mehr mit Allegro gemacht, aber: lass einfach mal die Aufrufe von acquire_bitmap und release_bitmap weg, die brauchst du IIRC nur, wenn du per-pixel Aenderungen am Bitamp vornimmst!
-
Ne das bringt nichts. Das habe ich vorher schon ausprobiert.
Ich bin gerade dabei die Palette zu setzen. Also damit der Draw_sprite befehl weiß,mit welchen Farbeinstellung er es zu tun hat. Normalerweise mache ich das ja schon bei initialisieren (set_color_depth()) aber das will nicht klappen. Muss dann die set_color() Funktion benutzen. Bin gerade am suchen,wie man sie richtig anwendet (Ja ich habe die Allegro-Hilfe).
-
So,nun hab ich es geschafft.
Habe jetzt eine Mischung aus Buffer und Pageflip gemacht (=Triplebuffer wenn ich mich nicht irre!).
Falls interresse besteht,poste ich mal den Code für diejenigen die das Problem auch haben/bekommen.
-
ich würds einfach tun - gebrauchen könnens immer einige
-
Einmal die Funktionen:
void cls(BITMAP *active) { clear_to_color(active, makecol32(0, 0, 0)); } void flip(BITMAP *active_page, BITMAP *page1, BITMAP *page2, BITMAP *buffer, int flip) { buffer = active_page; if (flip == 1 ) { vsync(); } blit(buffer,screen,0,0,0,0,SCREEN_W,SCREEN_H); if (active_page == page1) { active_page = page2; } else { active_page = page1; } }
Und die Main.cpp:
#include <allegro.h> #include "cInitAllegro.cpp" #include "cGraphics.cpp" cGraphics Graphics; cInitAllegro init_Allegro; int main(void) { init_Allegro.init(1024, 768, 32, 0); BITMAP *buffer = create_video_bitmap(SCREEN_W,SCREEN_H); BITMAP *Ball = Graphics.loadimage("Ball.bmp"); BITMAP *page1 = create_video_bitmap(SCREEN_W, SCREEN_H); BITMAP *page2 = create_video_bitmap(SCREEN_W, SCREEN_H); BITMAP *page3 = create_video_bitmap(SCREEN_W, SCREEN_H); BITMAP *active_page; active_page = page1; int x = 0; int y = 0; while(!key[KEY_ESC]) { if(key[KEY_LEFT]) { x = x-5; } if(key[KEY_RIGHT]) { x = x+5; } if(key[KEY_UP]) { y = y-5; } if(key[KEY_DOWN]) { y = y+5; } Graphics.cls(active_page); Graphics.drawimage(active_page,Ball,x,y,10,10); Graphics.flip(active_page, page1, page2, buffer,0); } destroy_bitmap(buffer); destroy_bitmap(Ball); destroy_bitmap(page1); destroy_bitmap(page2); } END_OF_MAIN();
Hoffe das es anderen hilft