Ĺadny brzuch
Ponizszy fragment kodu ma za zadanie wyswietlenie pieciu obrazkow na
piec losowych sposobow( losowanie odbywa się z setek grafik). Dzieje sie to po kliknieciu mysza. Wszystko jest ok, tylko, ze po kliknieciu trzeba poczekac "sekundkę" az program zareaguje na nastepne klikanie. Co robie zle? Obrazki sa bardzo male...
Na pl.comp.lang.c poradzono mi abym nie ladowal obrazkow przy kliknieciu mysza, tylko na starcie. Ale ladowanie kilkuset obrazkow na poczatku, to chyba nie jest dobry pomysl? Czy tez sie myle?
int wyswietl() { BITMAP *obrazek1 = NULL; BITMAP *obrazek2 = NULL; BITMAP *obrazek3 = NULL; BITMAP *obrazek4 = NULL; BITMAP *obrazek5 = NULL; int ktory; if (mouse_b & 1) //Jezeli nacisnieto lewy przycisk myszy... { srand(time(NULL)); ktory = rand()%5; switch (ktory) { case 0: obrazek1 = load_pcx("znaki/a1.pcx",default_palette); obrazek2 = load_pcx("znaki/a2.pcx",default_palette); obrazek3 = load_pcx("znaki/a4.pcx",default_palette); obrazek4 = load_pcx("znaki/a3.pcx",default_palette); obrazek5 = load_pcx("znaki/a5.pcx",default_palette); break; case 1: obrazek1 = load_pcx("znaki/a1.pcx",default_palette); obrazek2 = load_pcx("znaki/a5.pcx",default_palette); obrazek3 = load_pcx("znaki/a3.pcx",default_palette); [......................ciach...........................] } if(!obrazek1) { set_gfx_mode(GFX_TEXT,0,0,60,60); allegro_message("Problem!\n"); allegro_exit(); return 0; } if(!obrazek2) { set_gfx_mode(GFX_TEXT,0,0,60,60); allegro_message("Problem!\n"); allegro_exit(); return 0; } [...............ciach..............] scare_mouse(); blit(obrazek1,screen,0,0,150,100,obrazek1->w,obrazek1->h); blit(obrazek2,screen,0,0,250,100,obrazek2->w,obrazek2->h); [..........................ciach.........................] destroy_bitmap(obrazek1); destroy_bitmap(obrazek2); [........ciach..........] unscare_mouse(); } return 0; }
Źle robisz, że ładujesz obrazki od nowa przy każdym wyświetlaniu. Prawidłowy kod powinien ładować i usuwać obrazki jednokrotnie, a wyświetlanie powinno je tylko blit'ować. Podziel sobie kod funkcji wyswietl na trzy części - funkcję inicjuj, która wczyta obrazki, funkcje wyswietl, która je blituje na ekran, oraz funkcję deinicjuj, która obrazki skasuje. Funkcję inicjuj wywołujesz przed pętlą, funkcję wyswietl w pętli głównej, a funkcję deinicjuj za pętlą.
(...) Ale ladowanie kilkuset obrazkow na poczatku, to chyba nie jest dobry pomysl? Czy tez sie myle? Oj, tu się niestety właśnie mylisz ;) Po pierwsze, ładowanie obrazków jest bardzo kosztowną operacją - wymaga co najmniej jednego dynamicznego przydziału pamięci, jednego wczytania z pliku i konwersji na używany format. Takie operacje wykonuje się zawsze tak rzadko, jak tylko się da - podczas startu programu, przy ładowaniu poziomu, etc. Nie sądzę, żebyś wczytywał tak wiele obrazków, żeby przejmować się zajmowanym przez nie miejscem - masz do dyspozycji (prawie) cały RAM.
Pozdrawiam,
TeMPOraL.
BITMAP *obrazek[5] = { load_pcx("znaki/a1.pcx",default_palette), load_pcx("znaki/a2.pcx",default_palette), load_pcx("znaki/a3.pcx",default_palette), load_pcx("znaki/a4.pcx",default_palette), load_pcx("znaki/a5.pcx",default_palette) } int wyswietl() { int ciag[5]; int ktory; if (mouse_b & 1) //Jezeli nacisnieto lewy przycisk myszy... { srand(time(NULL)); ktory = rand()%5; switch (ktory) { case 0: ciag[0] = 0; ciag[0] = 1; ciag[0] = 3; ciag[0] = 2; ciag[0] = 4; break; case 1: [......................ciach...........................] } if(!obrazek1 || !obrazek2 || !obrazek3 || !obrazek4 || !obrazek5) { set_gfx_mode(GFX_TEXT,0,0,60,60); allegro_message("Problem!\n"); allegro_exit(); return 0; } [...............ciach..............] scare_mouse(); for(int i=0;i<5;i++) { stretch_sprite(screen, obrazek[ciag[i]],0,0,150 + i*100 ,100,obrazek[ciag[i]]->w,obrazek[ciag[i]]->h); } unscare_mouse(); } return 0; }
Twoj kod po kilku malych poprawkach...
Pewnie to sie da jeszcze bardziej zoptymalizowac, ale to co zrobilem powinno znacznie przyspieszyc twoj kod.
Dziekuje serdecznie! Zawsze sie jednak mozna ciekawych zeczy dowiedziec. A juz sie balem, ze C++ nie jest tak szybki jak mowia ;)
Dziekuje i pozdrawiam!
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
piec losowych sposobow( losowanie odbywa się z setek grafik). Dzieje sie to po kliknieciu mysza. Wszystko jest ok, tylko, ze po kliknieciu trzeba poczekac "sekundkę" az program zareaguje na nastepne klikanie. Co robie zle? Obrazki sa bardzo male...
Na pl.comp.lang.c poradzono mi abym nie ladowal obrazkow przy kliknieciu mysza, tylko na starcie. Ale ladowanie kilkuset obrazkow na poczatku, to chyba nie jest dobry pomysl? Czy tez sie myle?
int wyswietl() { BITMAP *obrazek1 = NULL; BITMAP *obrazek2 = NULL; BITMAP *obrazek3 = NULL; BITMAP *obrazek4 = NULL; BITMAP *obrazek5 = NULL; int ktory; if (mouse_b & 1) //Jezeli nacisnieto lewy przycisk myszy... { srand(time(NULL)); ktory = rand()%5; switch (ktory) { case 0: obrazek1 = load_pcx("znaki/a1.pcx",default_palette); obrazek2 = load_pcx("znaki/a2.pcx",default_palette); obrazek3 = load_pcx("znaki/a4.pcx",default_palette); obrazek4 = load_pcx("znaki/a3.pcx",default_palette); obrazek5 = load_pcx("znaki/a5.pcx",default_palette); break; case 1: obrazek1 = load_pcx("znaki/a1.pcx",default_palette); obrazek2 = load_pcx("znaki/a5.pcx",default_palette); obrazek3 = load_pcx("znaki/a3.pcx",default_palette); [......................ciach...........................] } if(!obrazek1) { set_gfx_mode(GFX_TEXT,0,0,60,60); allegro_message("Problem!\n"); allegro_exit(); return 0; } if(!obrazek2) { set_gfx_mode(GFX_TEXT,0,0,60,60); allegro_message("Problem!\n"); allegro_exit(); return 0; } [...............ciach..............] scare_mouse(); blit(obrazek1,screen,0,0,150,100,obrazek1->w,obrazek1->h); blit(obrazek2,screen,0,0,250,100,obrazek2->w,obrazek2->h); [..........................ciach.........................] destroy_bitmap(obrazek1); destroy_bitmap(obrazek2); [........ciach..........] unscare_mouse(); } return 0; }
Źle robisz, że ładujesz obrazki od nowa przy każdym wyświetlaniu. Prawidłowy kod powinien ładować i usuwać obrazki jednokrotnie, a wyświetlanie powinno je tylko blit'ować. Podziel sobie kod funkcji wyswietl na trzy części - funkcję inicjuj, która wczyta obrazki, funkcje wyswietl, która je blituje na ekran, oraz funkcję deinicjuj, która obrazki skasuje. Funkcję inicjuj wywołujesz przed pętlą, funkcję wyswietl w pętli głównej, a funkcję deinicjuj za pętlą.
(...) Ale ladowanie kilkuset obrazkow na poczatku, to chyba nie jest dobry pomysl? Czy tez sie myle? Oj, tu się niestety właśnie mylisz ;) Po pierwsze, ładowanie obrazków jest bardzo kosztowną operacją - wymaga co najmniej jednego dynamicznego przydziału pamięci, jednego wczytania z pliku i konwersji na używany format. Takie operacje wykonuje się zawsze tak rzadko, jak tylko się da - podczas startu programu, przy ładowaniu poziomu, etc. Nie sądzę, żebyś wczytywał tak wiele obrazków, żeby przejmować się zajmowanym przez nie miejscem - masz do dyspozycji (prawie) cały RAM.
Pozdrawiam,
TeMPOraL.
BITMAP *obrazek[5] = { load_pcx("znaki/a1.pcx",default_palette), load_pcx("znaki/a2.pcx",default_palette), load_pcx("znaki/a3.pcx",default_palette), load_pcx("znaki/a4.pcx",default_palette), load_pcx("znaki/a5.pcx",default_palette) } int wyswietl() { int ciag[5]; int ktory; if (mouse_b & 1) //Jezeli nacisnieto lewy przycisk myszy... { srand(time(NULL)); ktory = rand()%5; switch (ktory) { case 0: ciag[0] = 0; ciag[0] = 1; ciag[0] = 3; ciag[0] = 2; ciag[0] = 4; break; case 1: [......................ciach...........................] } if(!obrazek1 || !obrazek2 || !obrazek3 || !obrazek4 || !obrazek5) { set_gfx_mode(GFX_TEXT,0,0,60,60); allegro_message("Problem!\n"); allegro_exit(); return 0; } [...............ciach..............] scare_mouse(); for(int i=0;i<5;i++) { stretch_sprite(screen, obrazek[ciag[i]],0,0,150 + i*100 ,100,obrazek[ciag[i]]->w,obrazek[ciag[i]]->h); } unscare_mouse(); } return 0; }
Twoj kod po kilku malych poprawkach...
Pewnie to sie da jeszcze bardziej zoptymalizowac, ale to co zrobilem powinno znacznie przyspieszyc twoj kod.
Dziekuje serdecznie! Zawsze sie jednak mozna ciekawych zeczy dowiedziec. A juz sie balem, ze C++ nie jest tak szybki jak mowia ;)
Dziekuje i pozdrawiam!