<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Drawing to the screen uses too much CPU</title>
		<link>http://www.allegro.cc/forums/view/586855</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Tue, 08 Aug 2006 20:50:40 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I have this tiny little program:</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="p">#include &lt;allegro.h&gt;</span></td></tr><tr><td class="number">2</td><td>&#160;</td></tr><tr><td class="number">3</td><td><span class="k1">volatile</span> <span class="k1">int</span> counter<span class="k2">;</span></td></tr><tr><td class="number">4</td><td><span class="k1">void</span> update_counter<span class="k2">(</span><span class="k2">)</span></td></tr><tr><td class="number">5</td><td><span class="k2">{</span></td></tr><tr><td class="number">6</td><td>  counter<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span></td></tr><tr><td class="number">7</td><td><span class="k2">}</span></td></tr><tr><td class="number">8</td><td><a href="http://www.allegro.cc/manual/END_OF_FUNCTION" target="_blank"><span class="a">END_OF_FUNCTION</span></a><span class="k2">(</span>update_counter<span class="k2">)</span></td></tr><tr><td class="number">9</td><td>&#160;</td></tr><tr><td class="number">10</td><td><span class="k1">int</span> main<span class="k2">(</span><span class="k2">)</span></td></tr><tr><td class="number">11</td><td><span class="k2">{</span></td></tr><tr><td class="number">12</td><td>  <a href="http://www.allegro.cc/manual/allegro_init" target="_blank"><span class="a">allegro_init</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">13</td><td>  <a href="http://www.allegro.cc/manual/install_keyboard" target="_blank"><span class="a">install_keyboard</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">14</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">15</td><td>  <a href="http://www.allegro.cc/manual/LOCK_VARIABLE" target="_blank"><span class="a">LOCK_VARIABLE</span></a><span class="k2">(</span>counter<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">16</td><td>  <a href="http://www.allegro.cc/manual/LOCK_FUNCTION" target="_blank"><span class="a">LOCK_FUNCTION</span></a><span class="k2">(</span>update_counter<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>  <a href="http://www.allegro.cc/manual/set_color_depth" target="_blank"><span class="a">set_color_depth</span></a><span class="k2">(</span><span class="n">16</span><span class="k2">)</span><span class="k2">;</span>  <span class="c">//same problem when using 24 and 32</span></td></tr><tr><td class="number">19</td><td>  <span class="k1">if</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/set_gfx_mode" target="_blank"><span class="a">set_gfx_mode</span></a><span class="k2">(</span>GFX_AUTODETECT_WINDOWED, <span class="n">640</span>, <span class="n">480</span>, <span class="n">0</span>, <span class="n">0</span><span class="k2">)</span> <span class="k3">!</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span></td></tr><tr><td class="number">20</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">21</td><td>    <a href="http://www.allegro.cc/manual/allegro_message" target="_blank"><span class="a">allegro_message</span></a><span class="k2">(</span><span class="s">"Couldn't set up a screen mode!"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">22</td><td>    <span class="k1">return</span> <span class="n">1</span><span class="k2">;</span></td></tr><tr><td class="number">23</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">24</td><td>&#160;</td></tr><tr><td class="number">25</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>update_counter, BPS_TO_TIMER<span class="k2">(</span><span class="n">50</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">26</td><td>  counter <span class="k3">=</span> <span class="n">0</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">while</span> <span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/key" target="_blank"><span class="a">key</span></a><span class="k2">[</span>KEY_ESC<span class="k2">]</span><span class="k2">)</span></td></tr><tr><td class="number">29</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">30</td><td>    <span class="k1">while</span> <span class="k2">(</span>counter <span class="k3">&gt;</span> <span class="n">0</span><span class="k2">)</span></td></tr><tr><td class="number">31</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">32</td><td>      <a href="http://www.allegro.cc/manual/clear_to_color" target="_blank"><span class="a">clear_to_color</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/screen" target="_blank"><span class="a">screen</span></a>, <a href="http://www.allegro.cc/manual/makecol" target="_blank"><span class="a">makecol</span></a><span class="k2">(</span><span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">33</td><td>      <span class="c">//or rectfill(screen, 0, 0, 640, 480, makecol(0, 0, 0));</span></td></tr><tr><td class="number">34</td><td>      <span class="c">//or create a black bitmap and blit it to the screen</span></td></tr><tr><td class="number">35</td><td>      counter--<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>    <a href="http://www.allegro.cc/manual/rest" target="_blank"><span class="a">rest</span></a><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>&#160;</td></tr><tr><td class="number">40</td><td>  <a href="http://www.allegro.cc/manual/allegro_exit" target="_blank"><span class="a">allegro_exit</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">41</td><td>  <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">42</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>

My problem is that this takes up 100% of my CPU time.  Can anyone figure out what&#39;s going wrong?  It seems that anything that draws to the scren takes way too much processor time.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (kdevil)</author>
		<pubDate>Sat, 05 Aug 2006 00:43:09 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Unless you relinqusish CPU time to the operating system, with software drawing you will always use 100% on any machine, regardless of its speed.  All you will do is spin your loop faster.</p><p>You need a framerate reguluator that either sleeps when it is going too fast, or use something that blocks, like vsync (does Allegro&#39;s vsync do true blocking on Windows?), to limit your framerate and reduce your CPU use below 100%.</p><p>I see you are using rest method, but maybe it is not working?  1ms may be too small of a sleeping time.</p><p>EDIT: I guess I assumed you were working with Windows.  What OS are you using, and is rest implemented properly there?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (gillius)</author>
		<pubDate>Sat, 05 Aug 2006 00:47:27 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>It might not help you, but this is what my game cycle looks like:</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td>  <a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>bmp <span class="k3">=</span> <a href="http://www.allegro.cc/manual/create_bitmap" target="_blank"><span class="a">create_bitmap</span></a><span class="k2">(</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">2</td><td>&#160;</td></tr><tr><td class="number">3</td><td>  <span class="k1">while</span> <span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/key" target="_blank"><span class="a">key</span></a><span class="k2">[</span>KEY_ESC<span class="k2">]</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>    <span class="k1">while</span><span class="k2">(</span>counter <span class="k3">&lt;</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">6</td><td>        <a href="http://www.allegro.cc/manual/rest" target="_blank"><span class="a">rest</span></a><span class="k2">(</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">7</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">8</td><td>    <span class="k1">while</span> <span class="k2">(</span>counter <span class="k3">&gt;</span> <span class="n">0</span><span class="k2">)</span></td></tr><tr><td class="number">9</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">10</td><td>      <span class="c">// do some logic</span></td></tr><tr><td class="number">11</td><td>      counter--<span class="k2">;</span></td></tr><tr><td class="number">12</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">13</td><td>    clear<span class="k2">(</span>bmp<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">14</td><td>    draw_graphics<span class="k2">(</span>bmp<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">15</td><td>    <a href="http://www.allegro.cc/manual/blit" target="_blank"><span class="a">blit</span></a><span class="k2">(</span>bmp, <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">16</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">17</td><td>&#160;</td></tr><tr><td class="number">18</td><td>  <a href="http://www.allegro.cc/manual/destroy_bitmap" target="_blank"><span class="a">destroy_bitmap</span></a><span class="k2">(</span>bmp<span class="k2">)</span><span class="k2">;</span></td></tr></tbody></table></div></div><p>

Last night this code allowed me to watch DVD&#39;s while testing my framework.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Rampage)</author>
		<pubDate>Sat, 05 Aug 2006 00:56:51 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Can someone try the code I posted and see if they get the same result?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (kdevil)</author>
		<pubDate>Sat, 05 Aug 2006 01:06:52 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Just wondering, why are you using <span class="source-code"><a href="http://www.allegro.cc/manual/rest" target="_blank"><span class="a">rest</span></a><span class="k2">(</span><span class="n">1</span><span class="k2">)</span></span> ?<br />My game loop is also like yours rampage just without the rest bit <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" /><br />Sorry, off your topic but I&#39;m just curious.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Tomoso)</author>
		<pubDate>Sat, 05 Aug 2006 01:16:44 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I use rest(1) so that the game takes as little CPU time as possible.  Anyway, has anyone tried my code and seen whether they have the same problem?</p><p>Edit:  Come to think of it, all the allegro examples I&#39;ve tried are taking 100% CPU as well.  I&#39;m going to try recompiling Allegro...</p><p>Edit #2:  Huh.  Trying exaccel gives me this:
</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Clear: software (urgh, this is not good!)<br />Blit: software (urgh, this program will run too sloooooowly without hardware acceleration!)
</p></div></div><p>
Could that be what&#39;s wrong?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (kdevil)</author>
		<pubDate>Sat, 05 Aug 2006 01:27:21 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>You are using clear_to_color(screen, makecol(0, 0, 0)); within your logic loop. Move it outside of that loop and it should be just fine.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Elverion)</author>
		<pubDate>Sat, 05 Aug 2006 02:00:43 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>As was said, your game will <i>always</i> use 100% CPU unless it&#39;s event driven. It&#39;s a fact. Sleeping for 1ms won&#39;t help at all because sleep(1) ends up sleeping for 16ms, giving you a terrible framerate. This is due to timer innaccuracy.<br />It&#39;s not a bad thing unless your game is to be used in parallel with another program.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Billybob)</author>
		<pubDate>Sat, 05 Aug 2006 02:22:13 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Ah, right.</p><p>Still, all OpenLayer games I&#39;ve tried on the laptop barely go above 30% CPU, so it&#39;s a bit troubling when a plain Allegro game takes up 100%.  Is there a more accurate sleep function or something else that&#39;ll help me lower the CPU usage?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (kdevil)</author>
		<pubDate>Sat, 05 Aug 2006 06:42:29 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Remove the counter:
</p><div class="source-code snippet"><div class="inner"><pre>  <span class="k1">while</span> <span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/key" target="_blank"><span class="a">key</span></a><span class="k2">[</span>KEY_ESC<span class="k2">]</span><span class="k2">)</span>
  <span class="k2">{</span>
      <a href="http://www.allegro.cc/manual/clear_to_color" target="_blank"><span class="a">clear_to_color</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/screen" target="_blank"><span class="a">screen</span></a>, <a href="http://www.allegro.cc/manual/makecol" target="_blank"><span class="a">makecol</span></a><span class="k2">(</span><span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
      <span class="c">//or rectfill(screen, 0, 0, 640, 480, makecol(0, 0, 0));</span>
      <span class="c">//or create a black bitmap and blit it to the screen</span>
    <a href="http://www.allegro.cc/manual/rest" target="_blank"><span class="a">rest</span></a><span class="k2">(</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span>
  <span class="k2">}</span>
</pre></div></div><p>
If your drawing is fast enough (~1/60th of a millisecond) you&#39;ll run at 60fps. The slower your drawing the slower your framerate, but this should keep CPU usage pretty low. (if it doesn&#39;t work, try sleep instead of rest).</p><p>rest(1) will sleep for ~16ms (timer innaccuracy), so if you can draw really fast it will ...<br />loop:<br />     draw: 0.1ms<br />     rest: 16ms<br />in 1 second that&#39;s roughly 60 frames.</p><p>---</p><p>vsync may reduce CPU usage. If it doesn&#39;t use any CPU while waiting on the screen, then you&#39;ll see a drop in CPU usage. That may be what&#39;s going on with OpenLayer (if it&#39;s vsync-ing automatically).</p><p>---</p><p>By the way, you can still use a counter if you want, but only to keep track of time. I wouldn&#39;t use it to control FPS in the this case, because sleep is going to mess it up.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Billybob)</author>
		<pubDate>Sat, 05 Aug 2006 09:23:03 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>
Try different amounts of rest, i.e. rest(2) rest(3) and see what effect this has on your CPU usage.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Richard Phipps)</author>
		<pubDate>Sat, 05 Aug 2006 12:20:39 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Richard: It <i>should</i> have none. As I said, the timer resolution is roughly 16ms. So anything &lt; 16ms is going to end up near 16ms.</p><p>As a side note, timer resolution can be changed on most operating systems, but it is done manually, doesn&#39;t usually get below 1ms, and obviously you can&#39;t count on it being so (nor ask users to do it).
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Billybob)</author>
		<pubDate>Sat, 05 Aug 2006 14:11:09 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
rest(1) will sleep for ~16ms (timer innaccuracy), so if you can draw really fast it will ...
</p></div></div><p>

DO NOT RELY ON OS SCHEDULING FOR TIMING. Your program can be put in at any time basically.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Goalie Ca)</author>
		<pubDate>Sun, 06 Aug 2006 00:06:22 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>rest(0) waits until the operating system says it can go, AFAIK.</p><p>The reason all the examples use 100% is because they are effectively on a continuous loop. Write a continuous loop without allegro, and it will still use 100% unless you let the operating system know you&#39;re willing to let it go and do it&#39;s thing, usually be rest(0)-ing.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (James Stanley)</author>
		<pubDate>Mon, 07 Aug 2006 23:59:45 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>rest(0) will still use 100% of the CPU, but it tells the OS to let other processes have a turn, if needed. So, rest(0) basically just uses up whatever extra CPU time it can. Rest(1) will actually decrease CPU usage, but is inaccurate and may have adverse effects on your program. Games are very time critical, so I wouldn&#39;t worry about about how much CPU usage it shows that you are using, but rather performance.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Elverion)</author>
		<pubDate>Tue, 08 Aug 2006 00:44:26 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Games are very time critical, so I wouldn&#39;t worry about about how much CPU usage it shows that you are using, but rather performance.
</p></div></div><p>unless you are runnign on batteries <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (HoHo)</author>
		<pubDate>Tue, 08 Aug 2006 00:47:42 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Yes, this is critically important if you are running on batteries, or with variable cooling systems (esp when using those massive wattage Pentium D processors).  On my work box (thankfully I don&#39;t play games or peg the CPU a lot), when something takes 100% CPU it goes from dead silent to a flippin&#39; jet that needs FAA clearance to take off.  Of course it&#39;s a small form-factor Dell machine.</p><p>Even on my AMD machine, the same happens, except no where near as loud.  So there&#39;s no reason to burn CPU if you&#39;re just going to spin and can&#39;t display any more frames.</p><p>On a laptop you can cut your battery life in half or more by burning up the CPU like that in a loop.</p><p>If you are using proper triple buffering with waits or another similar system, the OS will block for you if your game runs too fast, so you can use a &quot;standard&quot; limiting/timing system but still get the blocking advantage, without any framerate stutter since you render 2 frames ahead you get that buffer.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (gillius)</author>
		<pubDate>Tue, 08 Aug 2006 02:30:24 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>gillius is correct, triple buffering and other methods that use show_video_bitmap do indeed reduce CPU usage. show_video_bitmap locks the current thread until vsync (unlike vysnc() itself, mind you). Which means that if your program can draw faster than the refresh rate, your CPU usage will go under 100%.</p><p>Note, though, that this only works on systems with triple buffering, and only in fullscreen.</p><p>I have developed a better solution. It is by no means an end all, but it will work in both fullscreen and windowed.</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="p">#include "pthread.h"</span></td></tr><tr><td class="number">2</td><td><span class="p">#include &lt;allegro.h&gt;</span></td></tr><tr><td class="number">3</td><td>&#160;</td></tr><tr><td class="number">4</td><td><span class="k1">void</span> <span class="k3">*</span>timer<span class="k2">(</span><span class="k1">void</span> <span class="k3">*</span>ptr<span class="k2">)</span></td></tr><tr><td class="number">5</td><td><span class="k2">{</span></td></tr><tr><td class="number">6</td><td>  <span class="c">// DO NOT sleep for less than 16ms</span></td></tr><tr><td class="number">7</td><td>  <span class="c">// Most OS timers are not accurate under 16ms</span></td></tr><tr><td class="number">8</td><td>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_731.html" target="_blank">sleep</a><span class="k2">(</span><span class="n">16</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">9</td><td>  <span class="c">// You may change the sleep length if you want a different FPS &lt; 60</span></td></tr><tr><td class="number">10</td><td>  <span class="c">// sleep(1000/FPS);</span></td></tr><tr><td class="number">11</td><td>  <span class="c">// DO NOT use any FPS &gt; 60</span></td></tr><tr><td class="number">12</td><td><span class="k2">}</span></td></tr><tr><td class="number">13</td><td>&#160;</td></tr><tr><td class="number">14</td><td><span class="k1">void</span> wait_for_timeslice<span class="k2">(</span>pthread_t <span class="k3">*</span>thread<span class="k2">)</span></td></tr><tr><td class="number">15</td><td><span class="k2">{</span></td></tr><tr><td class="number">16</td><td>  pthread_join<span class="k2">(</span><span class="k3">*</span>thread, NULL<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">17</td><td>  pthread_create<span class="k2">(</span>thread, NULL, timer, NULL<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">18</td><td><span class="k2">}</span></td></tr><tr><td class="number">19</td><td>&#160;</td></tr><tr><td class="number">20</td><td><span class="k1">int</span> main<span class="k2">(</span><span class="k2">)</span></td></tr><tr><td class="number">21</td><td><span class="k2">{</span></td></tr><tr><td class="number">22</td><td>  <a href="http://www.allegro.cc/manual/allegro_init" target="_blank"><span class="a">allegro_init</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">23</td><td>  <a href="http://www.allegro.cc/manual/install_keyboard" target="_blank"><span class="a">install_keyboard</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">24</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">25</td><td>&#160;</td></tr><tr><td class="number">26</td><td>  <a href="http://www.allegro.cc/manual/set_color_depth" target="_blank"><span class="a">set_color_depth</span></a><span class="k2">(</span><span class="n">16</span><span class="k2">)</span><span class="k2">;</span>  <span class="c">//same problem when using 24 and 32</span></td></tr><tr><td class="number">27</td><td>  <span class="k1">if</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/set_gfx_mode" target="_blank"><span class="a">set_gfx_mode</span></a><span class="k2">(</span>GFX_AUTODETECT_WINDOWED, <span class="n">640</span>, <span class="n">480</span>, <span class="n">0</span>, <span class="n">0</span><span class="k2">)</span> <span class="k3">!</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span></td></tr><tr><td class="number">28</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">29</td><td>    <a href="http://www.allegro.cc/manual/allegro_message" target="_blank"><span class="a">allegro_message</span></a><span class="k2">(</span><span class="s">"Couldn't set up a screen mode!"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">30</td><td>    <span class="k1">return</span> <span class="n">1</span><span class="k2">;</span></td></tr><tr><td class="number">31</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">32</td><td>  </td></tr><tr><td class="number">33</td><td>  pthread_t thread<span class="k2">;</span></td></tr><tr><td class="number">34</td><td>  pthread_create<span class="k2">(</span><span class="k3">&amp;</span>thread, NULL, timer, NULL<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">35</td><td>  <span class="k1">while</span><span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/key" target="_blank"><span class="a">key</span></a><span class="k2">[</span>KEY_ESC<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>    <a href="http://www.allegro.cc/manual/clear_to_color" target="_blank"><span class="a">clear_to_color</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/screen" target="_blank"><span class="a">screen</span></a>, <a href="http://www.allegro.cc/manual/makecol" target="_blank"><span class="a">makecol</span></a><span class="k2">(</span><span class="n">255</span>, <span class="n">255</span>, <span class="n">255</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">38</td><td>    <a href="http://www.allegro.cc/manual/line" target="_blank"><span class="a">line</span></a><span class="k2">(</span><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>, <a href="http://www.delorie.com/djgpp/doc/libc/libc_637.html" target="_blank">rand</a><span class="k2">(</span><span class="k2">)</span> % <a href="http://www.allegro.cc/manual/SCREEN_W" target="_blank"><span class="a">SCREEN_W</span></a>, <a href="http://www.delorie.com/djgpp/doc/libc/libc_637.html" target="_blank">rand</a><span class="k2">(</span><span class="k2">)</span> % <a href="http://www.allegro.cc/manual/SCREEN_H" target="_blank"><span class="a">SCREEN_H</span></a>, <a href="http://www.allegro.cc/manual/makecol" target="_blank"><span class="a">makecol</span></a><span class="k2">(</span><span class="n">0</span>,<span class="n">0</span>,<span class="n">0</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">39</td><td>    </td></tr><tr><td class="number">40</td><td>    wait_for_timeslice<span class="k2">(</span><span class="k3">&amp;</span>thread<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">41</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">42</td><td>&#160;</td></tr><tr><td class="number">43</td><td>  <a href="http://www.allegro.cc/manual/allegro_exit" target="_blank"><span class="a">allegro_exit</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">44</td><td>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_298.html" target="_blank">exit</a><span class="k2">(</span><span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">45</td><td><span class="k2">}</span></td></tr><tr><td class="number">46</td><td><a href="http://www.allegro.cc/manual/END_OF_MAIN" target="_blank"><span class="a">END_OF_MAIN</span></a><span class="k2">(</span><span class="k2">)</span></td></tr></tbody></table></div></div><p>
It sets up a thread that runs in the background for 16ms. After drawing is done it does &quot;pthread_join&quot; on the sleeper thread. This will lock the main thread until the sleeper thread is done sleeping, during which time no CPU is used. After that it recreates the sleeper thread so it can be used again for the next frame.</p><p>This method will draw at most 62.5 frames per second. If your program can run faster than that the CPU usage will drop while continuing at 60FPS.<br />In the case where the host machine is too slow, your program will run at under 60FPS and 100% CPU. This is an unfortunate case, but what do you expect when the host machine is slow?</p><p>I tested the above code on my machine and got 10% CPU usage (0 without the line call). What do others get? (You&#39;ll need pthreads to compile) Attached is an EXE in case you can&#39;t compile, as well as the pthreads DLL (for windows).
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Billybob)</author>
		<pubDate>Tue, 08 Aug 2006 03:29:57 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
<span class="source-code"><span class="c">// Most OS timers are not accurate under 16ms</span></span>
</p></div></div><p>Ugh, both Windows and Linux have 10 Hz timer frequencies by default. It&#39;s 10 ms, not 16 <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" /></p><p>kdevil: Yes, the problem is probably that you are using the GDI driver. I don&#39;t know why that would be, but I suggest starting from scratch with Allegro, and make sure you have the proper DirectX framework (from Allegro&#39;s SF page) installed, and DirectX installed, and graphics drivers and all that. If that doesn&#39;t help, try posting your specs.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (CGamesPlay)</author>
		<pubDate>Tue, 08 Aug 2006 05:23:10 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I don&#39;t think there is a cause to use pthreads for this.  I developed a timer that would sleep appropriately and would have different (automatic) modes of operation, including frameskip modes.  So it would go (slower than real-time with max frameskip) -&gt; (real-time with some frameskip) -&gt; (real-time with sleeps when needed).</p><p>The way I did it was to keep a game time counter and a real time counter and to do different actions based on where the game time was in relation to the real time -- sleep or skip frames, or slow the logic down (skip logic frames).</p><p>The original thread is at <a href="http://www.allegro.cc/forums/thread/305773">http://www.allegro.cc/forums/thread/305773</a>, but I think I attached the code and it is only on my machine now.  I can post it if people want.  The original thread has much much more detail on what I did.</p><p>After I wrote the code, I realized that you could do something simpler by just sleeping if your gametime was ahead.  This is fine if you don&#39;t care about the game running ahead about 8ms on average.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (gillius)</author>
		<pubDate>Tue, 08 Aug 2006 05:36:03 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Ugh, both Windows and Linux have 10 Hz timer frequencies by default. It&#39;s 10 ms, not 16 <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" />
</p></div></div><p>
Did you mean 100Hz?<br />And no matter what timer it may be using I&#39;ve <i>always</i> seen timer function have an accuracy of 16ms, not 10ms.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Billybob)</author>
		<pubDate>Tue, 08 Aug 2006 05:54:31 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Did you mean 100Hz?<br />And no matter what timer it may be using I&#39;ve always seen timer function have an accuracy of 16ms, not 10ms.
</p></div></div><p>Yes <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" /><br />I suggest you run more tests... We&#39;ve had several threads on this topic, agreeing on the 100 Hz timer...
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (CGamesPlay)</author>
		<pubDate>Tue, 08 Aug 2006 06:09:39 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
I suggest you run more tests... We&#39;ve had several threads on this topic, agreeing on the 100 Hz timer...
</p></div></div><p>

I&#39;m going to bet my left sock that William is using 60hz as his refresh rate, and the vsync caps his timer rate (100/60 = 16.666...).</p><p>Also, under Windows it is possible to change the resolution of the scheduler - see timeBeginPeriod() and timeEndPeriod(). IIRC, they&#39;re not guaranteed to work, but they&#39;re worth trying if you really can&#39;t stand sleeping for 10ms instead of 1ms. And I&#39;m quite certain that the default under W2K and WXP is 10.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Jakub Wasilewski)</author>
		<pubDate>Tue, 08 Aug 2006 06:34:46 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
I&#39;m going to bet my left sock that William is using 60hz as his refresh rate, and the vsync caps his timer rate (100/60 = 16.666...).
</p></div></div><p>Yeah, this was my thought also. I didn&#39;t say anything because I hope he wasn&#39;t using a graphical program to test that.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (CGamesPlay)</author>
		<pubDate>Tue, 08 Aug 2006 06:40:44 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Also, under Windows it is possible to change the resolution of the scheduler - see timeBeginPeriod() and timeEndPeriod().
</p></div></div><p>
That&#39;s rather dangerous, as it can have adverse affects on the rest of the system (especially older systems) and you&#39;ll be in for problems if your program dies without calling timeEndPeriod. Under Linux, the timer is configurable (250hz, 100hz, 1000hz, IIRC), so you should not assume any kind of granularity when resting. If you rest(0), it will get back to you ASAP after checking other threads. If you rest more, it will get back to you ASAP after the time is over. That&#39;s all you can gaurantee.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
// DO NOT sleep for less than 16ms<br />// Most OS timers are not accurate under 16ms
</p></div></div><p>
Why shouldn&#39;t you sleep for less than 16ms, even if that&#39;s the granularity you get? What&#39;s the difference if you rest for 1ms and get back in 16ms, or rest for 16ms and get back in 16ms? In fact, trying to match it like that can cause you more problems if it checks your process just ahead of schedule, sees that you want to sleep a bit more, then goes another round without you.</p><p>Your granularity is determined b y a number of factors, not the least of which is how much CPU time the other processes take. Even with a 10ms timeslice, if you rest for 1ms, and after 5ms, no process wants to use the CPU, the OS will see your thread and wake you up (thereby causing you to sleep for 5ms, instead of 10 or 16).</p><p>There is another issue, though. Allegro&#39;s timers themselves are very innaccurate, so you shouldn&#39;t use them to time your logic if you can help it. Every single running timer is run on the same thread, so after resting and being woken up to run your callback (incurring the 5~10ms delay), it&#39;ll check all other timers to see if they want to run. And if one of them happens to want to, you&#39;ll get a longer delay.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Kitty Cat)</author>
		<pubDate>Tue, 08 Aug 2006 13:14:17 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Why are you using the unreliable and unpredictable (in terms of accuracy) multithread-timing facilities at all? Here&#39;s what I usually do:<br />- I use a high-resolution timer like QueryPerformanceCounter (Linux has gettimeofday() which is supposed to be as exact; since I&#39;m on a windows box, I haven&#39;t investigated this to any extent though). Wrote a nice wrapper (once, for all my future projects) around the various interfaces, falling back on allegro timers if all else fails.<br />- In my main loop, I first read the timer delta and accumulate it. I decide independently if I need to update logic (if (timer) &gt; 0 for variable-delta, while (timer &gt;= timeslice) for fixed-delta) and graphics (cap to, say, 60 Hz or whatever you like, or don&#39;t cap and just update only if logic has changed). After that, I sleep (with a user option to turn this off). <br />Works beautifully.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Tobias Dammers)</author>
		<pubDate>Tue, 08 Aug 2006 16:29:30 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Would you mind posting your framework?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (BAF)</author>
		<pubDate>Tue, 08 Aug 2006 18:22:58 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I might release a little library soon. In the meantime, here&#39;s my timer api.<br />(timer.h)
</p><div class="source-code snippet"><div class="inner"><pre><span class="p">#ifndef TIMER_H</span>
<span class="p">#define TIMER_H</span>

<span class="k1">void</span> init_timer<span class="k2">(</span><span class="k1">bool</span> use_qpc <span class="k3">=</span> <span class="k1">false</span><span class="k2">)</span><span class="k2">;</span>
<span class="k1">void</span> stop_timer<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="k1">void</span> start_timer<span class="k2">(</span><span class="k1">int</span> timer_ms<span class="k2">)</span><span class="k2">;</span>
<span class="k1">float</span> get_timer_delta<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="k1">const</span> <span class="k1">char</span><span class="k3">*</span> get_timing_method_string<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="k1">float</span> get_timer_accuracy<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>

<span class="p">#endif</span>
</pre></div></div><p>
(timer.cpp)
</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="p">#include &lt;allegro.h&gt;</span></td></tr><tr><td class="number">2</td><td><span class="p">#ifdef ALLEGRO_WINDOWS</span></td></tr><tr><td class="number">3</td><td>  <span class="p">#include &lt;winalleg.h&gt;</span></td></tr><tr><td class="number">4</td><td><span class="p">#endif</span></td></tr><tr><td class="number">5</td><td><span class="p">#include "timer.h"</span></td></tr><tr><td class="number">6</td><td>&#160;</td></tr><tr><td class="number">7</td><td><span class="k1">bool</span> initialized <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span></td></tr><tr><td class="number">8</td><td>&#160;</td></tr><tr><td class="number">9</td><td><span class="k1">int</span> timer <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">10</td><td><span class="k1">int</span> timer_ms <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">11</td><td>&#160;</td></tr><tr><td class="number">12</td><td><span class="p">#ifdef ALLEGRO_WINDOWS</span></td></tr><tr><td class="number">13</td><td>LARGE_INTEGER last_perf_count_li<span class="k2">;</span></td></tr><tr><td class="number">14</td><td>LARGE_INTEGER perf_count_li<span class="k2">;</span></td></tr><tr><td class="number">15</td><td>LARGE_INTEGER perf_freq_li<span class="k2">;</span></td></tr><tr><td class="number">16</td><td><span class="k1">unsigned</span> <span class="k1">long</span> <span class="k1">long</span> last_perf_count<span class="k2">;</span></td></tr><tr><td class="number">17</td><td><span class="k1">unsigned</span> <span class="k1">long</span> <span class="k1">long</span> perf_count<span class="k2">;</span></td></tr><tr><td class="number">18</td><td><span class="k1">unsigned</span> <span class="k1">long</span> <span class="k1">long</span> perf_freq<span class="k2">;</span></td></tr><tr><td class="number">19</td><td>&#160;</td></tr><tr><td class="number">20</td><td><span class="k1">unsigned</span> <span class="k1">long</span> <span class="k1">long</span> li_to_ll<span class="k2">(</span>LARGE_INTEGER li<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">21</td><td>  <span class="k1">unsigned</span> <span class="k1">long</span> <span class="k1">long</span> ll <span class="k3">=</span> li.HighPart<span class="k2">;</span></td></tr><tr><td class="number">22</td><td>  ll <span class="k3">=</span> ll <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">32</span><span class="k2">;</span></td></tr><tr><td class="number">23</td><td>  ll <span class="k3">|</span><span class="k3">=</span> li.LowPart<span class="k2">;</span></td></tr><tr><td class="number">24</td><td>  <span class="k1">return</span> ll<span class="k2">;</span></td></tr><tr><td class="number">25</td><td><span class="k2">}</span></td></tr><tr><td class="number">26</td><td><span class="p">#endif</span></td></tr><tr><td class="number">27</td><td>&#160;</td></tr><tr><td class="number">28</td><td><span class="k1">bool</span> qpc_mode <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span></td></tr><tr><td class="number">29</td><td>&#160;</td></tr><tr><td class="number">30</td><td><span class="k1">void</span> timer_proc<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">31</td><td>  <span class="k3">+</span><span class="k3">+</span>timer<span class="k2">;</span></td></tr><tr><td class="number">32</td><td><span class="k2">}</span></td></tr><tr><td class="number">33</td><td><a href="http://www.allegro.cc/manual/END_OF_FUNCTION" target="_blank"><span class="a">END_OF_FUNCTION</span></a><span class="k2">(</span>timer_proc<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">34</td><td>&#160;</td></tr><tr><td class="number">35</td><td><span class="k1">void</span> init_timer<span class="k2">(</span><span class="k1">bool</span> use_qpc<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">36</td><td><span class="p">#ifdef ALLEGRO_WINDOWS</span></td></tr><tr><td class="number">37</td><td>  <span class="k1">if</span> <span class="k2">(</span>use_qpc<span class="k2">)</span></td></tr><tr><td class="number">38</td><td>    qpc_mode <span class="k3">=</span> QueryPerformanceFrequency<span class="k2">(</span><span class="k3">&amp;</span>perf_freq_li<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">39</td><td>  <span class="k1">else</span></td></tr><tr><td class="number">40</td><td><span class="p">#endif</span></td></tr><tr><td class="number">41</td><td>    qpc_mode <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span></td></tr><tr><td class="number">42</td><td>  </td></tr><tr><td class="number">43</td><td>  <span class="k1">if</span> <span class="k2">(</span>qpc_mode<span class="k2">)</span></td></tr><tr><td class="number">44</td><td>    perf_freq <span class="k3">=</span> li_to_ll<span class="k2">(</span>perf_freq_li<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">45</td><td>  </td></tr><tr><td class="number">46</td><td>  <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>qpc_mode<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">47</td><td>    <a href="http://www.allegro.cc/manual/LOCK_VARIABLE" target="_blank"><span class="a">LOCK_VARIABLE</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">48</td><td>    <a href="http://www.allegro.cc/manual/LOCK_FUNCTION" target="_blank"><span class="a">LOCK_FUNCTION</span></a><span class="k2">(</span>timer_proc<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">49</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">50</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">51</td><td>  </td></tr><tr><td class="number">52</td><td>  initialized <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span></td></tr><tr><td class="number">53</td><td><span class="k2">}</span></td></tr><tr><td class="number">54</td><td>&#160;</td></tr><tr><td class="number">55</td><td><span class="k1">void</span> stop_timer<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">56</td><td>  <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>qpc_mode<span class="k2">)</span></td></tr><tr><td class="number">57</td><td>    <a href="http://www.allegro.cc/manual/remove_int" target="_blank"><span class="a">remove_int</span></a><span class="k2">(</span>timer_proc<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">58</td><td><span class="k2">}</span></td></tr><tr><td class="number">59</td><td>&#160;</td></tr><tr><td class="number">60</td><td><span class="k1">void</span> start_timer<span class="k2">(</span><span class="k1">int</span> _timer_ms<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">61</td><td>  <span class="k1">if</span> <span class="k2">(</span>qpc_mode<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">62</td><td><span class="p">#ifdef ALLEGRO_WINDOWS</span></td></tr><tr><td class="number">63</td><td>    QueryPerformanceCounter<span class="k2">(</span><span class="k3">&amp;</span>last_perf_count_li<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">64</td><td>    last_perf_count <span class="k3">=</span> li_to_ll<span class="k2">(</span>last_perf_count_li<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">65</td><td><span class="p">#endif</span></td></tr><tr><td class="number">66</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">67</td><td>  <span class="k1">else</span> <span class="k2">{</span></td></tr><tr><td class="number">68</td><td>    stop_timer<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">69</td><td>    timer_ms <span class="k3">=</span> _timer_ms<span class="k2">;</span></td></tr><tr><td class="number">70</td><td>    <a href="http://www.allegro.cc/manual/install_int" target="_blank"><span class="a">install_int</span></a><span class="k2">(</span>timer_proc, timer_ms<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">71</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">72</td><td><span class="k2">}</span></td></tr><tr><td class="number">73</td><td>&#160;</td></tr><tr><td class="number">74</td><td><span class="k1">float</span> get_timer_delta<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">75</td><td>  <span class="k1">if</span> <span class="k2">(</span>qpc_mode<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">76</td><td><span class="p">#ifdef ALLEGRO_WINDOWS</span></td></tr><tr><td class="number">77</td><td>    QueryPerformanceCounter<span class="k2">(</span><span class="k3">&amp;</span>perf_count_li<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">78</td><td>    perf_count <span class="k3">=</span> li_to_ll<span class="k2">(</span>perf_count_li<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">79</td><td>    <span class="k1">float</span> result <span class="k3">=</span> <span class="k2">(</span><span class="k1">float</span><span class="k2">)</span><span class="k2">(</span><span class="k2">(</span><span class="k1">double</span><span class="k2">)</span><span class="k2">(</span>perf_count <span class="k3">-</span> last_perf_count<span class="k2">)</span> <span class="k3">/</span> <span class="k2">(</span><span class="k1">double</span><span class="k2">)</span>perf_freq<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">80</td><td>    last_perf_count <span class="k3">=</span> perf_count<span class="k2">;</span></td></tr><tr><td class="number">81</td><td>    <span class="k1">return</span> result<span class="k2">;</span></td></tr><tr><td class="number">82</td><td><span class="p">#else</span></td></tr><tr><td class="number">83</td><td>    <span class="k1">return</span> NULL<span class="k2">;</span></td></tr><tr><td class="number">84</td><td><span class="p">#endif</span></td></tr><tr><td class="number">85</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">86</td><td>  <span class="k1">else</span> <span class="k2">{</span></td></tr><tr><td class="number">87</td><td>    <span class="k1">float</span> result <span class="k3">=</span> <span class="k2">(</span><span class="k1">float</span><span class="k2">)</span>timer <span class="k3">*</span> <span class="k2">(</span><span class="k1">float</span><span class="k2">)</span>timer_ms <span class="k3">*</span> <span class="n">0</span>.<span class="n">001f</span><span class="k2">;</span></td></tr><tr><td class="number">88</td><td>    timer <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">89</td><td>    <span class="k1">return</span> result<span class="k2">;</span></td></tr><tr><td class="number">90</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">91</td><td><span class="k2">}</span></td></tr><tr><td class="number">92</td><td>&#160;</td></tr><tr><td class="number">93</td><td><span class="k1">const</span> <span class="k1">char</span><span class="k3">*</span> get_timing_method_string<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">94</td><td>  <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>initialized<span class="k2">)</span></td></tr><tr><td class="number">95</td><td>    <span class="k1">return</span> <span class="s">"Not initialized!"</span><span class="k2">;</span></td></tr><tr><td class="number">96</td><td>  <span class="k1">if</span> <span class="k2">(</span>qpc_mode<span class="k2">)</span></td></tr><tr><td class="number">97</td><td><span class="p">#ifdef ALLEGRO_WINDOWS</span></td></tr><tr><td class="number">98</td><td>    <span class="k1">return</span> <span class="s">"QueryPerformanceCounter"</span><span class="k2">;</span></td></tr><tr><td class="number">99</td><td><span class="p">#else</span></td></tr><tr><td class="number">100</td><td>    <span class="k1">return</span> <span class="s">"Something's terribly wrong"</span><span class="k2">;</span></td></tr><tr><td class="number">101</td><td><span class="p">#endif</span></td></tr><tr><td class="number">102</td><td>  <span class="k1">return</span> <span class="s">"Allegro timer routines"</span><span class="k2">;</span></td></tr><tr><td class="number">103</td><td><span class="k2">}</span></td></tr><tr><td class="number">104</td><td>&#160;</td></tr><tr><td class="number">105</td><td><span class="k1">float</span> get_timer_accuracy<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">106</td><td>  <span class="k1">if</span> <span class="k2">(</span>qpc_mode<span class="k2">)</span></td></tr><tr><td class="number">107</td><td><span class="p">#ifdef ALLEGRO_WINDOWS</span></td></tr><tr><td class="number">108</td><td>    <span class="k1">return</span> <span class="k2">(</span><span class="k1">float</span><span class="k2">)</span>perf_freq<span class="k2">;</span></td></tr><tr><td class="number">109</td><td><span class="p">#else</span></td></tr><tr><td class="number">110</td><td>    <span class="k1">return</span> <span class="n">0</span>.<span class="n">0f</span><span class="k2">;</span></td></tr><tr><td class="number">111</td><td><span class="p">#endif</span></td></tr><tr><td class="number">112</td><td>  <span class="k1">if</span> <span class="k2">(</span>timer_ms<span class="k2">)</span></td></tr><tr><td class="number">113</td><td>    <span class="k1">return</span> <span class="n">1000</span>.<span class="n">0f</span> <span class="k3">/</span> <span class="k2">(</span><span class="k1">float</span><span class="k2">)</span>timer_ms<span class="k2">;</span></td></tr><tr><td class="number">114</td><td>  <span class="k1">return</span> <span class="n">0</span>.<span class="n">0f</span><span class="k2">;</span></td></tr><tr><td class="number">115</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>

And here&#39;s what the main loop does:<br />(snip from scene.cpp)
</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">bool</span> SCENE::run<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">2</td><td>  <span class="k1">bool</span> looping <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span></td></tr><tr><td class="number">3</td><td>  <span class="k1">float</span> dt <span class="k3">=</span> <span class="n">0</span>.<span class="n">0f</span><span class="k2">;</span></td></tr><tr><td class="number">4</td><td>  <span class="k1">float</span> paintt <span class="k3">=</span> <span class="n">0</span>.<span class="n">0f</span><span class="k2">;</span></td></tr><tr><td class="number">5</td><td>  <span class="k1">float</span> min_paintt <span class="k3">=</span> <span class="n">0</span>.<span class="n">5f</span><span class="k2">;</span></td></tr><tr><td class="number">6</td><td>  fps <span class="k3">=</span> <span class="n">0</span>.<span class="n">0f</span><span class="k2">;</span></td></tr><tr><td class="number">7</td><td>  logic_frametime <span class="k3">=</span> <span class="n">0</span>.<span class="n">0f</span><span class="k2">;</span></td></tr><tr><td class="number">8</td><td>  render_frametime <span class="k3">=</span> <span class="n">0</span>.<span class="n">0f</span><span class="k2">;</span></td></tr><tr><td class="number">9</td><td>  logic_frames <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">10</td><td>  display_info <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span></td></tr><tr><td class="number">11</td><td>  </td></tr><tr><td class="number">12</td><td>  get_timer_delta<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">13</td><td>  </td></tr><tr><td class="number">14</td><td>  <span class="k1">while</span> <span class="k2">(</span>looping<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">15</td><td>    <span class="k1">while</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/keypressed" target="_blank"><span class="a">keypressed</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">16</td><td>      <span class="k1">switch</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/readkey" target="_blank"><span class="a">readkey</span></a><span class="k2">(</span><span class="k2">)</span> <span class="k3">&gt;</span><span class="k3">&gt;</span> <span class="n">8</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">17</td><td><span class="c">// removed irrelevant code here</span></td></tr><tr><td class="number">18</td><td>        <span class="k1">case</span> KEY_ESC:</td></tr><tr><td class="number">19</td><td>          looping <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span></td></tr><tr><td class="number">20</td><td>          <span class="k1">break</span><span class="k2">;</span></td></tr><tr><td class="number">21</td><td>      <span class="k2">}</span></td></tr><tr><td class="number">22</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">23</td><td>    </td></tr><tr><td class="number">24</td><td>    dt <span class="k3">=</span> get_timer_delta<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">25</td><td>    <span class="k3">+</span><span class="k3">+</span>logic_frames<span class="k2">;</span></td></tr><tr><td class="number">26</td><td>    tick<span class="k2">(</span>dt<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">27</td><td>    </td></tr><tr><td class="number">28</td><td>    paint<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">29</td><td>    </td></tr><tr><td class="number">30</td><td>    paintt <span class="k3">+</span><span class="k3">=</span> dt<span class="k2">;</span></td></tr><tr><td class="number">31</td><td>    </td></tr><tr><td class="number">32</td><td>    <span class="k1">if</span> <span class="k2">(</span>paintt <span class="k3">&gt;</span> min_paintt<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">33</td><td>      fps <span class="k3">=</span> <span class="k2">(</span><span class="k1">float</span><span class="k2">)</span>logic_frames <span class="k3">/</span> paintt<span class="k2">;</span></td></tr><tr><td class="number">34</td><td>      logic_frames <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">35</td><td>      paintt <span class="k3">=</span> <span class="n">0</span>.<span class="n">0f</span><span class="k2">;</span></td></tr><tr><td class="number">36</td><td>      render_frametime <span class="k3">=</span> <span class="n">1</span>.<span class="n">0f</span> <span class="k3">/</span> fps<span class="k2">;</span></td></tr><tr><td class="number">37</td><td>      logic_frametime <span class="k3">=</span> render_frametime<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>    </td></tr><tr><td class="number">40</td><td>    <span class="k1">if</span> <span class="k2">(</span>level_completed<span class="k2">)</span></td></tr><tr><td class="number">41</td><td>      looping <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span></td></tr><tr><td class="number">42</td><td>    <a href="http://www.allegro.cc/manual/rest" target="_blank"><span class="a">rest</span></a><span class="k2">(</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">43</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">44</td><td>  <span class="k1">return</span> level_completed<span class="k2">;</span></td></tr><tr><td class="number">45</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>

Makes sense?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Tobias Dammers)</author>
		<pubDate>Tue, 08 Aug 2006 20:50:40 +0000</pubDate>
	</item>
</rss>
