[ Allegro 5.2.11 ] al_put_pixel and al_get_pixel very very slow compared to A4 !
SilverTES

Is there any other solution for that ?

{"name":"screenshot.png","src":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/8\/f\/8ff2e540f5939052d380e14572e8a488.png","w":1267,"h":717,"tn":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/8\/f\/8ff2e540f5939052d380e14572e8a488"}screenshot.png

Here my A5 function for determinant the sprite size by one-click on it (I know it's not the really best algo but in A4 it's really fast !):

#SelectExpand
1bool findMaxSize(ALLEGRO_BITMAP * bmp,int x, int y, ALLEGRO_COLOR transcolor, int &minX, int &minY, int &maxX, int &maxY) 2{ 3 ALLEGRO_COLOR current; 4 al_lock_bitmap(bmp, ALLEGRO_PIXEL_FORMAT_ANY_32_NO_ALPHA, ALLEGRO_LOCK_READONLY); 5 current=al_get_pixel(bmp,x,y); 6 al_unlock_bitmap(bmp); 7 //if(current!=transcolor) 8 if (memcmp(&current, &transcolor, sizeof(ALLEGRO_COLOR))) 9 { 10 if (x>0 && x<SCRW && y>0 && y<SCRH) 11 { 12 if (x<minX) minX = x; 13 if (x>maxX) maxX = x; 14 if (y<minY) minY = y; 15 if (y>maxY) maxY = y; 16 17 al_set_target_bitmap(bmp); 18 al_lock_bitmap(bmp, ALLEGRO_PIXEL_FORMAT_ANY_32_NO_ALPHA, ALLEGRO_LOCK_WRITEONLY); 19 al_put_pixel(x,y,transcolor); 20 al_unlock_bitmap(bmp); 21 findMaxSize(bmp,x+1,y,transcolor, minX, minY, maxX, maxY); 22 findMaxSize(bmp,x-1,y,transcolor, minX, minY, maxX, maxY); 23 findMaxSize(bmp,x,y+1,transcolor, minX, minY, maxX, maxY); 24 findMaxSize(bmp,x,y-1,transcolor, minX, minY, maxX, maxY); 25 26 findMaxSize(bmp,x-1,y-1,transcolor, minX, minY, maxX, maxY); 27 findMaxSize(bmp,x+1,y-1,transcolor, minX, minY, maxX, maxY); 28 findMaxSize(bmp,x-1,y+1,transcolor, minX, minY, maxX, maxY); 29 findMaxSize(bmp,x+1,y+1,transcolor, minX, minY, maxX, maxY); 30 } 31 return true; 32 } 33 else 34 { 35 return false; 36 } 37}

However, in allegro 5 with theses 'pixel' functions, the result is over extremely too slow ! O_o

Edgar Reynaldo

Some tips : Lock the bitmap once, and once only. Second, lock the bitmap in it's native format. You're using al_get_pixel, so it has to convert to an ALLEGRO_COLOR anyway. Third, compare a test pixel and the binary values directly. You can always leave a single pixel transparent in the upper left for testing purposes. Or in some other corner out of the way.

Rodolfo Lam

It might be worth to add that Allegro 5 does not really like accessing individual pixels at all, be it reading or writing them.

The problem is that Allegro no longer draws to system memory but to a GPU, and their memory cannot be directly accessed by the CPU. Allegro 4 was a software renderer so that kind of procedure you were previously doing were essentially the same as other memory operations.

I still don't understand shaders that well, but consider investigating them. They could possibly speed up your code, since now they are the ones with direct pixel access.

Failed that, you could try approaching the problem from another perspective, perhaps wrapping your individual bitmaps in some sort of structure with some metadata, that way you can store some pre-calculated values that can help on the calculation.

Thread #616582. Printed from Allegro.cc