<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>[ Allegro 5.2.11 ] al_put_pixel and al_get_pixel very very slow compared to A4 !</title>
		<link>http://www.allegro.cc/forums/view/616582</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Fri, 11 Nov 2016 05:24:46 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Is there any other solution for that ?</p><p><span class="remote-thumbnail"><span class="json">{"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"}</span><img src="http://www.allegro.cc//djungxnpq2nug.cloudfront.net/image/cache/8/f/8ff2e540f5939052d380e14572e8a488-240.jpg" alt="screenshot.png" width="240" height="135" /></span></p><p>Here my A5 function for determinant the sprite size by one-click on it (I know it&#39;s not the really best algo but in A4 it&#39;s really fast !):</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="k1">bool</span> findMaxSize<span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_BITMAP"><span class="a">ALLEGRO_BITMAP</span></a> <span class="k3">*</span> bmp,<span class="k1">int</span> x, <span class="k1">int</span> y, <a href="http://www.allegro.cc/manual/ALLEGRO_COLOR"><span class="a">ALLEGRO_COLOR</span></a> transcolor, <span class="k1">int</span> <span class="k3">&amp;</span>minX, <span class="k1">int</span> <span class="k3">&amp;</span>minY, <span class="k1">int</span> <span class="k3">&amp;</span>maxX, <span class="k1">int</span> <span class="k3">&amp;</span>maxY<span class="k2">)</span>
<span class="number">  2</span><span class="k2">{</span>
<span class="number">  3</span>    <a href="http://www.allegro.cc/manual/ALLEGRO_COLOR"><span class="a">ALLEGRO_COLOR</span></a> current<span class="k2">;</span>
<span class="number">  4</span>    <a href="http://www.allegro.cc/manual/al_lock_bitmap"><span class="a">al_lock_bitmap</span></a><span class="k2">(</span>bmp, ALLEGRO_PIXEL_FORMAT_ANY_32_NO_ALPHA, ALLEGRO_LOCK_READONLY<span class="k2">)</span><span class="k2">;</span>
<span class="number">  5</span>    current<span class="k3">=</span><a href="http://www.allegro.cc/manual/al_get_pixel"><span class="a">al_get_pixel</span></a><span class="k2">(</span>bmp,x,y<span class="k2">)</span><span class="k2">;</span>
<span class="number">  6</span>    <a href="http://www.allegro.cc/manual/al_unlock_bitmap"><span class="a">al_unlock_bitmap</span></a><span class="k2">(</span>bmp<span class="k2">)</span><span class="k2">;</span>
<span class="number">  7</span>    <span class="c">//if(current!=transcolor)</span>
<span class="number">  8</span>    <span class="k1">if</span> <span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_565.html" target="_blank">memcmp</a><span class="k2">(</span><span class="k3">&amp;</span>current, <span class="k3">&amp;</span>transcolor, <span class="k1">sizeof</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_COLOR"><span class="a">ALLEGRO_COLOR</span></a><span class="k2">)</span><span class="k2">)</span><span class="k2">)</span>
<span class="number">  9</span>    <span class="k2">{</span>
<span class="number"> 10</span>        <span class="k1">if</span> <span class="k2">(</span>x&gt;0 <span class="k3">&amp;</span><span class="k3">&amp;</span> x<span class="k3">&lt;</span>SCRW <span class="k3">&amp;</span><span class="k3">&amp;</span> y&gt;0 <span class="k3">&amp;</span><span class="k3">&amp;</span> y<span class="k3">&lt;</span>SCRH<span class="k2">)</span>
<span class="number"> 11</span>        <span class="k2">{</span>
<span class="number"> 12</span>            <span class="k1">if</span> <span class="k2">(</span>x<span class="k3">&lt;</span>minX<span class="k2">)</span> minX <span class="k3">=</span> x<span class="k2">;</span>
<span class="number"> 13</span>            <span class="k1">if</span> <span class="k2">(</span>x&gt;maxX<span class="k2">)</span> maxX <span class="k3">=</span> x<span class="k2">;</span>
<span class="number"> 14</span>            <span class="k1">if</span> <span class="k2">(</span>y<span class="k3">&lt;</span>minY<span class="k2">)</span> minY <span class="k3">=</span> y<span class="k2">;</span>
<span class="number"> 15</span>            <span class="k1">if</span> <span class="k2">(</span>y&gt;maxY<span class="k2">)</span> maxY <span class="k3">=</span> y<span class="k2">;</span>
<span class="number"> 16</span>
<span class="number"> 17</span>            <a href="http://www.allegro.cc/manual/al_set_target_bitmap"><span class="a">al_set_target_bitmap</span></a><span class="k2">(</span>bmp<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 18</span>            <a href="http://www.allegro.cc/manual/al_lock_bitmap"><span class="a">al_lock_bitmap</span></a><span class="k2">(</span>bmp, ALLEGRO_PIXEL_FORMAT_ANY_32_NO_ALPHA, ALLEGRO_LOCK_WRITEONLY<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 19</span>            <a href="http://www.allegro.cc/manual/al_put_pixel"><span class="a">al_put_pixel</span></a><span class="k2">(</span>x,y,transcolor<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 20</span>            <a href="http://www.allegro.cc/manual/al_unlock_bitmap"><span class="a">al_unlock_bitmap</span></a><span class="k2">(</span>bmp<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 21</span>            findMaxSize<span class="k2">(</span>bmp,x<span class="k3">+</span><span class="n">1</span>,y,transcolor, minX, minY, maxX, maxY<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 22</span>            findMaxSize<span class="k2">(</span>bmp,x-1,y,transcolor, minX, minY, maxX, maxY<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 23</span>            findMaxSize<span class="k2">(</span>bmp,x,y<span class="k3">+</span><span class="n">1</span>,transcolor, minX, minY, maxX, maxY<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 24</span>            findMaxSize<span class="k2">(</span>bmp,x,y-1,transcolor, minX, minY, maxX, maxY<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 25</span>
<span class="number"> 26</span>            findMaxSize<span class="k2">(</span>bmp,x-1,y-1,transcolor, minX, minY, maxX, maxY<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 27</span>            findMaxSize<span class="k2">(</span>bmp,x<span class="k3">+</span><span class="n">1</span>,y-1,transcolor, minX, minY, maxX, maxY<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 28</span>            findMaxSize<span class="k2">(</span>bmp,x-1,y<span class="k3">+</span><span class="n">1</span>,transcolor, minX, minY, maxX, maxY<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 29</span>            findMaxSize<span class="k2">(</span>bmp,x<span class="k3">+</span><span class="n">1</span>,y<span class="k3">+</span><span class="n">1</span>,transcolor, minX, minY, maxX, maxY<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 30</span>        <span class="k2">}</span>
<span class="number"> 31</span>        <span class="k1">return</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 32</span>    <span class="k2">}</span>
<span class="number"> 33</span>    <span class="k1">else</span>
<span class="number"> 34</span>    <span class="k2">{</span>
<span class="number"> 35</span>        <span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 36</span>    <span class="k2">}</span>
<span class="number"> 37</span><span class="k2">}</span>
</div></div><p>



However, in allegro 5 with theses &#39;pixel&#39; functions, the result is over extremely too slow ! O_o
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (SilverTES)</author>
		<pubDate>Wed, 09 Nov 2016 05:16:48 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Some tips : Lock the bitmap once, and once only. Second, lock the bitmap in it&#39;s native format. You&#39;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.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Wed, 09 Nov 2016 05:44:20 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>It might be worth to add that Allegro 5 does not really like accessing individual pixels at all, be it reading or writing them.</p><p>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.</p><p>I still don&#39;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.</p><p>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.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Rodolfo Lam)</author>
		<pubDate>Fri, 11 Nov 2016 05:24:46 +0000</pubDate>
	</item>
</rss>
