Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++][Allegro5] Wypełnienie bitmapa jednym kolorem (Pomijanie Alpha)

Ostatnio zmodyfikowano 2016-01-18 23:29
Autor Wiadomość
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:
C/C++
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
P-143722
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
P-143724
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
P-143725
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 ;)
P-143726
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:
C/C++
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 );
P-143727
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
P-143730
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:
C/C++
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++;
        //unsigned char b = *row2++;
        //unsigned char g = *row2++;
        //unsigned char r = *row2++;
        // lub
        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.
P-143732
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
P-143734
« 1 » 2
  Strona 1 z 2 Następna strona