00Andre Temat założony przez niniejszego użytkownika |
[C++][Allegro5] Wypełnienie bitmapa jednym kolorem (Pomijanie Alpha) » 2016-01-18 10:24:30 Siemka Mam mały problem, otóż potrzebuję każdego bitmapa wypełnić danym kolorem omijając alpha. Więc zrobiłem najprościej za pomocą al_get_pixel( bitmap, x, y ) i al_put_pixel( x, y, color ) , ale ta funkcja bardzo powoli idzie i spowalnia projekt i trzeba czekać. Przy jednym to się trochę poczeka, a jak będzie około 100 i co wtedy ? Oto kod: al_set_target_bitmap( bitmap ); for( unsigned py = 0; py < h; py++ ) { for( unsigned px = 0; px < w; px++ ) { ALLEGRO_COLOR pxg = al_get_pixel( bitmap, px, py ); if( pxg.a != 0 ) { al_put_pixel( px, py, color ); } } }
Bardzo mi to jest potrzebne, czy nie dało by rade szybciej i efektywnej zrobić ? Pozdrawiam |
|
darko202 |
» 2016-01-18 10:50:21 nie pracowałem w allegro, ale optymalizację zacząłbym od linii ALLEGRO_COLOR pxg = al_get_pixel( bitmap, px, py );
zastanów się dlaczego tworzysz wielokrotnie zmienną pxg, wystarczy raz to na pewno spowalnia program |
|
00Andre Temat założony przez niniejszego użytkownika |
» 2016-01-18 10:55:34 Może nie potrzebnie tworzyłem w pętli. Poprawiłem to, ale to nic nie zmienia w czasie wykonania |
|
j23 |
» 2016-01-18 11:09:31 @darko202, bez przesady. ALLEGRO_COLOR to prosta struktura z czterema polami, koszt jej utworzenia jest żaden - nie ma wywołania konstruktora, na stosie tworzona jest raz, w prologu funkcji.
@00Andre, Wąskim gardłem są wywołania al_get_pixel i al_put_pixel. Operuj bezpośrednio na pamięci bitmapy. Nie znam allegro, ale chyba funkcja al_lock_bitmap jest tym, czego Ci trzeba ;) |
|
00Andre Temat założony przez niniejszego użytkownika |
» 2016-01-18 11:32:03 @j23 wcześniej próbowałem z al_lock_bitmap() . Spróbowałem ponownie i udało się ;) Wcześniej tylko blokowałem ALLEGRO_LOCK_READONLY lub ALLEGRO_LOCK_WRITEONLY teraz dałem ALLEGRO_LOCK_READWRITE i działa szybko i fajnie ;) Oto kod: al_set_target_bitmap( bitmap ); for( unsigned py = 0; py < h; py++ ) { for( unsigned px = 0; px < w; px++ ) { al_lock_bitmap( bitmap, al_get_bitmap_format( bitmap ), ALLEGRO_LOCK_READWRITE ); ALLEGRO_COLOR pxg = al_get_pixel( bitmap, px, py ); if( pxg.a != 0 ) { al_put_pixel( px, py, color ); } } } al_unlock_bitmap( bitmap );
|
|
Szadziu |
» 2016-01-18 12:55:39 al_lock_bitmap( bitmap, al_get_bitmap_format( bitmap ), ALLEGRO_LOCK_READWRITE ); to powinno być przed forem zapewne |
|
j23 |
» 2016-01-18 14:11:23 @ 00Andre, nie o to mi chodziło. Użyłeś funkcji, o której wspomniałem, ale nie pozbyłeś się głównego problemu, czyli wywołań al_get_pixel i al_put_pixel. Miałem na myśli coś takiego: ALLEGRO_LOCKED_REGION * rgn = al_lock_bitmap( bitmap, ALLEGRO_PIXEL_FORMAT_ABGR_8888, ALLEGRO_LOCK_READWRITE );
unsigned char * row1 =( unsigned char * ) rgn->data;
for( unsigned py = 0; py < h; py++ ) { unsigned char * row2 = row1; for( unsigned px = 0; px < w; px++ ) { unsigned char a = * row2++; row2 += 3; if( a != 0 ) { unsigned char * pix = row2 - 4; * pix++ = color.a; * pix++ = color.b; * pix++ = color.g; * pix = color.r; } } row1 += rgn->pitch; }
al_unlock_bitmap( bitmap ); Nie wiem, czy to będzie działać, bo opieram się wyłącznie na dokumentacji. Głównie chodzi o pokazanie samej idei. |
|
00Andre Temat założony przez niniejszego użytkownika |
» 2016-01-18 15:08:12 Ale u mnie był problem z powolnością wykonania tego. Użyłem READWRITE blokowanie i mi to pomogło w problemie |
|
« 1 » 2 |