<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Severe performance problems with a lot of bitmaps and subbitmaps.</title>
		<link>http://www.allegro.cc/forums/view/615450</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Mon, 15 Jun 2015 21:28:58 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Related older topic: <a href="https://www.allegro.cc/forums/thread/615015">https://www.allegro.cc/forums/thread/615015</a></p><p>So I had this problem with performance, the game spent more and more time in the al_flip, and the time was also kind of random, but it could go up to 50ms.</p><p>After some investigation, I found out, the time is spent in the _al_d3d_prepare_bitmaps_for_reset that is called every flip, and goes through all of the (tens of thousands) sub-bitmaps we have just to find out it doesn&#39;t need to be updated.</p><p>More info in the version of the code we use now.</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">static</span> <span class="k1">void</span> d3d_flip_display<span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_DISPLAY"><span class="a">ALLEGRO_DISPLAY</span></a> <span class="k3">*</span>al_display<span class="k2">)</span>
<span class="number">  2</span><span class="k2">{</span>
<span class="number">  3</span>   ALLEGRO_DISPLAY_D3D<span class="k3">*</span> d3d_display <span class="k3">=</span> <span class="k2">(</span>ALLEGRO_DISPLAY_D3D<span class="k3">*</span><span class="k2">)</span>al_display<span class="k2">;</span>
<span class="number">  4</span>   ALLEGRO_DISPLAY_WIN <span class="k3">*</span>win_display <span class="k3">=</span> <span class="k3">&amp;</span>d3d_display-&gt;win_display<span class="k2">;</span>
<span class="number">  5</span>   HRESULT hr<span class="k2">;</span>
<span class="number">  6</span>
<span class="number">  7</span>   <span class="k1">if</span> <span class="k2">(</span>d3d_display-&gt;device_lost<span class="k2">)</span>
<span class="number">  8</span>      <span class="k1">return</span><span class="k2">;</span>
<span class="number">  9</span>
<span class="number"> 10</span>   <a href="http://www.allegro.cc/manual/al_lock_mutex"><span class="a">al_lock_mutex</span></a><span class="k2">(</span>present_mutex<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 11</span>
<span class="number"> 12</span>   d3d_display-&gt;device-&gt;EndScene<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 13</span>
<span class="number"> 14</span>   hr <span class="k3">=</span> d3d_display-&gt;device-&gt;Present<span class="k2">(</span>NULL, NULL, win_display-&gt;window, NULL<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 15</span>
<span class="number"> 16</span>   d3d_display-&gt;device-&gt;BeginScene<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 17</span>
<span class="number"> 18</span>   <a href="http://www.allegro.cc/manual/al_unlock_mutex"><span class="a">al_unlock_mutex</span></a><span class="k2">(</span>present_mutex<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 19</span>
<span class="number"> 20</span>   <span class="k1">if</span> <span class="k2">(</span>hr <span class="k3">=</span><span class="k3">=</span> D3DERR_DEVICELOST<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 21</span>      d3d_display-&gt;device_lost <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 22</span>      <span class="k1">return</span><span class="k2">;</span>
<span class="number"> 23</span>   <span class="k2">}</span>
<span class="number"> 24</span>   <span class="k1">else</span> <span class="k2">{</span>
<span class="number"> 25</span>      <span class="c">//_al_d3d_prepare_bitmaps_for_reset(d3d_display);</span>
<span class="number"> 26</span>      
<span class="number"> 27</span>      <span class="c">// This (commenting out the method) is our custom solution of the performance problem of this method when</span>
<span class="number"> 28</span>      <span class="c">// there are tens of thousands of sprites.</span>
<span class="number"> 29</span>
<span class="number"> 30</span>      <span class="c">// In our case, vast majority of the sprites are either sub-bitmaps or bitmaps</span>
<span class="number"> 31</span>      <span class="c">// marked with NO_PRESEVE flag, so the loop wastefully goes through all of the bitmaps</span>
<span class="number"> 32</span>      <span class="c">// just to check, that none of these need to be updated.</span>
<span class="number"> 33</span>
<span class="number"> 34</span>      <span class="c">// The proper solution would have to have special list of bitmaps that are relevant for the</span>
<span class="number"> 35</span>      <span class="c">// reset (no subbitmaps, preserved), and check only those.</span>
<span class="number"> 36</span>
<span class="number"> 37</span>   <span class="k2">}</span>
<span class="number"> 38</span><span class="k2">}</span>
</div></div><p>

To avoid problems, I&#39;m calling the _al_d3d_prepare_bitmaps_for_reset once all the game graphics is loaded, so the game bitmaps are preserved, but for the rest of the bitmaps, they are preserved manually.</p><p>The question is, is there something special I should be aware of?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (kovarex)</author>
		<pubDate>Mon, 15 Jun 2015 19:46:45 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Haha, wow, I&#39;d never have thought that would become a performance bottleneck. Yes, what you&#39;re doing should be okay.</p><p>I should note that for the past 1 or 2 versions of 5.1, display-&gt;bitmaps no longer contains sub-bitmaps.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (SiegeLord)</author>
		<pubDate>Mon, 15 Jun 2015 20:33:54 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Thx for the info.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (kovarex)</author>
		<pubDate>Mon, 15 Jun 2015 21:28:58 +0000</pubDate>
	</item>
</rss>
