<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>One last  question to answer all  my  questions</title>
		<link>http://www.allegro.cc/forums/view/586266</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Wed, 05 Jul 2006 06:54:18 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>What affects the speed of bliting of memory bitmaps -&gt; memory bitmaps and memory -&gt; video?</p><p>Bus Speed (FSB)?<br />Cache Memory?<br />RAM?<br />VRAM?<br />Amount of space on hard drive?<br />Or anything else you can think of?</p><p>I&#39;m just really trying to understand this one thing that keeps bothering me: Even though 40 FPS is playable, but what is soooo different from having a 1.1Ghz, 100FSB, 640 RAM, 128 VRAM (which doesn&#39;t seem to old) and having 2.8Ghz, 400FSB, 1GB RAM, 380 VRAM?? I know that the later is a helluva lot faster, but why would someone HAVE to have that in order to achieve 60FPS?? Now there are points where I can get 57 FPS on the first computer, which is great, but as soon as I have to scale an image or have a large sprite displayed (640x300). I use this code for my timing loop:</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="k1">volatile</span> <span class="k1">int</span> timerCounter <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">2</td><td><span class="k1">static</span> <span class="k1">void</span> timerCounterUpdater<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">3</td><td>    timerCounter<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span>    </td></tr><tr><td class="number">4</td><td><span class="k2">}</span></td></tr><tr><td class="number">5</td><td>END_OF_STATIC_FUNCTION<span class="k2">(</span>timerCounterUpdater<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">6</td><td>&#160;</td></tr><tr><td class="number">7</td><td>&#160;</td></tr><tr><td class="number">8</td><td><span class="c">/* ... */</span></td></tr><tr><td class="number">9</td><td>&#160;</td></tr><tr><td class="number">10</td><td><a href="http://www.allegro.cc/manual/install_timer" target="_blank"><span class="a">install_timer</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>    </td></tr><tr><td class="number">11</td><td><span class="c">/* Make sure the function and variable doesn't get swapped out */</span></td></tr><tr><td class="number">12</td><td><a href="http://www.allegro.cc/manual/LOCK_FUNCTION" target="_blank"><span class="a">LOCK_FUNCTION</span></a><span class="k2">(</span>timerCounterUpdater<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">13</td><td><a href="http://www.allegro.cc/manual/LOCK_VARIABLE" target="_blank"><span class="a">LOCK_VARIABLE</span></a><span class="k2">(</span>timerCounter<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">14</td><td>&#160;</td></tr><tr><td class="number">15</td><td><span class="c">/* Update timerCounter with 60 frames per second */</span></td></tr><tr><td class="number">16</td><td><a href="http://www.allegro.cc/manual/install_int_ex" target="_blank"><span class="a">install_int_ex</span></a><span class="k2">(</span>timerCounterUpdater, BPS_TO_TIMER<span class="k2">(</span><span class="n">60</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">17</td><td>&#160;</td></tr><tr><td class="number">18</td><td>&#160;</td></tr><tr><td class="number">19</td><td><span class="c">/* Inside your main loop: */</span></td></tr><tr><td class="number">20</td><td>&#160;</td></tr><tr><td class="number">21</td><td><span class="c">/* Never skip more than 6 frames per update */</span></td></tr><tr><td class="number">22</td><td><span class="k1">int</span> maxSkip <span class="k3">=</span> <span class="n">6</span><span class="k2">;</span></td></tr><tr><td class="number">23</td><td><span class="k1">int</span> curSkip <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">24</td><td><span class="k1">if</span> <span class="k2">(</span>timerCounter <span class="k3">&gt;</span> <span class="n">0</span><span class="k2">)</span> <span class="k2">{</span>                    </td></tr><tr><td class="number">25</td><td>    <span class="k1">do</span> <span class="k2">{</span></td></tr><tr><td class="number">26</td><td>        </td></tr><tr><td class="number">27</td><td>        <span class="c">/* actual logic here */</span></td></tr><tr><td class="number">28</td><td>        </td></tr><tr><td class="number">29</td><td>        <span class="c">/* Book keeping */</span></td></tr><tr><td class="number">30</td><td>        timerCounter--<span class="k2">;</span></td></tr><tr><td class="number">31</td><td>        curSkip<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span>        </td></tr><tr><td class="number">32</td><td>        <span class="k1">if</span> <span class="k2">(</span>curSkip <span class="k3">&gt;</span><span class="k3">=</span> maxSkip<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">33</td><td>            timerCounter <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">34</td><td>            <span class="k1">break</span><span class="k2">;</span></td></tr><tr><td class="number">35</td><td>        <span class="k2">}</span></td></tr><tr><td class="number">36</td><td>    <span class="k2">}</span> <span class="k1">while</span> <span class="k2">(</span>timerCounter <span class="k3">&gt;</span> <span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">37</td><td>    needsRefresh <span class="k3">=</span> TRUE<span class="k2">;</span></td></tr><tr><td class="number">38</td><td><span class="k2">}</span></td></tr><tr><td class="number">39</td><td>&#160;</td></tr><tr><td class="number">40</td><td><span class="k1">if</span> <span class="k2">(</span>needsRefresh<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">41</td><td>    needsRefresh <span class="k3">=</span> FALSE<span class="k2">;</span></td></tr><tr><td class="number">42</td><td>    </td></tr><tr><td class="number">43</td><td>    <span class="c">/* display code */</span></td></tr><tr><td class="number">44</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>

I use a hybrid of double buffering and triple buffering (to achieve blending) and draw everything to a memory bitmap, then blit the mem bitmap to a video bitmap, then request the video bitmap.</p><p>Any suggestions  will be of great use! If I can just get past this, I can leave you all alone and finish my work.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Kevin Epps)</author>
		<pubDate>Tue, 04 Jul 2006 20:37:54 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>YOu might be interested in downloading and compiling and running <a href="http://cgamesplay.com/hacks/memtest.cpp">this file</a>.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (CGamesPlay)</author>
		<pubDate>Tue, 04 Jul 2006 20:39:08 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>
I&#39;m not sure about answering your question. But you could get faster gfx results if you use AllegroGL or OpenLayer. <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Richard Phipps)</author>
		<pubDate>Tue, 04 Jul 2006 20:41:16 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
One last question to answer all my questions
</p></div></div><p>

Someone inform Lord Sauron that the One Question has been found.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (LennyLen)</author>
		<pubDate>Tue, 04 Jul 2006 20:53:14 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Look into dirty rectangles, there really is no sense to blit an entire buffer if you don&#39;t have to <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" />. Basically keep a list of dirty screen areas and only blit those, that should speed it up alot on older computers. You can literally acheive thousands of frames per second if you do things wisely.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Steve Terry)</author>
		<pubDate>Tue, 04 Jul 2006 21:31:40 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;m just wondering why you&#39;d want to blit between various paging and bitmap types and then blit again to the screen. that&#39;s your bottleneck. And remember, using triple buffering has a completely different way of handling your display/logic code and when you&#39;re using video bitmaps (triple/paging) it&#39;s best to not do any locking of surfaces, whereas using memory bitmaps to the screen, it&#39;s best to lock. I think <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" /></p><p>What is it you&#39;re trying to do?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Neil Walker)</author>
		<pubDate>Tue, 04 Jul 2006 21:31:57 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
You can literally acheive thousands of frames per second if you do things wisely.
</p></div></div><p>Or if you think wisely, you&#39;ll realize that FPS is a false benchmark <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Tue, 04 Jul 2006 21:32:49 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
YOu might be interested in downloading and compiling and running this file.
</p></div></div><p>
Thanks CGames, I&#39;ll run that in a few minutes. It looks like a great testing file that I really need to see!
</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
I&#39;m not sure about answering your question. But you could get faster gfx results if you use AllegroGL or OpenLayer.
</p></div></div><p>
Richard, I was considering that, but I don&#39;t want someone to HAVE to have OpenGL and such for it to run nicely. But, it seems I may have to reconsider in the future.
</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Someone inform Lord Sauron that the One Question has been found.
</p></div></div><p>
So friggin funny...:) But, I DO believe that it THE one question that will help in creating the ultimate solution for MY problems. I don&#39;t know about anyone else&#39;s.
</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
What is it you&#39;re trying to do?
</p></div></div><p>
Hey Neil,</p><p>I just want to have smooth animations in my games for systems as low as 500 Mhz with  16 - 8 MB vram. I&#39;ve tested an all vram-&gt;vram approach on that type of machine and the animations were flawless!! But I also want to use some blending as well, which I&#39;ve found out that blending on video bitmaps is slow. So I was told about using all memory bitmaps for animation and when drawing to the screen, just draw the mem bitmap to a video bitmap and request it. Which has helped, and even achieved 45 - 50 FPS with like 30 sprites drawn, but with a bigger sprite drawn, it slows down to like 30 FPS and looks like slow motion sort of. I just want to know if that&#39;s the best I can get with a machine that isn&#39;t a P4 machine. I understand it may be slower on a 300 - 500 Mhz machine, but 1.1Ghz, 640 MB RAM, 128 VRAM?? That&#39;s what I  want to know. If someone HAS to have P4 for the best results, fine. I just want to know if that&#39;s the best i can get for what I&#39;m trying to do.
</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Or if you think wisely, you&#39;ll realize that FPS is a false benchmark
</p></div></div><p>
Hey Tom, yeah I know not to rely on FPS, but you can also tell in the animation some. For those of you whow need my drawing code:</p><p>The timing loop is already in the first post, I&#39;ve drawn everything to a mem_buffer, then drew the mem_buffer a video buffer, than blited the video buf to the buffer, which is also a video buffer(for some reason, that way gave me a better performance). Then here&#39;s how the buffer is handled:
</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="c">// function one is called before the drawing is done</span></td></tr><tr><td class="number">2</td><td><span class="k1">void</span> BeginDrawing<span class="k2">(</span><span class="k2">)</span></td></tr><tr><td class="number">3</td><td><span class="k2">{</span></td></tr><tr><td class="number">4</td><td>        <a href="http://www.allegro.cc/manual/acquire_bitmap" target="_blank"><span class="a">acquire_bitmap</span></a><span class="k2">(</span>buffer<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">5</td><td>    <span class="c">//clear_bitmap(buffer);</span></td></tr><tr><td class="number">6</td><td><span class="k2">}</span></td></tr><tr><td class="number">7</td><td>&#160;</td></tr><tr><td class="number">8</td><td><span class="c">// function two is called after everything is drawn to the buffer I'm using triple buffering</span></td></tr><tr><td class="number">9</td><td><span class="k1">void</span> EndDrawing<span class="k2">(</span><span class="k2">)</span></td></tr><tr><td class="number">10</td><td><span class="k2">{</span></td></tr><tr><td class="number">11</td><td>        <a href="http://www.allegro.cc/manual/release_bitmap" target="_blank"><span class="a">release_bitmap</span></a><span class="k2">(</span>buffer<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">12</td><td>&#160;</td></tr><tr><td class="number">13</td><td>        <span class="k1">switch</span><span class="k2">(</span>videoupdatemethod<span class="k2">)</span></td></tr><tr><td class="number">14</td><td>        <span class="k2">{</span></td></tr><tr><td class="number">15</td><td>                <span class="k1">case</span> DOUBLEBUFFERING:</td></tr><tr><td class="number">16</td><td>        <a href="http://www.allegro.cc/manual/blit" target="_blank"><span class="a">blit</span></a><span class="k2">(</span>buffer, <a href="http://www.allegro.cc/manual/screen" target="_blank"><span class="a">screen</span></a>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span>, <a href="http://www.allegro.cc/manual/SCREEN_W" target="_blank"><span class="a">SCREEN_W</span></a>, <a href="http://www.allegro.cc/manual/SCREEN_H" target="_blank"><span class="a">SCREEN_H</span></a><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">17</td><td>                <span class="k1">break</span><span class="k2">;</span></td></tr><tr><td class="number">18</td><td>&#160;</td></tr><tr><td class="number">19</td><td>                <span class="k1">case</span> PAGEFLIPPING:</td></tr><tr><td class="number">20</td><td>                <a href="http://www.allegro.cc/manual/show_video_bitmap" target="_blank"><span class="a">show_video_bitmap</span></a><span class="k2">(</span>buffer<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">21</td><td>&#160;</td></tr><tr><td class="number">22</td><td>                <span class="k1">if</span><span class="k2">(</span>buffer <span class="k3">=</span><span class="k3">=</span> pages<span class="k2">[</span><span class="n">0</span><span class="k2">]</span><span class="k2">)</span></td></tr><tr><td class="number">23</td><td>                buffer <span class="k3">=</span> pages<span class="k2">[</span><span class="n">1</span><span class="k2">]</span><span class="k2">;</span></td></tr><tr><td class="number">24</td><td>                <span class="k1">else</span></td></tr><tr><td class="number">25</td><td>                buffer <span class="k3">=</span> pages<span class="k2">[</span><span class="n">0</span><span class="k2">]</span><span class="k2">;</span></td></tr><tr><td class="number">26</td><td>                <span class="k1">break</span><span class="k2">;</span></td></tr><tr><td class="number">27</td><td>&#160;</td></tr><tr><td class="number">28</td><td>                <span class="k1">case</span> TRIPLEBUFFERING:</td></tr><tr><td class="number">29</td><td>                <span class="k1">do</span> <span class="k2">{</span> <span class="k2">}</span> <span class="k1">while</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/poll_scroll" target="_blank"><span class="a">poll_scroll</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">30</td><td>&#160;</td></tr><tr><td class="number">31</td><td>                <a href="http://www.allegro.cc/manual/request_video_bitmap" target="_blank"><span class="a">request_video_bitmap</span></a><span class="k2">(</span>buffer<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">32</td><td>&#160;</td></tr><tr><td class="number">33</td><td>                <span class="k1">if</span><span class="k2">(</span>buffer <span class="k3">=</span><span class="k3">=</span> pages<span class="k2">[</span><span class="n">0</span><span class="k2">]</span><span class="k2">)</span></td></tr><tr><td class="number">34</td><td>        <span class="k2">{</span></td></tr><tr><td class="number">35</td><td>                buffer <span class="k3">=</span> pages<span class="k2">[</span><span class="n">1</span><span class="k2">]</span><span class="k2">;</span></td></tr><tr><td class="number">36</td><td>        <span class="k2">}</span></td></tr><tr><td class="number">37</td><td>                <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>buffer <span class="k3">=</span><span class="k3">=</span> pages<span class="k2">[</span><span class="n">1</span><span class="k2">]</span><span class="k2">)</span></td></tr><tr><td class="number">38</td><td>        <span class="k2">{</span></td></tr><tr><td class="number">39</td><td>                buffer <span class="k3">=</span> pages<span class="k2">[</span><span class="n">2</span><span class="k2">]</span><span class="k2">;</span></td></tr><tr><td class="number">40</td><td>        <span class="k2">}</span></td></tr><tr><td class="number">41</td><td>                <span class="k1">else</span></td></tr><tr><td class="number">42</td><td>        <span class="k2">{</span></td></tr><tr><td class="number">43</td><td>                buffer <span class="k3">=</span> pages<span class="k2">[</span><span class="n">0</span><span class="k2">]</span><span class="k2">;</span></td></tr><tr><td class="number">44</td><td>        <span class="k2">}</span></td></tr><tr><td class="number">45</td><td>                <span class="k1">break</span><span class="k2">;</span></td></tr><tr><td class="number">46</td><td>&#160;</td></tr><tr><td class="number">47</td><td>                default:</td></tr><tr><td class="number">48</td><td>&#160;</td></tr><tr><td class="number">49</td><td>                <span class="k1">break</span><span class="k2">;</span></td></tr><tr><td class="number">50</td><td>        <span class="k2">}</span></td></tr><tr><td class="number">51</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>

Hope this helps! I&#39;ll let you know about my results for the test as well, CGames. </p><p>EDIT--</p><p>Hey CGames!! Thanks for that memtest program! That helped me out tremendously. It helped me optimize my code even more and maintain a consistant 50 FPS on my lower end machine! Thanks for all of your help all!
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Kevin Epps)</author>
		<pubDate>Tue, 04 Jul 2006 23:24:20 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Like I said, in the case of video buffers, don&#39;t acquire_bitmap, use that only for memory bitmaps.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Neil Walker)</author>
		<pubDate>Wed, 05 Jul 2006 01:56:59 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>To clarify what Neil said (before someone quotes him out of context), only use acquire_bitmap when blitting <i>from</i> memory bitmaps (or non-accelerated video bitmaps) <i>to</i> a video bitmap.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Matthew Leverton)</author>
		<pubDate>Wed, 05 Jul 2006 02:09:44 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Wow, I&#39;m impressed that program I wrote like 2 years ago came to any use <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (CGamesPlay)</author>
		<pubDate>Wed, 05 Jul 2006 02:22:37 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
To clarify what Neil said (before someone quotes him out of context)
</p></div></div><p>Thanks Matthew, you&#39;ve saved me from X-G for another week <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Neil Walker)</author>
		<pubDate>Wed, 05 Jul 2006 02:41:35 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>
<img src="http://www.allegro.cc/forums/smileys/grin.gif" alt=";D" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Richard Phipps)</author>
		<pubDate>Wed, 05 Jul 2006 02:59:18 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
To clarify what Neil said (before someone quotes him out of context), only use acquire_bitmap when blitting from memory bitmaps (or non-accelerated video bitmaps) to a video bitmap.
</p></div></div><p>

And when doing this, I should acquire the video bitmap or the memory bitmap?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Kevin Epps)</author>
		<pubDate>Wed, 05 Jul 2006 04:16:15 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>You acquire the target video bitmap right before you do all the drawing and then release it immediately after. It should be as fast as possible, with nothing else occurring in between.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Matthew Leverton)</author>
		<pubDate>Wed, 05 Jul 2006 04:19:50 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Oh ok. Yeah, that&#39;s what I&#39;m doing then. Thanks for your help!
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Kevin Epps)</author>
		<pubDate>Wed, 05 Jul 2006 06:54:18 +0000</pubDate>
	</item>
</rss>
