<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Game Engine that conserves CPU</title>
		<link>http://www.allegro.cc/forums/view/589969</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Sat, 10 Feb 2007 13:34:18 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>This is a continuation of the OT discussion from <a href="http://www.allegro.cc/forums/thread/589943">this thread</a>, on how to write a game engine that uses less than 100% of the CPU on fast computers, but automatically uses more CPU time as needed on slower computers.</p><p>Here&#39;s a simple program that implements such a system. Try it out to convince yourself that it works.
</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">/* A simple program that demonstrates how to write a game engine that doesn't use 100%</span></td></tr><tr><td class="number">2</td><td><span class="c">  of the CPU. The game will automatically use more CPU time on slower machines, and less</span></td></tr><tr><td class="number">3</td><td><span class="c">  time on faster machines.</span></td></tr><tr><td class="number">4</td><td><span class="c"></span></td></tr><tr><td class="number">5</td><td><span class="c">  On a fast machine: the game uses less than 100% CPU  (only as much as it needs)</span></td></tr><tr><td class="number">6</td><td><span class="c">  </span></td></tr><tr><td class="number">7</td><td><span class="c">  On a slower machine: the game uses 100% CPU. The Frames Per Second are lowered until the</span></td></tr><tr><td class="number">8</td><td><span class="c">                       machine can keep up. (We redraw the screen less frequently). The number</span></td></tr><tr><td class="number">9</td><td><span class="c">                       of logic updates per second remains the same. So the game runs at the same</span></td></tr><tr><td class="number">10</td><td><span class="c">                       speed on slower machines, but the graphics get choppy.</span></td></tr><tr><td class="number">11</td><td><span class="c"></span></td></tr><tr><td class="number">12</td><td><span class="c">  On a very slow machine: if the machine can't even handle 1 Frame Per Second, we start to skip</span></td></tr><tr><td class="number">13</td><td><span class="c">                          logic updates. (The game starts running slower) At this point, the</span></td></tr><tr><td class="number">14</td><td><span class="c">                          machine is probably too slow to run this game, or the user has other</span></td></tr><tr><td class="number">15</td><td><span class="c">                          programs running.</span></td></tr><tr><td class="number">16</td><td><span class="c">*/</span></td></tr><tr><td class="number">17</td><td><span class="p">#include "allegro.h"</span></td></tr><tr><td class="number">18</td><td>&#160;</td></tr><tr><td class="number">19</td><td><span class="c">//Number of logic updates per second</span></td></tr><tr><td class="number">20</td><td><span class="p">#define CYCLES_PER_SEC 50</span></td></tr><tr><td class="number">21</td><td>&#160;</td></tr><tr><td class="number">22</td><td><span class="p">#include &lt;iostream&gt;</span></td></tr><tr><td class="number">23</td><td><span class="p">#include &lt;string&gt;</span></td></tr><tr><td class="number">24</td><td><span class="p">#include &lt;sstream&gt;</span></td></tr><tr><td class="number">25</td><td>&#160;</td></tr><tr><td class="number">26</td><td><span class="k1">using</span> <span class="k1">namespace</span> std<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">volatile</span> <span class="k1">int</span> _logicTime <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span><span class="c">//incremented CYCLES_PER_SEC times each second</span></td></tr><tr><td class="number">29</td><td>&#160;</td></tr><tr><td class="number">30</td><td><span class="c">//These variables let us calculate FPS:</span></td></tr><tr><td class="number">31</td><td><span class="k1">int</span> graphicsCounter <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span><span class="c">//keeps track of how many times we drew to the screen</span></td></tr><tr><td class="number">32</td><td><span class="k1">int</span> logicCounter <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span><span class="c">//keeps track of how many times we updated the logic</span></td></tr><tr><td class="number">33</td><td><span class="k1">int</span> currentFPS <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span><span class="c">//the current frames per second</span></td></tr><tr><td class="number">34</td><td>&#160;</td></tr><tr><td class="number">35</td><td><span class="k1">bool</span> stopGame <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span><span class="c">//set to true to stop the game</span></td></tr><tr><td class="number">36</td><td>&#160;</td></tr><tr><td class="number">37</td><td><span class="c">//Display a bouncing ball to the screen:</span></td></tr><tr><td class="number">38</td><td><span class="k1">int</span> ballX <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span><span class="c">//ball coordinates</span></td></tr><tr><td class="number">39</td><td><span class="k1">int</span> ballY <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">40</td><td><span class="k1">int</span> horizDir <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span><span class="c">//0 if moving left, 1 if moving right</span></td></tr><tr><td class="number">41</td><td><span class="k1">int</span> vertDir <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span><span class="c">//0 if moving up, 1 if moving down</span></td></tr><tr><td class="number">42</td><td><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>backBuffer <span class="k3">=</span> NULL<span class="k2">;</span><span class="c">//lets us implement double-buffering</span></td></tr><tr><td class="number">43</td><td>&#160;</td></tr><tr><td class="number">44</td><td><span class="k1">bool</span> initAllegro<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">45</td><td><span class="k1">void</span> run<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">46</td><td><span class="k1">void</span> doLogic<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">47</td><td><span class="k1">void</span> drawGraphics<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">48</td><td>string intToStr<span class="k2">(</span><span class="k1">int</span> theValue<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">49</td><td>&#160;</td></tr><tr><td class="number">50</td><td><span class="k1">void</span> ticker<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span></td></tr><tr><td class="number">51</td><td><span class="k2">{</span></td></tr><tr><td class="number">52</td><td>  <span class="c">//if logicTime is &gt; CYCLES_PER_SEC, we start skipping logic updates</span></td></tr><tr><td class="number">53</td><td>  <span class="k1">if</span> <span class="k2">(</span>_logicTime <span class="k3">&lt;</span><span class="k3">=</span> CYCLES_PER_SEC<span class="k2">)</span></td></tr><tr><td class="number">54</td><td>    _logicTime<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span></td></tr><tr><td class="number">55</td><td><span class="k2">}</span><span class="c">//ticker</span></td></tr><tr><td class="number">56</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>ticker<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">57</td><td>&#160;</td></tr><tr><td class="number">58</td><td><span class="k1">int</span> main<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span></td></tr><tr><td class="number">59</td><td><span class="k2">{</span></td></tr><tr><td class="number">60</td><td>  <span class="k1">if</span> <span class="k2">(</span>initAllegro<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span></td></tr><tr><td class="number">61</td><td>    run<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">62</td><td>&#160;</td></tr><tr><td class="number">63</td><td>  <span class="k1">if</span> <span class="k2">(</span>backBuffer <span class="k3">!</span><span class="k3">=</span> NULL<span class="k2">)</span></td></tr><tr><td class="number">64</td><td>    <a href="http://www.allegro.cc/manual/destroy_bitmap" target="_blank"><span class="a">destroy_bitmap</span></a><span class="k2">(</span>backBuffer<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">65</td><td><span class="k2">}</span><span class="c">//main</span></td></tr><tr><td class="number">66</td><td>&#160;</td></tr><tr><td class="number">67</td><td><span class="k1">void</span> run<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span></td></tr><tr><td class="number">68</td><td><span class="k2">{</span></td></tr><tr><td class="number">69</td><td>  <span class="k1">int</span> logicLimiter <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span><span class="c">//if we aren't drawing anything to the screen and still can't</span></td></tr><tr><td class="number">70</td><td>                      <span class="c">//keep up, draw graphics at least once per second anyways</span></td></tr><tr><td class="number">71</td><td>  <span class="k1">bool</span> logicChanged <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span><span class="c">//true if we updated the logic and should redraw the graphics</span></td></tr><tr><td class="number">72</td><td>&#160;</td></tr><tr><td class="number">73</td><td>  <span class="k1">while</span> <span class="k2">(</span><span class="k3">!</span>stopGame<span class="k2">)</span></td></tr><tr><td class="number">74</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">75</td><td>    logicLimiter <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">76</td><td>    logicChanged <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span></td></tr><tr><td class="number">77</td><td>&#160;</td></tr><tr><td class="number">78</td><td>    <span class="k1">while</span> <span class="k2">(</span><span class="k2">(</span>_logicTime <span class="k3">&gt;</span> <span class="n">0</span><span class="k2">)</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> <span class="k2">(</span>logicLimiter <span class="k3">&lt;</span> CYCLES_PER_SEC<span class="k2">)</span><span class="k2">)</span></td></tr><tr><td class="number">79</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">80</td><td>      doLogic<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">81</td><td>&#160;</td></tr><tr><td class="number">82</td><td>      logicChanged <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span></td></tr><tr><td class="number">83</td><td>      logicCounter<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span></td></tr><tr><td class="number">84</td><td>      _logicTime--<span class="k2">;</span></td></tr><tr><td class="number">85</td><td>&#160;</td></tr><tr><td class="number">86</td><td>      logicLimiter<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span></td></tr><tr><td class="number">87</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">0</span><span class="k2">)</span><span class="k2">;</span><span class="c">//yield the CPU</span></td></tr><tr><td class="number">88</td><td>    <span class="k2">}</span><span class="c">//while logicTime</span></td></tr><tr><td class="number">89</td><td>&#160;</td></tr><tr><td class="number">90</td><td>    <span class="k1">if</span> <span class="k2">(</span>logicChanged<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>      drawGraphics<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">93</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">0</span><span class="k2">)</span><span class="k2">;</span><span class="c">//yield the CPU</span></td></tr><tr><td class="number">94</td><td>      graphicsCounter<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span></td></tr><tr><td class="number">95</td><td>    <span class="k2">}</span><span class="c">//if logicChanged</span></td></tr><tr><td class="number">96</td><td>    <span class="k1">else</span></td></tr><tr><td class="number">97</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">10</span><span class="k2">)</span><span class="k2">;</span><span class="c">//sleep for 10 ms</span></td></tr><tr><td class="number">98</td><td>  <span class="k2">}</span><span class="c">//while !stopGame</span></td></tr><tr><td class="number">99</td><td><span class="k2">}</span><span class="c">//run</span></td></tr><tr><td class="number">100</td><td>&#160;</td></tr><tr><td class="number">101</td><td><span class="k1">void</span> doLogic<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span></td></tr><tr><td class="number">102</td><td><span class="k2">{</span></td></tr><tr><td class="number">103</td><td>  <span class="c">//*** Calculate the FPS ***</span></td></tr><tr><td class="number">104</td><td>  <span class="k1">if</span> <span class="k2">(</span>logicCounter <span class="k3">&gt;</span><span class="k3">=</span> CYCLES_PER_SEC<span class="k2">)</span></td></tr><tr><td class="number">105</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">106</td><td>    currentFPS <span class="k3">=</span> graphicsCounter<span class="k2">;</span></td></tr><tr><td class="number">107</td><td>    graphicsCounter <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">108</td><td>    logicCounter <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">109</td><td>  <span class="k2">}</span><span class="c">//if logicCounter</span></td></tr><tr><td class="number">110</td><td>&#160;</td></tr><tr><td class="number">111</td><td>  <span class="c">//*** Move the ball ***</span></td></tr><tr><td class="number">112</td><td>  <span class="k1">if</span> <span class="k2">(</span>horizDir <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span></td></tr><tr><td class="number">113</td><td>    ballX <span class="k3">-</span><span class="k3">=</span> <span class="n">3</span><span class="k2">;</span></td></tr><tr><td class="number">114</td><td>  <span class="k1">else</span></td></tr><tr><td class="number">115</td><td>    ballX <span class="k3">+</span><span class="k3">=</span> <span class="n">3</span><span class="k2">;</span></td></tr><tr><td class="number">116</td><td>&#160;</td></tr><tr><td class="number">117</td><td>  <span class="k1">if</span> <span class="k2">(</span>vertDir <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span></td></tr><tr><td class="number">118</td><td>    ballY <span class="k3">-</span><span class="k3">=</span> <span class="n">3</span><span class="k2">;</span></td></tr><tr><td class="number">119</td><td>  <span class="k1">else</span></td></tr><tr><td class="number">120</td><td>    ballY <span class="k3">+</span><span class="k3">=</span> <span class="n">3</span><span class="k2">;</span></td></tr><tr><td class="number">121</td><td>&#160;</td></tr><tr><td class="number">122</td><td>  <span class="c">//*** make the ball bounce when it hits the edge of the screen ***</span></td></tr><tr><td class="number">123</td><td>  <span class="k1">if</span> <span class="k2">(</span>ballX <span class="k3">&lt;</span> <span class="n">0</span><span class="k2">)</span></td></tr><tr><td class="number">124</td><td>    horizDir <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span></td></tr><tr><td class="number">125</td><td>  <span class="k1">if</span> <span class="k2">(</span>ballX <span class="k3">&gt;</span> <span class="n">640</span><span class="k2">)</span></td></tr><tr><td class="number">126</td><td>    horizDir <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">127</td><td>&#160;</td></tr><tr><td class="number">128</td><td>  <span class="k1">if</span> <span class="k2">(</span>ballY <span class="k3">&lt;</span> <span class="n">0</span><span class="k2">)</span></td></tr><tr><td class="number">129</td><td>    vertDir <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span></td></tr><tr><td class="number">130</td><td>  <span class="k1">if</span> <span class="k2">(</span>ballY <span class="k3">&gt;</span> <span class="n">480</span><span class="k2">)</span></td></tr><tr><td class="number">131</td><td>    vertDir <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">132</td><td>&#160;</td></tr><tr><td class="number">133</td><td>  <span class="k1">if</span> <span class="k2">(</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">134</td><td>    stopGame <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span></td></tr><tr><td class="number">135</td><td><span class="k2">}</span><span class="c">//doLogic</span></td></tr><tr><td class="number">136</td><td>&#160;</td></tr><tr><td class="number">137</td><td><span class="k1">void</span> drawGraphics<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span></td></tr><tr><td class="number">138</td><td><span class="k2">{</span></td></tr><tr><td class="number">139</td><td>  string theFPS <span class="k3">=</span> <span class="s">"FPS: "</span><span class="k2">;</span><span class="c">//display the frames per second to the screen</span></td></tr><tr><td class="number">140</td><td>&#160;</td></tr><tr><td class="number">141</td><td>  <a href="http://www.allegro.cc/manual/clear_bitmap" target="_blank"><span class="a">clear_bitmap</span></a><span class="k2">(</span>backBuffer<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">142</td><td>&#160;</td></tr><tr><td class="number">143</td><td>  <span class="c">//*** Draw a bouncing ball ***</span></td></tr><tr><td class="number">144</td><td>  <a href="http://www.allegro.cc/manual/circlefill" target="_blank"><span class="a">circlefill</span></a><span class="k2">(</span>backBuffer, ballX, ballY,</td></tr><tr><td class="number">145</td><td>             <span class="n">20</span>, <a href="http://www.allegro.cc/manual/makecol" target="_blank"><span class="a">makecol</span></a><span class="k2">(</span><span class="n">100</span>, <span class="n">150</span>, <span class="n">200</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">146</td><td>&#160;</td></tr><tr><td class="number">147</td><td>  <span class="c">//*** Display the frames per second ***</span></td></tr><tr><td class="number">148</td><td>  theFPS.append<span class="k2">(</span>intToStr<span class="k2">(</span>currentFPS<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">149</td><td>  <a href="http://www.allegro.cc/manual/textout_ex" target="_blank"><span class="a">textout_ex</span></a><span class="k2">(</span>backBuffer, <a href="http://www.allegro.cc/manual/font" target="_blank"><span class="a">font</span></a>,</td></tr><tr><td class="number">150</td><td>             theFPS.c_str<span class="k2">(</span><span class="k2">)</span>,</td></tr><tr><td class="number">151</td><td>             <span class="n">10</span>, <span class="n">5</span>,</td></tr><tr><td class="number">152</td><td>             <a href="http://www.allegro.cc/manual/makecol" target="_blank"><span class="a">makecol</span></a><span class="k2">(</span><span class="n">200</span>, <span class="n">200</span>, <span class="n">200</span><span class="k2">)</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">153</td><td>&#160;</td></tr><tr><td class="number">154</td><td>  <a href="http://www.allegro.cc/manual/textout_ex" target="_blank"><span class="a">textout_ex</span></a><span class="k2">(</span>backBuffer, <a href="http://www.allegro.cc/manual/font" target="_blank"><span class="a">font</span></a>,</td></tr><tr><td class="number">155</td><td>             <span class="s">"Hit ESC to quit"</span>,</td></tr><tr><td class="number">156</td><td>             <span class="n">10</span>, <span class="n">40</span>,</td></tr><tr><td class="number">157</td><td>             <a href="http://www.allegro.cc/manual/makecol" target="_blank"><span class="a">makecol</span></a><span class="k2">(</span><span class="n">200</span>, <span class="n">200</span>, <span class="n">200</span><span class="k2">)</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">158</td><td>&#160;</td></tr><tr><td class="number">159</td><td>  <span class="c">//*** Draw the back buffer to the screen ***</span></td></tr><tr><td class="number">160</td><td>  <a href="http://www.allegro.cc/manual/draw_sprite" target="_blank"><span class="a">draw_sprite</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/screen" target="_blank"><span class="a">screen</span></a>, backBuffer, <span class="n">0</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">161</td><td><span class="k2">}</span><span class="c">//drawGraphics</span></td></tr><tr><td class="number">162</td><td>&#160;</td></tr><tr><td class="number">163</td><td><span class="k1">bool</span> initAllegro<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span></td></tr><tr><td class="number">164</td><td><span class="k2">{</span></td></tr><tr><td class="number">165</td><td>  <span class="k1">int</span> gResult <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span><span class="c">//result of graphics setup</span></td></tr><tr><td class="number">166</td><td>  <span class="k1">bool</span> result <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span><span class="c">//false if we couldn't initialize</span></td></tr><tr><td class="number">167</td><td>&#160;</td></tr><tr><td class="number">168</td><td>  <a href="http://www.allegro.cc/manual/set_uformat" target="_blank"><span class="a">set_uformat</span></a><span class="k2">(</span>U_ASCII<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">169</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">170</td><td>&#160;</td></tr><tr><td class="number">171</td><td>  <span class="c">//these are unlikely to fail</span></td></tr><tr><td class="number">172</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">173</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">174</td><td>&#160;</td></tr><tr><td class="number">175</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">24</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">176</td><td>  gResult <span class="k3">=</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,</td></tr><tr><td class="number">177</td><td>                         <span class="n">640</span>, <span class="n">480</span>,</td></tr><tr><td class="number">178</td><td>                         <span class="n">0</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">179</td><td>&#160;</td></tr><tr><td class="number">180</td><td>  <span class="k1">if</span> <span class="k2">(</span>gResult <span class="k3">&lt;</span> <span class="n">0</span><span class="k2">)</span></td></tr><tr><td class="number">181</td><td>    result <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span></td></tr><tr><td class="number">182</td><td>&#160;</td></tr><tr><td class="number">183</td><td>  <span class="c">//*** Ensure the program will keep running even if it lost focus ***</span></td></tr><tr><td class="number">184</td><td>  <span class="k1">if</span> <span class="k2">(</span>result<span class="k2">)</span></td></tr><tr><td class="number">185</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">186</td><td>    <span class="k1">if</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/set_display_switch_mode" target="_blank"><span class="a">set_display_switch_mode</span></a><span class="k2">(</span>SWITCH_BACKGROUND<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">187</td><td>      cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"Using SWITCH_BACKGROUND mode"</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> endl<span class="k2">;</span></td></tr><tr><td class="number">188</td><td>    <span class="k1">else</span></td></tr><tr><td class="number">189</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">190</td><td>      <span class="k1">if</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/set_display_switch_mode" target="_blank"><span class="a">set_display_switch_mode</span></a><span class="k2">(</span>SWITCH_BACKAMNESIA<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">191</td><td>        cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"Using SWITCH_BACKAMNESIA mode"</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> endl<span class="k2">;</span></td></tr><tr><td class="number">192</td><td>      <span class="k1">else</span></td></tr><tr><td class="number">193</td><td>      <span class="k2">{</span></td></tr><tr><td class="number">194</td><td>        result <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span></td></tr><tr><td class="number">195</td><td>        cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"Couldn't ensure that the program keeps running if it loses focus"</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> endl<span class="k2">;</span></td></tr><tr><td class="number">196</td><td>      <span class="k2">}</span><span class="c">//else set_display_switch_mode</span></td></tr><tr><td class="number">197</td><td>    <span class="k2">}</span><span class="c">//if set_display_switch_mode</span></td></tr><tr><td class="number">198</td><td>  <span class="k2">}</span><span class="c">//if result</span></td></tr><tr><td class="number">199</td><td>&#160;</td></tr><tr><td class="number">200</td><td>  <span class="c">//*** Initialize timer ***</span></td></tr><tr><td class="number">201</td><td>  <span class="k1">if</span> <span class="k2">(</span>result<span class="k2">)</span></td></tr><tr><td class="number">202</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">203</td><td>    <a href="http://www.allegro.cc/manual/LOCK_VARIABLE" target="_blank"><span class="a">LOCK_VARIABLE</span></a><span class="k2">(</span>_logicTime<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">204</td><td>    <a href="http://www.allegro.cc/manual/LOCK_FUNCTION" target="_blank"><span class="a">LOCK_FUNCTION</span></a><span class="k2">(</span>ticker<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">205</td><td>    <span class="k1">if</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/install_int_ex" target="_blank"><span class="a">install_int_ex</span></a><span class="k2">(</span>ticker, BPS_TO_TIMER<span class="k2">(</span>CYCLES_PER_SEC<span class="k2">)</span><span class="k2">)</span> <span class="k3">&lt;</span> <span class="n">0</span><span class="k2">)</span></td></tr><tr><td class="number">206</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">207</td><td>      cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"Couldn't start ticker function"</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> endl<span class="k2">;</span></td></tr><tr><td class="number">208</td><td>      result <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span></td></tr><tr><td class="number">209</td><td>    <span class="k2">}</span><span class="c">//if install_int_ex</span></td></tr><tr><td class="number">210</td><td>  <span class="k2">}</span><span class="c">//if result</span></td></tr><tr><td class="number">211</td><td>&#160;</td></tr><tr><td class="number">212</td><td>  <span class="k1">if</span> <span class="k2">(</span>result<span class="k2">)</span></td></tr><tr><td class="number">213</td><td>    backBuffer <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><span class="n">640</span>, <span class="n">480</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">214</td><td>&#160;</td></tr><tr><td class="number">215</td><td>  <span class="k1">return</span> result<span class="k2">;</span></td></tr><tr><td class="number">216</td><td><span class="k2">}</span><span class="c">//initAllegro</span></td></tr><tr><td class="number">217</td><td>&#160;</td></tr><tr><td class="number">218</td><td>string intToStr<span class="k2">(</span><span class="k1">int</span> theValue<span class="k2">)</span></td></tr><tr><td class="number">219</td><td><span class="k2">{</span></td></tr><tr><td class="number">220</td><td>  stringstream converter<span class="k2">;</span><span class="c">//converts theValue to a string</span></td></tr><tr><td class="number">221</td><td>  string result<span class="k2">;</span><span class="c">//the converted text</span></td></tr><tr><td class="number">222</td><td>&#160;</td></tr><tr><td class="number">223</td><td>  converter <span class="k3">&lt;</span><span class="k3">&lt;</span> theValue<span class="k2">;</span></td></tr><tr><td class="number">224</td><td>  converter <span class="k3">&gt;</span><span class="k3">&gt;</span> result<span class="k2">;</span></td></tr><tr><td class="number">225</td><td>&#160;</td></tr><tr><td class="number">226</td><td>  <span class="k1">return</span> result<span class="k2">;</span></td></tr><tr><td class="number">227</td><td><span class="k2">}</span><span class="c">//showInt</span></td></tr></tbody></table></div></div><p>

</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
if you&#39;re computer is fast enough, and it is sitting in a busy wait loop (pushing cpu usage to 100%) you should yield/rest then... no?
</p></div></div><p>That is exactly what this does! If you&#39;re redrawing the graphics but there was no logic update since the last redraw, you&#39;re &quot;caught up&quot;. You have time to kill. So sleep. </p><p>But if there was a logic update, your game is still chugging away. So yield. Yielding is optional, but it helps ensure smooth multitasking if there are other programs running, or if your program is multi-threaded.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Myrdos)</author>
		<pubDate>Fri, 09 Feb 2007 00:25:56 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I honestly believe the best way to do such a game loop is to have a timer that can wake up a blocking (sleeping) main loop thread. All the rest still boils down to polling. </p><p>But in order to have such a timer you can&#39;t use the allegro timer. A library would have to be written or os specific code would have to be used. </p><p>edit: <br />strong hack but.. i suppose since the timer runs in a seperate thread it could send some sort of message to the blocking main thread to basically wake it up. A semaphore mechanism could work here perhaps where timer unlocks and main thread locks (at end of loop).
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Goalie Ca)</author>
		<pubDate>Fri, 09 Feb 2007 01:52:26 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>And this is all presuming you do fixed frame calculations. For almost three years now I&#39;ve been programming real-time instead of fixed-frame and the concept of frame dropping has sort of eluded me as a result.</p><p>My real-time timers give 1 ms of time back to the CPU every frame to prevent I/O issues with Windows 98 and recent Allegro versions. This also means that at lower framerates, less time is given back to the CPU, and at higher framerates, more time is given up. Also, with vsyncing enabled, the time spent waiting for a vsync also gives the CPU a break.</p><p>My recent game, <a href="http://www.allegro.cc/depot/PixelShipsRetro">PixelShips Retro</a>, at 120 FPS, measures only 30%~40% CPU usage on my 2 GHz, Windows 98 system. Granted, it&#39;s also running at a mere 320x240x8bpp graphics mode.</p><p>Though on some systems the CPU usage barely registers for some reason, even with vsyncing off... <b>shrugs</b></p><p>--- Kris Asick (Gemini)<br />--- <a href="http://www.pixelships.com">http://www.pixelships.com</a>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Kris Asick)</author>
		<pubDate>Fri, 09 Feb 2007 03:17:45 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>My apologies for derailing the other thread... <img src="http://www.allegro.cc/forums/smileys/embarassed.gif" alt=":-[" /></p><p>Audric PM&#39;d me a longer explination, </p><p>I think Goalie Ca is on to a neat idea...</p><p>Does vsync() actually cause the main thread to sleep? I thought it busy waited also...</p><p>KA: could you elaborate? It doesn&#39;t sound like you&#39;re using allegro timers.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Michael Jensen)</author>
		<pubDate>Fri, 09 Feb 2007 04:55:30 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>vsync() is a busy wait on win98.</p><p>edit: I rechecked: mingw executable of &quot;exmouse&quot; uses vsync for speed control : I get 100%CPU.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Audric)</author>
		<pubDate>Fri, 09 Feb 2007 05:43:12 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>woah, hold on to your horses! , you mean that using vsync would cause a 100% cpu usage on win98 systems?!?! that&#39;s insane :S and i&#39;m confused..
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Albin Engström)</author>
		<pubDate>Fri, 09 Feb 2007 07:49:52 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p><b>Audric:</b> Wasn&#39;t sure of that. Thanks. <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" /></p><p><b>Albin Engström:</b> Based on what Audric said, yes it would, but only if you never gave any time back to the system with rest() or Sleep() commands.</p><p><b>Michael Jensen:</b> I was using the Allegro timers at first, then I found a way to use the Windows high performance timers thanks to other forum goers here. As a result, my routines are now able to use either. (But prefers my own since it&#39;s more reliable than the Allegro ones and only uses the Allegro ones if the high performance timer is mysteriously unavailable.)</p><p>The way I do it is to run a timer at 2400 ticks a second, since this rate compares the most easily with the multitude of screen refresh rates out there, and I time my logic to this using floating point values where 1.0f = 1 second. (Thus one tick is 4.166... microseconds.) I also pick 2400 because the Allegro timers handle it better than higher values I&#39;ve tried.</p><p>Thus every frame I update and check the timers to see how much time has passed since the last frame, and update my logic by that amount, and since everything is floating point, everything is updated at the proper rate, whether the framerate is 10, 100, or more. In the extremely unlikely event of a zero-frame (not enough time has passed to increment the tick counter) then the game logic is processed with a multiplier of 0.0f, and thus goes nowhere until the next frame.</p><p>I also do frame interpolation in PixelShips Retro, but that&#39;s another topic entirely. <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" /></p><p>(Side Note: The Allegro timers ALSO use the Windows high performance timers when they are present... but because they work on an interrupt basis they don&#39;t always give the exact value they should. Directly accessing the Windows high performance timers can thus be more accurate when done right.)</p><p>--- Kris Asick (Gemini)<br />--- <a href="http://www.pixelships.com">http://www.pixelships.com</a>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Kris Asick)</author>
		<pubDate>Fri, 09 Feb 2007 07:56:58 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Albin: yeah, it was a surprise to me too. Maybe I disabled vsync in the DirectX settings for the graphics card ? It&#39;s possible I did, but I can&#39;t remember nor find the parameters right now...
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Audric)</author>
		<pubDate>Fri, 09 Feb 2007 08:16:56 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>er.. i think i&#39;m even more confused now.. would&#39;nt the cpu reach 100% even without vsync? in the case that the program used no rest or sleep?? :S
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Albin Engström)</author>
		<pubDate>Fri, 09 Feb 2007 08:17:16 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I decided to implement some code. This is for linux/mac only at the moment. Windows support should be trivial to add though. Someone could please add it? ATM this uses absolutely 0% of the CPU time. </p><p>This isn&#39;t the best solution out there but its simple for most people. If your code runs slower than BPS this code will slow it down even more as it waits an extra tick for a release. I haven&#39;t tested that but you guys shouldn&#39;t have a problem. DO post any revisions to allegro.cc</p><p>I would like to make this an add-on library or something for people or something. I suppose if we went the c++ route we could use boost/mutex for cross platform. If not it&#39;d be best to do a bunch of #ifdef WINDOWS etc. and add a few threading utilities. I believe SDL has threading <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" /></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">/*</span></td></tr><tr><td class="number">2</td><td><span class="c">(c) 2007 by Ryan Dickie</span></td></tr><tr><td class="number">3</td><td><span class="c">*/</span></td></tr><tr><td class="number">4</td><td><span class="p">#include &lt;allegro.h&gt;</span></td></tr><tr><td class="number">5</td><td><span class="c">//for posix threading</span></td></tr><tr><td class="number">6</td><td><span class="p">#include &lt;pthread.h&gt;</span></td></tr><tr><td class="number">7</td><td><span class="c">//for printing seconds since 1970 or whatever</span></td></tr><tr><td class="number">8</td><td><span class="p">#include &lt;stdlib.h&gt;</span></td></tr><tr><td class="number">9</td><td>&#160;</td></tr><tr><td class="number">10</td><td><span class="c">//number of cycles per second</span></td></tr><tr><td class="number">11</td><td><span class="p">#define BPS 60</span></td></tr><tr><td class="number">12</td><td>&#160;</td></tr><tr><td class="number">13</td><td><span class="c">//create the mutex</span></td></tr><tr><td class="number">14</td><td>pthread_mutex_t timer_mutex <span class="k3">=</span> PTHREAD_MUTEX_INITIALIZER<span class="k2">;</span></td></tr><tr><td class="number">15</td><td>&#160;</td></tr><tr><td class="number">16</td><td><span class="k1">void</span> ticker<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span></td></tr><tr><td class="number">17</td><td><span class="k2">{</span></td></tr><tr><td class="number">18</td><td>  pthread_mutex_unlock<span class="k2">(</span><span class="k3">&amp;</span>timer_mutex<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">19</td><td><span class="k2">}</span></td></tr><tr><td class="number">20</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>ticker<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>&#160;</td></tr><tr><td class="number">23</td><td><span class="k1">int</span> main<span class="k2">(</span><span class="k1">int</span> argc, <span class="k1">char</span><span class="k3">*</span><span class="k3">*</span> argv<span class="k2">)</span></td></tr><tr><td class="number">24</td><td><span class="k2">{</span></td></tr><tr><td class="number">25</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">26</td><td>&#160;</td></tr><tr><td class="number">27</td><td>  <a href="http://www.allegro.cc/manual/LOCK_FUNCTION" target="_blank"><span class="a">LOCK_FUNCTION</span></a><span class="k2">(</span>ticker<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">28</td><td>&#160;</td></tr><tr><td class="number">29</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">30</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">31</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">24</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">32</td><td>  <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="k2">;</span></td></tr><tr><td class="number">33</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>ticker, BPS_TO_TIMER<span class="k2">(</span>BPS<span class="k2">)</span><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">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>    <span class="c">//do stuff here</span></td></tr><tr><td class="number">38</td><td>    <a href="http://www.allegro.cc/manual/rectfill" target="_blank"><span class="a">rectfill</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">1</span>, <span class="n">1</span>, <span class="n">200</span>, <span class="n">20</span>, <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>    <a href="http://www.allegro.cc/manual/textprintf_ex" target="_blank"><span class="a">textprintf_ex</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/font" target="_blank"><span class="a">font</span></a>, <span class="n">10</span>, <span class="n">10</span>, <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">100</span>, <span class="n">200</span><span class="k2">)</span>,<span class="k3">-</span><span class="n">1</span>, <span class="s">"Time: %d"</span>, <a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a><span class="k2">(</span>NULL<span class="k2">)</span> <span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">40</td><td>    <span class="c">//end of loop!</span></td></tr><tr><td class="number">41</td><td>    pthread_mutex_lock<span class="k2">(</span><span class="k3">&amp;</span>timer_mutex<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">42</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">43</td><td>&#160;</td></tr><tr><td class="number">44</td><td>  <span class="k1">return</span> <span class="n">0</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><span class="k2">;</span></td></tr></tbody></table></div></div><p>

edit: for those of you interested this is potential windows code. I believe though that by including windows.h you require a winmain function etc. This should be fixable by just including what&#39;s needed. This one hasn&#39;t been tested..</p><p>edit2: appears its in winbase.h , maybe that helps maybe it doesn&#39;t</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="c">//for windows threading</span></td></tr><tr><td class="number">3</td><td><span class="p">#include &lt;winbase.h&gt;</span></td></tr><tr><td class="number">4</td><td><span class="c">//for printing seconds since 1970 or whatever</span></td></tr><tr><td class="number">5</td><td><span class="p">#include &lt;stdlib.h&gt;</span></td></tr><tr><td class="number">6</td><td>&#160;</td></tr><tr><td class="number">7</td><td><span class="c">//number of cycles per second</span></td></tr><tr><td class="number">8</td><td><span class="p">#define BPS 60</span></td></tr><tr><td class="number">9</td><td>&#160;</td></tr><tr><td class="number">10</td><td><span class="c">//create the mutex</span></td></tr><tr><td class="number">11</td><td>HANDLE timer_mutex<span class="k2">;</span> <span class="c">//pthread_mutex_t</span></td></tr><tr><td class="number">12</td><td>&#160;</td></tr><tr><td class="number">13</td><td><span class="k1">void</span> ticker<span class="k2">(</span><span class="k1">void</span><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>  ReleaseMutex<span class="k2">(</span>timer_mutex<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><a href="http://www.allegro.cc/manual/END_OF_FUNCTION" target="_blank"><span class="a">END_OF_FUNCTION</span></a><span class="k2">(</span>ticker<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">18</td><td>&#160;</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="k1">int</span> argc, <span class="k1">char</span><span class="k3">*</span><span class="k3">*</span> argv<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>  timer_mutex <span class="k3">=</span> CreateMutex<span class="k2">(</span><span class="n">0</span>, FALSE, <span class="n">0</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/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">24</td><td>&#160;</td></tr><tr><td class="number">25</td><td>  <a href="http://www.allegro.cc/manual/LOCK_FUNCTION" target="_blank"><span class="a">LOCK_FUNCTION</span></a><span class="k2">(</span>ticker<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">26</td><td>&#160;</td></tr><tr><td class="number">27</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">28</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">29</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">24</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">30</td><td>  <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="k2">;</span></td></tr><tr><td class="number">31</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>ticker, BPS_TO_TIMER<span class="k2">(</span>BPS<span class="k2">)</span><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">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">34</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">35</td><td>    <span class="c">//do stuff here</span></td></tr><tr><td class="number">36</td><td>    <a href="http://www.allegro.cc/manual/rectfill" target="_blank"><span class="a">rectfill</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">1</span>, <span class="n">1</span>, <span class="n">200</span>, <span class="n">20</span>, <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">37</td><td>    <a href="http://www.allegro.cc/manual/textprintf_ex" target="_blank"><span class="a">textprintf_ex</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/font" target="_blank"><span class="a">font</span></a>, <span class="n">10</span>, <span class="n">10</span>, <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">100</span>, <span class="n">200</span><span class="k2">)</span>,<span class="k3">-</span><span class="n">1</span>, <span class="s">"Time: %d"</span>, <a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a><span class="k2">(</span>NULL<span class="k2">)</span> <span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">38</td><td>    <span class="c">//end of loop!</span></td></tr><tr><td class="number">39</td><td>    WaitForSingleObject<span class="k2">(</span>timer_mutex, INFINITE<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>&#160;</td></tr><tr><td class="number">42</td><td>  CloseHandle<span class="k2">(</span>timer_mutex<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">43</td><td>  <span class="k1">return</span> <span class="n">0</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><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><span class="k2">;</span></td></tr></tbody></table></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Goalie Ca)</author>
		<pubDate>Fri, 09 Feb 2007 12:16:52 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Here&#39;s the C++ version of a windows/linux friendly mutex, should be easy to convert to plain C. <i>Should</i> be, but I&#39;m just too tired. <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" /><br />DyMutex.hpp:
</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">#ifndef DY_MUTEX</span></td></tr><tr><td class="number">2</td><td><span class="p">#define DY_MUTEX</span></td></tr><tr><td class="number">3</td><td>&#160;</td></tr><tr><td class="number">4</td><td><span class="p">#ifndef DY_WINDOWS_VERSION</span></td></tr><tr><td class="number">5</td><td>  <span class="p">#include &lt;pthread.h&gt;</span></td></tr><tr><td class="number">6</td><td><span class="p">#endif</span></td></tr><tr><td class="number">7</td><td>&#160;</td></tr><tr><td class="number">8</td><td><span class="k1">class</span> DyMutex</td></tr><tr><td class="number">9</td><td><span class="k2">{</span></td></tr><tr><td class="number">10</td><td>  private:</td></tr><tr><td class="number">11</td><td>    <span class="c">//the cross-platform mutex</span></td></tr><tr><td class="number">12</td><td>    <span class="p">#ifdef DY_WINDOWS_VERSION</span></td></tr><tr><td class="number">13</td><td>      HANDLE theMutex<span class="k2">;</span></td></tr><tr><td class="number">14</td><td>    <span class="p">#else</span></td></tr><tr><td class="number">15</td><td>      pthread_mutex_t theMutex<span class="k2">;</span></td></tr><tr><td class="number">16</td><td>    <span class="p">#endif</span></td></tr><tr><td class="number">17</td><td>&#160;</td></tr><tr><td class="number">18</td><td>  public:</td></tr><tr><td class="number">19</td><td>    <span class="c">//constructor</span></td></tr><tr><td class="number">20</td><td>    DyMutex<span class="k2">(</span><span class="k1">void</span><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="c">//destructor</span></td></tr><tr><td class="number">23</td><td>    ~DyMutex<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">24</td><td>&#160;</td></tr><tr><td class="number">25</td><td>    <span class="c">//restrict access to critical areas</span></td></tr><tr><td class="number">26</td><td>    <span class="p">#ifdef DY_WINDOWS_VERSION</span></td></tr><tr><td class="number">27</td><td>      <span class="k1">void</span> enterLock<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">28</td><td>      <span class="k1">void</span> exitLock<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">29</td><td>    <span class="p">#else</span></td></tr><tr><td class="number">30</td><td>      <span class="k1">void</span> enterLock<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">31</td><td>      <span class="k1">void</span> exitLock<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">32</td><td>    <span class="p">#endif</span></td></tr><tr><td class="number">33</td><td><span class="k2">}</span><span class="k2">;</span><span class="c">//DyMutex</span></td></tr><tr><td class="number">34</td><td>&#160;</td></tr><tr><td class="number">35</td><td><span class="p">#endif</span></td></tr></tbody></table></div></div><p>
DyMutex.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 "DyMutex.hpp"</span></td></tr><tr><td class="number">2</td><td>&#160;</td></tr><tr><td class="number">3</td><td><span class="k1">using</span> <span class="k1">namespace</span> std<span class="k2">;</span></td></tr><tr><td class="number">4</td><td>&#160;</td></tr><tr><td class="number">5</td><td>DyMutex::DyMutex<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span></td></tr><tr><td class="number">6</td><td><span class="k2">{</span></td></tr><tr><td class="number">7</td><td>  <span class="p">#ifdef DY_WINDOWS_VERSION</span></td></tr><tr><td class="number">8</td><td>    theMutex <span class="k3">=</span> CreateMutex<span class="k2">(</span>NULL, FALSE, NULL<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">9</td><td>    <span class="k1">if</span> <span class="k2">(</span>theMutex <span class="k3">=</span><span class="k3">=</span> NULL<span class="k2">)</span></td></tr><tr><td class="number">10</td><td>      cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"DyMutex::DyMutex() CreateMutex "</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> GetLastError<span class="k2">(</span><span class="k2">)</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> endl<span class="k2">;</span></td></tr><tr><td class="number">11</td><td>  <span class="p">#else</span></td></tr><tr><td class="number">12</td><td>    <span class="k1">if</span> <span class="k2">(</span>pthread_mutex_init<span class="k2">(</span><span class="k3">&amp;</span>theMutex, NULL<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">13</td><td>      cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"DyMutex::DyMutex() pthread_mutex_init"</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> endl<span class="k2">;</span></td></tr><tr><td class="number">14</td><td>  <span class="p">#endif</span></td></tr><tr><td class="number">15</td><td><span class="k2">}</span><span class="c">//constructor</span></td></tr><tr><td class="number">16</td><td>&#160;</td></tr><tr><td class="number">17</td><td>DyMutex::~DyMutex<span class="k2">(</span><span class="k1">void</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>  <span class="p">#ifdef DY_WINDOWS_VERSION</span></td></tr><tr><td class="number">20</td><td>    <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>CloseHandle<span class="k2">(</span>theMutex<span class="k2">)</span><span class="k2">)</span></td></tr><tr><td class="number">21</td><td>      cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"DyMutex::~DyMutex() CloseHandle "</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> GetLastError<span class="k2">(</span><span class="k2">)</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> endl<span class="k2">;</span></td></tr><tr><td class="number">22</td><td>  <span class="p">#else</span></td></tr><tr><td class="number">23</td><td>    <span class="k1">if</span> <span class="k2">(</span>pthread_mutex_destroy<span class="k2">(</span><span class="k3">&amp;</span>theMutex<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">24</td><td>      cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"DyMutex::~DyMutex() pthread_mutex_destroy"</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> endl<span class="k2">;</span></td></tr><tr><td class="number">25</td><td>  <span class="p">#endif</span></td></tr><tr><td class="number">26</td><td><span class="k2">}</span><span class="c">//desctructor</span></td></tr><tr><td class="number">27</td><td>&#160;</td></tr><tr><td class="number">28</td><td><span class="p">#ifdef DY_WINDOWS_VERSION</span></td></tr><tr><td class="number">29</td><td>  <span class="k1">void</span> DyMutex::enterLock<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span></td></tr><tr><td class="number">30</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">31</td><td>    <span class="k1">if</span> <span class="k2">(</span>WaitForSingleObject<span class="k2">(</span>theMutex, INFINITE<span class="k2">)</span> <span class="k3">!</span><span class="k3">=</span> WAIT_OBJECT_0<span class="k2">)</span></td></tr><tr><td class="number">32</td><td>      cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"DyMutex::enterLock()"</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> endl<span class="k2">;</span></td></tr><tr><td class="number">33</td><td>  <span class="k2">}</span><span class="c">//enterLock</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> DyMutex::exitLock<span class="k2">(</span><span class="k1">void</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">if</span> <span class="k2">(</span><span class="k3">!</span>ReleaseMutex<span class="k2">(</span>theMutex<span class="k2">)</span><span class="k2">)</span></td></tr><tr><td class="number">38</td><td>      cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"DyMutex::exitLock()"</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> endl<span class="k2">;</span></td></tr><tr><td class="number">39</td><td>  <span class="k2">}</span><span class="c">//exitLock</span></td></tr><tr><td class="number">40</td><td><span class="p">#else</span></td></tr><tr><td class="number">41</td><td>  <span class="k1">void</span> DyMutex::enterLock<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span></td></tr><tr><td class="number">42</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">43</td><td>    <span class="k1">if</span> <span class="k2">(</span>pthread_mutex_lock<span class="k2">(</span><span class="k3">&amp;</span>theMutex<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">44</td><td>      cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"DyMutex::enterLock()"</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> endl<span class="k2">;</span></td></tr><tr><td class="number">45</td><td>  <span class="k2">}</span><span class="c">//enterLock</span></td></tr><tr><td class="number">46</td><td>&#160;</td></tr><tr><td class="number">47</td><td>  <span class="k1">void</span> DyMutex::exitLock<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span></td></tr><tr><td class="number">48</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">49</td><td>    <span class="k1">if</span> <span class="k2">(</span>pthread_mutex_unlock<span class="k2">(</span><span class="k3">&amp;</span>theMutex<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">50</td><td>      cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"DyMutex::exitLock()"</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> endl<span class="k2">;</span></td></tr><tr><td class="number">51</td><td>  <span class="k2">}</span><span class="c">//exitLock</span></td></tr><tr><td class="number">52</td><td><span class="p">#endif</span></td></tr></tbody></table></div></div><p>

[EDIT]Looks like you&#39;ve got it already. <img src="http://www.allegro.cc/forums/smileys/undecided.gif" alt=":-/" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Myrdos)</author>
		<pubDate>Fri, 09 Feb 2007 12:52:57 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Looks like you&#39;ve got it already.
</p></div></div><p>

Not really. You put it together in a single class. I also need to put error handling etc. </p><p>The only question I really have though is about including files. I noticed you don&#39;t include any windows header files. </p><p>The little i do know about windows.h and winapi is that you can&#39;t really mix and match it with anything else without issues. I tried to include windows base but i&#39;m not sure if that requires winmain like everything else. Also.. say it does... and a user needs to call winmain.. how does that play with allegro!?</p><p>edit:<br />I booted to windows.. made some minor changes to the allegro init and found that winalleg.h is what contains all that is needed. The only problem is that it doesn&#39;t actually seem to block at all. It&#39;s always failing. How could a mutex not actually block!? only on windows...
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Goalie Ca)</author>
		<pubDate>Fri, 09 Feb 2007 13:52:28 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
The only question I really have though is about including files. I noticed you don&#39;t include any windows header files.
</p></div></div><p>It&#39;s been forever since I&#39;ve looked at this... the original class is from my networking lib, viewable <a href="http://dyconnect.svn.sourceforge.net/viewvc/dyconnect/libdconn/dyconnect/">here.</a></p><p>My includes are in another class:</p><div class="source-code snippet"><div class="inner"><pre>   <span class="n">31</span>   #include <span class="k3">&lt;</span>ws2tcpip.h&gt;
   <span class="n">32</span>   #include <span class="k3">&lt;</span>winsock2.h&gt;
</pre></div></div><p>...Probably not what you want to use, since you aren&#39;t doing networking.</p><p>And of course this code in my Allegro programs that use the lib:
</p><div class="source-code snippet"><div class="inner"><pre><span class="p">#include "allegro.h"</span>
<span class="p">#ifdef DY_WINDOWS_VERSION</span>
  <span class="p">#include "winalleg.h"</span>
<span class="p">#endif</span>
</pre></div></div><p>

And it just seems to work. I&#39;ve never had any problems with it not blocking. (I use MinGW) However, it&#39;s been a long time since I wrote this code, and there might be something I&#39;ve forgotten...
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Myrdos)</author>
		<pubDate>Fri, 09 Feb 2007 22:40:41 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
edit: for those of you interested this is potential windows code. I believe though that by including windows.h you require a winmain function etc. This should be fixable by just including what&#39;s needed. This one hasn&#39;t been tested..
</p></div></div><p>

I think you only need WinMain if you are creating a Windows (Windows, menus, etc), and even then I&#39;m not sure. I know I have used windows.h and winsock.h with just plain main before.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (BAF)</author>
		<pubDate>Sat, 10 Feb 2007 06:54:41 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>This guy has an interesting timing tutorial with many methods. I think he shows how to do a timer that doesn&#39;t use 100% cpu. I only read it for timeGetTime() though.</p><p><a href="http://www.geisswerks.com/ryan/FAQS/timing.html">http://www.geisswerks.com/ryan/FAQS/timing.html</a>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (KnightWhoSaysNi)</author>
		<pubDate>Sat, 10 Feb 2007 13:34:18 +0000</pubDate>
	</item>
</rss>
