<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Is this the right way of using al_hold_bitmap_drawing?</title>
		<link>http://www.allegro.cc/forums/view/617214</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Fri, 19 Jan 2018 01:20:12 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Hello.</p><p>Generally I&#39;m new to Allegro library. I&#39;m also new to these forums, so Hello everyone!<br />I&#39;m Carl, I&#39;m from Poland and currently working on a MMORPG game. </p><p>I&#39;ve been investigating different ways of accelerating map (2D) rendering and found this: <a href="https://www.allegro.cc/manual/5/al_hold_bitmap_drawing">https://www.allegro.cc/manual/5/al_hold_bitmap_drawing</a>. I&#39;ve implemented this idea in my code aand...</p><p>My question is... am I doing it in the right way? Here&#39;s my code:
</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>std::map<span class="k3">&lt;</span><span class="k1">unsigned</span> <span class="k1">int</span>, <a href="http://www.allegro.cc/manual/ALLEGRO_BITMAP"><span class="a">ALLEGRO_BITMAP</span></a> <span class="k3">*</span><span class="k3">&gt;</span> bitmaps<span class="k2">;</span>
<span class="number">  2</span>        std::map<span class="k3">&lt;</span><span class="k1">unsigned</span> <span class="k1">int</span>, std::vector<span class="k3">&lt;</span>std::shared_ptr<span class="k3">&lt;</span>Tile&gt;&gt;&gt; tiles_stagged<span class="k2">;</span>
<span class="number">  3</span>
<span class="number">  4</span>        <span class="k1">for</span><span class="k2">(</span><span class="k1">unsigned</span> <span class="k1">short</span> x <span class="k3">=</span> start_x<span class="k2">;</span> x <span class="k3">&lt;</span><span class="k3">=</span> end_x<span class="k2">;</span> <span class="k3">+</span><span class="k3">+</span>x<span class="k2">)</span>
<span class="number">  5</span>        <span class="k2">{</span>
<span class="number">  6</span>            <span class="k1">for</span><span class="k2">(</span><span class="k1">unsigned</span> <span class="k1">short</span> y <span class="k3">=</span> start_y<span class="k2">;</span> y <span class="k3">&lt;</span><span class="k3">=</span> end_y<span class="k2">;</span> <span class="k3">+</span><span class="k3">+</span>y<span class="k2">)</span>
<span class="number">  7</span>            <span class="k2">{</span>
<span class="number">  8</span>                std::shared_ptr<span class="k3">&lt;</span>Tile&gt; tile <span class="k3">=</span> this-&gt;layers<span class="k2">[</span><span class="k2">(</span>Layer::Type<span class="k2">)</span>i<span class="k2">]</span>.tiles<span class="k2">[</span>x<span class="k2">]</span><span class="k2">[</span>y<span class="k2">]</span><span class="k2">;</span>
<span class="number">  9</span>
<span class="number"> 10</span>                <span class="k1">if</span><span class="k2">(</span>tile <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span> <span class="k1">continue</span><span class="k2">;</span>
<span class="number"> 11</span>
<span class="number"> 12</span>                <a href="http://www.allegro.cc/manual/ALLEGRO_BITMAP"><span class="a">ALLEGRO_BITMAP</span></a> <span class="k3">*</span>tilegfx <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number"> 13</span>
<span class="number"> 14</span>                <span class="k1">if</span><span class="k2">(</span>bitmaps.find<span class="k2">(</span>tile-&gt;graphic_id<span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> bitmaps.end<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span>
<span class="number"> 15</span>                <span class="k2">{</span>
<span class="number"> 16</span>                    tilegfx <span class="k3">=</span> GFXLoader<span class="k2">(</span><span class="k2">)</span>.GetBitmap<span class="k2">(</span>gid_offset<span class="k2">[</span>i<span class="k2">]</span>, tile-&gt;graphic_id<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 17</span>                    bitmaps<span class="k2">[</span>tile-&gt;graphic_id<span class="k2">]</span> <span class="k3">=</span> tilegfx<span class="k2">;</span>
<span class="number"> 18</span>                <span class="k2">}</span>
<span class="number"> 19</span>
<span class="number"> 20</span>                <span class="k1">if</span><span class="k2">(</span>tile-&gt;x <span class="k3">&gt;</span><span class="k3">=</span> start_x <span class="k3">&amp;</span><span class="k3">&amp;</span> tile-&gt;x <span class="k3">&lt;</span><span class="k3">=</span> end_x <span class="k3">&amp;</span><span class="k3">&amp;</span> tile-&gt;y <span class="k3">&gt;</span><span class="k3">=</span> start_y <span class="k3">&amp;</span><span class="k3">&amp;</span> tile-&gt;y <span class="k3">&lt;</span><span class="k3">=</span> end_y<span class="k2">)</span>
<span class="number"> 21</span>                    tiles_stagged<span class="k2">[</span>tile-&gt;graphic_id<span class="k2">]</span>.push_back<span class="k2">(</span>tile<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 22</span>            <span class="k2">}</span>
<span class="number"> 23</span>        <span class="k2">}</span>
<span class="number"> 24</span>
<span class="number"> 25</span>        <span class="k1">for</span><span class="k2">(</span><span class="k1">auto</span> <span class="k3">&amp;</span>ts <span class="k2">:</span> tiles_stagged<span class="k2">)</span>
<span class="number"> 26</span>        <span class="k2">{</span>
<span class="number"> 27</span>            <a href="http://www.allegro.cc/manual/al_hold_bitmap_drawing"><span class="a">al_hold_bitmap_drawing</span></a><span class="k2">(</span><span class="k1">true</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 28</span>            <span class="k1">for</span><span class="k2">(</span><span class="k1">auto</span> <span class="k3">&amp;</span>tile <span class="k2">:</span> ts.second<span class="k2">)</span>
<span class="number"> 29</span>            <span class="k2">{</span>
<span class="number"> 30</span>                <span class="k1">if</span><span class="k2">(</span>bitmaps<span class="k2">[</span>ts.first<span class="k2">]</span> <span class="k3">=</span><span class="k3">=</span> NULL<span class="k2">)</span> <span class="k1">continue</span><span class="k2">;</span>
<span class="number"> 31</span>
<span class="number"> 32</span>                <span class="k1">int</span> screen_x <span class="k3">=</span> tile-&gt;x <span class="k3">*</span> <span class="n">64</span> <span class="k3">-</span> tile-&gt;x <span class="k3">*</span> <span class="n">32</span> <span class="k3">-</span> tile-&gt;y <span class="k3">*</span> <span class="n">32</span> <span class="k3">+</span> rx<span class="k2">;</span>
<span class="number"> 33</span>                <span class="k1">int</span> screen_y <span class="k3">=</span> tile-&gt;y <span class="k3">*</span> <span class="n">16</span> <span class="k3">+</span> tile-&gt;x <span class="k3">*</span> <span class="n">16</span> <span class="k3">+</span> ry<span class="k2">;</span>
<span class="number"> 34</span>
<span class="number"> 35</span>                <span class="k1">int</span> w <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_get_bitmap_width"><span class="a">al_get_bitmap_width</span></a><span class="k2">(</span>bitmaps<span class="k2">[</span>ts.first<span class="k2">]</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 36</span>                <span class="k1">int</span> h <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_get_bitmap_height"><span class="a">al_get_bitmap_height</span></a><span class="k2">(</span>bitmaps<span class="k2">[</span>ts.first<span class="k2">]</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 37</span>
<span class="number"> 38</span>                <span class="k1">if</span><span class="k2">(</span>i <span class="k3">=</span><span class="k3">=</span> <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span>Layer::Type::Object<span class="k2">)</span>
<span class="number"> 39</span>                <span class="k2">{</span>
<span class="number"> 40</span>                    <span class="k1">if</span><span class="k2">(</span>w <span class="k3">&gt;</span> <span class="n">64</span><span class="k2">)</span>
<span class="number"> 41</span>                    <span class="k2">{</span>
<span class="number"> 42</span>                        screen_x <span class="k3">-</span><span class="k3">=</span> w <span class="k3">/</span> <span class="n">2</span><span class="k2">;</span>
<span class="number"> 43</span>                        screen_x <span class="k3">+</span><span class="k3">=</span> <span class="n">32</span><span class="k2">;</span>
<span class="number"> 44</span>                    <span class="k2">}</span>
<span class="number"> 45</span>                    <span class="k1">if</span><span class="k2">(</span>h <span class="k3">&gt;</span> <span class="n">32</span><span class="k2">)</span>
<span class="number"> 46</span>                    <span class="k2">{</span>
<span class="number"> 47</span>                        screen_y <span class="k3">-</span><span class="k3">=</span> h<span class="k2">;</span>
<span class="number"> 48</span>                        screen_y <span class="k3">+</span><span class="k3">=</span> <span class="n">32</span><span class="k2">;</span>
<span class="number"> 49</span>                    <span class="k2">}</span>
<span class="number"> 50</span>                    <span class="k1">if</span><span class="k2">(</span>w <span class="k3">&lt;</span> <span class="n">64</span><span class="k2">)</span>
<span class="number"> 51</span>                    <span class="k2">{</span>
<span class="number"> 52</span>                        screen_x <span class="k3">-</span><span class="k3">=</span> w <span class="k3">/</span> <span class="n">2</span><span class="k2">;</span>
<span class="number"> 53</span>                        screen_x <span class="k3">+</span><span class="k3">=</span> <span class="n">32</span><span class="k2">;</span>
<span class="number"> 54</span>                        <span class="k1">if</span><span class="k2">(</span>h <span class="k3">&gt;</span> <span class="n">32</span><span class="k2">)</span> screen_y <span class="k3">-</span><span class="k3">=</span> <span class="n">8</span><span class="k2">;</span>
<span class="number"> 55</span>                    <span class="k2">}</span>
<span class="number"> 56</span>                    <span class="k1">if</span><span class="k2">(</span>h <span class="k3">&lt;</span> <span class="n">32</span><span class="k2">)</span>
<span class="number"> 57</span>                    <span class="k2">{</span>
<span class="number"> 58</span>                        screen_y <span class="k3">-</span><span class="k3">=</span> h <span class="k3">/</span> <span class="n">2</span><span class="k2">;</span>
<span class="number"> 59</span>                        screen_y <span class="k3">+</span><span class="k3">=</span> <span class="n">16</span><span class="k2">;</span>
<span class="number"> 60</span>                    <span class="k2">}</span>
<span class="number"> 61</span>                <span class="k2">}</span>
<span class="number"> 62</span>
<span class="number"> 63</span>                <a href="http://www.allegro.cc/manual/al_draw_bitmap"><span class="a">al_draw_bitmap</span></a><span class="k2">(</span>bitmaps<span class="k2">[</span>ts.first<span class="k2">]</span>, screen_x, screen_y, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 64</span>            <span class="k2">}</span>
<span class="number"> 65</span>            <a href="http://www.allegro.cc/manual/al_hold_bitmap_drawing"><span class="a">al_hold_bitmap_drawing</span></a><span class="k2">(</span><span class="k1">false</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 66</span>        <span class="k2">}</span>
</div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Karol Wu)</author>
		<pubDate>Fri, 12 Jan 2018 10:52:30 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Hello Carl. Welcome to the forum! Yes, that looks right. Although it might be better to move al_hold_bitmap_drawing() outside of the for loops, depending on what your aim is.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Eric Johnson)</author>
		<pubDate>Fri, 12 Jan 2018 12:23:01 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Unless your bitmaps are all sub-bitmaps of the same parent bitmap, al_hold_bitmap_drawing won&#39;t have any effect btw.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Elias)</author>
		<pubDate>Sat, 13 Jan 2018 04:08:23 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/617214/1034497#target">Eric Johnson</a> said:</div><div class="quote"><p>Hello Carl. Welcome to the forum! Yes, that looks right. Although it might be better to move al_hold_bitmap_drawing() outside of the for loops, depending on what your aim is.</p></div></div><p>

Thanks! Tiles are grouped by the bitmap ID they are using, so I thought it would be good to enable and disable al_hold_bitmap_drawing() for tiles of each bitmap. Wouldn&#39;t it? Would it have same effect if I enable it just once before drawing all tiles?</p><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/617214/1034512#target">Elias</a> said:</div><div class="quote"><p>Unless your bitmaps are all sub-bitmaps of the same parent bitmap, al_hold_bitmap_drawing won&#39;t have any effect btw.</p></div></div><p>

I appreciate your opinion. I would use same parent bitmap for all of them although it would require merging 100&#39;s of bitmaps <img src="http://www.allegro.cc/forums/smileys/grin.gif" alt=";D" /> I don&#39;t think I can use such big bitmap.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Karol Wu)</author>
		<pubDate>Tue, 16 Jan 2018 16:14:16 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>If you use a couple large sprite sheets or tile maps, you can group them together on one large atlas texture. Then allocate each image a sub bitmap of an area on that larger atlas. This is where al_hold_bitmap_drawing comes in, because it can delay drawing as long as the bound context doesn&#39;t change. So you can happily blit millions of sprites as long as they are on the same texture.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Tue, 16 Jan 2018 18:07:01 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/617214/1034579#target">Karol Wu</a> said:</div><div class="quote"><p>I appreciate your opinion. I would use same parent bitmap for all of them although it would require merging 100&#39;s of bitmaps <img src="http://www.allegro.cc/forums/smileys/grin.gif" alt=";D" /> I don&#39;t think I can use such big bitmap.</p></div></div><p>

Well, I overstated that - there will be no affect if none of the bitmaps is a sub-bitmap - it does not have to be a single parent.</p><p>If I understand right you actually are grouping your al_hold_bitmap_drawing calls around bitmaps with the same parent, in which case you are using it exactly as intended. And in that case it doesn&#39;t matter if you call it once around both loops or inside each loop - basically all &quot;held&quot; bitmaps are drawn whenever one of two things happens:</p><p>1. al_hold_bitmap_drawing(false) is called<br />2. a bitmap with a different parent is drawn
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Elias)</author>
		<pubDate>Wed, 17 Jan 2018 00:14:05 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/617214/1034596#target">Elias</a> said:</div><div class="quote"><p>If I understand right you actually are grouping your al_hold_bitmap_drawing calls around bitmaps with the same parent</p></div></div><p>

Yes exactly.</p><div class="quote_container"><div class="title">Elias said:</div><div class="quote"><p>And in that case it doesn&#39;t matter if you call it once around both loops or inside each loop - basically all &quot;held&quot; bitmaps are drawn whenever one of two things happens:</p><p>1. al_hold_bitmap_drawing(false) is called<br />2. a bitmap with a different parent is drawn</p></div></div><p>

Big thanks to you for sharing this information. </p><p>Regards<br />Carl
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Karol Wu)</author>
		<pubDate>Fri, 19 Jan 2018 01:20:12 +0000</pubDate>
	</item>
</rss>
