<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>my game uses 90% CPU</title>
		<link>http://www.allegro.cc/forums/view/565043</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Sat, 11 Feb 2006 20:40:28 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>my game uses 90% CPU how to prevent it?
</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">int</span> main<span class="k2">(</span><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> FInitializeGame<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="c">//game initialization</span></td></tr><tr><td class="number">4</td><td>&#160;</td></tr><tr><td class="number">5</td><td> TPanama_Joe <span class="k3">*</span> joe<span class="k2">;</span></td></tr><tr><td class="number">6</td><td> joe <span class="k3">=</span> <span class="k1">new</span> TPanama_Joe<span class="k2">(</span><span class="n">224</span>,<span class="n">248</span>,<span class="n">0</span>,typejoe<span class="k2">)</span><span class="k2">;</span>  </td></tr><tr><td class="number">7</td><td> TBoard gameboard<span class="k2">(</span>joe-&gt;get_board_id<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span> </td></tr><tr><td class="number">8</td><td> <span class="k1">bool</span> game_start<span class="k3">=</span><span class="k1">true</span><span class="k2">;</span></td></tr><tr><td class="number">9</td><td> <span class="k1">unsigned</span> <span class="k1">int</span> intro_counter<span class="k3">=</span><span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">10</td><td> </td></tr><tr><td class="number">11</td><td> gameboard.Load_intro<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">12</td><td> </td></tr><tr><td class="number">13</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">14</td><td>  <span class="k2">{</span>          </td></tr><tr><td class="number">15</td><td>       clear<span class="k2">(</span>buffer<span class="k2">)</span><span class="k2">;</span> </td></tr><tr><td class="number">16</td><td>       <span class="k1">while</span> <span class="k2">(</span>main_counter&gt;0<span class="k2">)</span><span class="k2">{</span></td></tr><tr><td class="number">17</td><td>           </td></tr><tr><td class="number">18</td><td>           <span class="k1">if</span><span class="k2">(</span>game_start<span class="k3">=</span><span class="k3">=</span><span class="k1">true</span><span class="k2">)</span><span class="k2">{</span></td></tr><tr><td class="number">19</td><td>           </td></tr><tr><td class="number">20</td><td>              gameboard.gamelevel<span class="k3">=</span><span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">21</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_1<span class="k2">]</span><span class="k2">)</span> gameboard.gamelevel<span class="k3">=</span><span class="n">1</span><span class="k2">;</span></td></tr><tr><td class="number">22</td><td>              <span class="k1">else</span></td></tr><tr><td class="number">23</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_2<span class="k2">]</span><span class="k2">)</span> gameboard.gamelevel<span class="k3">=</span><span class="n">2</span><span class="k2">;</span></td></tr><tr><td class="number">24</td><td>              <span class="k1">else</span></td></tr><tr><td class="number">25</td><td>              <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_3<span class="k2">]</span><span class="k2">)</span> gameboard.gamelevel<span class="k3">=</span><span class="n">3</span><span class="k2">;</span></td></tr><tr><td class="number">26</td><td>              <span class="k1">else</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/key" target="_blank"><span class="a">key</span></a><span class="k2">[</span>KEY_4<span class="k2">]</span><span class="k2">)</span> gameboard.gamelevel<span class="k3">=</span><span class="n">4</span><span class="k2">;</span></td></tr><tr><td class="number">28</td><td>                                                      </td></tr><tr><td class="number">29</td><td>              <span class="k1">if</span> <span class="k2">(</span>gameboard.gamelevel<span class="k3">!</span><span class="k3">=</span><span class="n">0</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">30</td><td>                 game_start<span class="k3">=</span><span class="k1">false</span><span class="k2">;</span></td></tr><tr><td class="number">31</td><td>                 joe-&gt;joeloadpos_disc<span class="k2">(</span>gameboard.gamelevel<span class="k2">)</span><span class="k2">;</span>  </td></tr><tr><td class="number">32</td><td>                 joe-&gt;joesavepos<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>                 </td></tr><tr><td class="number">33</td><td>                 gameboard.Load_<span class="k2">(</span>joe<span class="k2">)</span><span class="k2">;</span>  </td></tr><tr><td class="number">34</td><td>                                            </td></tr><tr><td class="number">35</td><td>              <span class="k2">}</span></td></tr><tr><td class="number">36</td><td>              </td></tr><tr><td class="number">37</td><td>              intro_counter<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span></td></tr><tr><td class="number">38</td><td>              <span class="k1">if</span><span class="k2">(</span>intro_counter&gt;60<span class="k2">)</span> intro_counter<span class="k3">=</span><span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">39</td><td>              </td></tr><tr><td class="number">40</td><td>           <span class="k2">}</span><span class="k1">else</span>                   </td></tr><tr><td class="number">41</td><td>           <span class="k1">if</span><span class="k2">(</span>joe-&gt;joemove<span class="k2">(</span>gameboard.CLlist<span class="k2">)</span><span class="k3">=</span><span class="k3">=</span><span class="k1">true</span><span class="k2">)</span><span class="k2">{</span></td></tr><tr><td class="number">42</td><td>              gameboard.Load_<span class="k2">(</span>joe<span class="k2">)</span><span class="k2">;</span>        </td></tr><tr><td class="number">43</td><td>              joe-&gt;joesavepos<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">44</td><td>           <span class="k2">}</span>   </td></tr><tr><td class="number">45</td><td>              </td></tr><tr><td class="number">46</td><td>           gameboard.CLlist.moveobject<span class="k2">(</span>typeskull<span class="k2">)</span><span class="k2">;</span>         </td></tr><tr><td class="number">47</td><td>           gameboard.CLlist.moveobject<span class="k2">(</span>typeskull_x2<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">48</td><td>           gameboard.CLlist.moveobject<span class="k2">(</span>typejumpinskull<span class="k2">)</span><span class="k2">;</span>  </td></tr><tr><td class="number">49</td><td>           gameboard.CLlist.moveobject<span class="k2">(</span>typejumpinskull_x2<span class="k2">)</span><span class="k2">;</span>                                   </td></tr><tr><td class="number">50</td><td>           gameboard.CLlist.moveobject<span class="k2">(</span>typespider<span class="k2">)</span><span class="k2">;</span>                      </td></tr><tr><td class="number">51</td><td>           gameboard.CLlist.moveobject<span class="k2">(</span>typespider_x2<span class="k2">)</span><span class="k2">;</span> </td></tr><tr><td class="number">52</td><td>           gameboard.CLlist.moveobject<span class="k2">(</span>typesnakeR<span class="k2">)</span><span class="k2">;</span> </td></tr><tr><td class="number">53</td><td>           gameboard.CLlist.moveobject<span class="k2">(</span>typesnakeL<span class="k2">)</span><span class="k2">;</span>                      </td></tr><tr><td class="number">54</td><td>  </td></tr><tr><td class="number">55</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_F5<span class="k2">]</span><span class="k2">)</span><span class="k2">{</span>       </td></tr><tr><td class="number">56</td><td>              FCreateBoard<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>        </td></tr><tr><td class="number">57</td><td>              <span class="k1">if</span><span class="k2">(</span><span class="k2">(</span>joe-&gt;itemsCTR.searchitem<span class="k2">(</span>typetorch<span class="k2">)</span><span class="k2">)</span><span class="k3">=</span><span class="k3">=</span><span class="k1">true</span><span class="k2">)</span></td></tr><tr><td class="number">58</td><td>                 gameboard.objects_visible<span class="k3">=</span><span class="k1">true</span><span class="k2">;</span>                  </td></tr><tr><td class="number">59</td><td>              gameboard.display_objects<span class="k2">(</span>gameboard.objects_visible<span class="k2">)</span><span class="k2">;</span>    </td></tr><tr><td class="number">60</td><td>              gameboard.change_board_color<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>                         </td></tr><tr><td class="number">61</td><td>           <span class="k2">}</span>    </td></tr><tr><td class="number">62</td><td>           </td></tr><tr><td class="number">63</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_F12<span class="k2">]</span> <span class="k3">|</span><span class="k3">|</span> joe-&gt;joegameover<span class="k3">=</span><span class="k3">=</span><span class="k1">true</span><span class="k2">)</span><span class="k2">{</span></td></tr><tr><td class="number">64</td><td>              </td></tr><tr><td class="number">65</td><td>              <span class="k1">delete</span> joe<span class="k2">;</span></td></tr><tr><td class="number">66</td><td>              joe <span class="k3">=</span> <span class="k1">new</span> TPanama_Joe<span class="k2">(</span><span class="n">224</span>,<span class="n">248</span>,<span class="n">0</span>,typejoe<span class="k2">)</span><span class="k2">;</span>      </td></tr><tr><td class="number">67</td><td>              game_start<span class="k3">=</span><span class="k1">true</span><span class="k2">;</span> </td></tr><tr><td class="number">68</td><td>              gameboard.Load_intro<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>              </td></tr><tr><td class="number">69</td><td>              </td></tr><tr><td class="number">70</td><td>           <span class="k2">}</span></td></tr><tr><td class="number">71</td><td>           </td></tr><tr><td class="number">72</td><td>           </td></tr><tr><td class="number">73</td><td>           TPanama_Joe::animupdate<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>           </td></tr><tr><td class="number">74</td><td>           TScroller::animupdate<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">75</td><td>           TFlames::animupdate<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">76</td><td>           TBridge::animupdate<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>                      </td></tr><tr><td class="number">77</td><td>           TSpider::animupdate<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>    </td></tr><tr><td class="number">78</td><td>           TLaser::animupdate<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>           </td></tr><tr><td class="number">79</td><td>           TTorch::animupdate<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>                                          </td></tr><tr><td class="number">80</td><td>           main_counter--<span class="k2">;</span>    </td></tr><tr><td class="number">81</td><td>               </td></tr><tr><td class="number">82</td><td>       <span class="k2">}</span>  </td></tr><tr><td class="number">83</td><td>&#160;</td></tr><tr><td class="number">84</td><td>&#160;</td></tr><tr><td class="number">85</td><td>       joe-&gt;itemsCTR.draw<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">86</td><td>       gameboard.draw<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">87</td><td>       joe-&gt;draw<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>           </td></tr><tr><td class="number">88</td><td>&#160;</td></tr><tr><td class="number">89</td><td>       <span class="k1">if</span><span class="k2">(</span>game_start<span class="k3">=</span><span class="k3">=</span><span class="k1">true</span><span class="k2">)</span><span class="k2">{</span></td></tr><tr><td class="number">90</td><td>     </td></tr><tr><td class="number">91</td><td>             <a href="http://www.allegro.cc/manual/draw_sprite" target="_blank"><span class="a">draw_sprite</span></a><span class="k2">(</span>buffer,<span class="k2">(</span><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a><span class="k3">*</span><span class="k2">)</span>data<span class="k2">[</span>logo<span class="k2">]</span>.dat,<span class="n">165</span>,<span class="n">85</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">92</td><td>             <a href="http://www.allegro.cc/manual/draw_sprite" target="_blank"><span class="a">draw_sprite</span></a><span class="k2">(</span>buffer,<span class="k2">(</span><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a><span class="k3">*</span><span class="k2">)</span>data<span class="k2">[</span>logobottom<span class="k2">]</span>.dat,<span class="n">0</span>,<span class="n">400</span><span class="k2">)</span><span class="k2">;</span>             </td></tr><tr><td class="number">93</td><td>             <span class="k1">if</span><span class="k2">(</span>intro_counter&gt;30<span class="k2">)</span><span class="k2">{</span></td></tr><tr><td class="number">94</td><td>                writetext<span class="k2">(</span><span class="s">"PRESS 1,2,3 or 4 TO"</span>,<span class="n">250</span>,<span class="n">240</span><span class="k2">)</span><span class="k2">;</span>    </td></tr><tr><td class="number">95</td><td>                writetext<span class="k2">(</span><span class="s">"START GAME"</span>,<span class="n">285</span>,<span class="n">255</span><span class="k2">)</span><span class="k2">;</span>                 </td></tr><tr><td class="number">96</td><td>             <span class="k2">}</span>       </td></tr><tr><td class="number">97</td><td>       </td></tr><tr><td class="number">98</td><td>       <span class="k2">}</span></td></tr><tr><td class="number">99</td><td>              </td></tr><tr><td class="number">100</td><td>               </td></tr><tr><td class="number">101</td><td>         </td></tr><tr><td class="number">102</td><td>       <a href="http://www.allegro.cc/manual/acquire_screen" target="_blank"><span class="a">acquire_screen</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">103</td><td>       <a href="http://www.allegro.cc/manual/blit" target="_blank"><span class="a">blit</span></a><span class="k2">(</span>buffer,<a href="http://www.allegro.cc/manual/screen" target="_blank"><span class="a">screen</span></a>,<span class="n">0</span>,<span class="n">0</span>,<span class="n">0</span>,<span class="n">0</span>,<span class="n">640</span>,<span class="n">480</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">104</td><td>       <a href="http://www.allegro.cc/manual/release_screen" target="_blank"><span class="a">release_screen</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">105</td><td> </td></tr><tr><td class="number">106</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">107</td><td>  </td></tr><tr><td class="number">108</td><td>  <span class="k1">delete</span> joe<span class="k2">;</span></td></tr><tr><td class="number">109</td><td>  FQuitGame<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>        <span class="c">//Quit game</span></td></tr><tr><td class="number">110</td><td>&#160;</td></tr><tr><td class="number">111</td><td><span class="k2">}</span></td></tr><tr><td class="number">112</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 (koless)</author>
		<pubDate>Wed, 08 Feb 2006 05:19:02 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>First of all, use the [CODE][/CODE] tags (only in non-caps)<br />Secondly, for your program to be able to take less than maximum CPU, it needs to use rest(1) or somesuch function.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Jonatan Hedborg)</author>
		<pubDate>Wed, 08 Feb 2006 05:42:14 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Long answer: <br />You game will naturally try to take as much CPU time as possible. This isn&#39;t exactly a problem, because the more CPU usage, the faster your game runs, and the more you can do in a second. However, if you do want to reduce it, use the aforementioned <a href="http://www.allegro.cc/manual/rest">rest</a>() function. Use <a href="http://www.allegro.cc/manual/rest">rest</a>(0) to yield all the extra time back to the operating system.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Chris Katko)</author>
		<pubDate>Wed, 08 Feb 2006 06:22:50 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Call it at the end of your game loop [after logic and drawing sequences.]
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">while</span><span class="k2">(</span><span class="k3">!</span>game_over<span class="k2">)</span> <span class="k2">{</span>
  game_logic.update<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
  game_logic.draw_buffer<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
  <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="k2">}</span>
</pre></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Ceagon Xylas)</author>
		<pubDate>Wed, 08 Feb 2006 06:34:14 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Something like...
</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">int</span> main<span class="k2">(</span><span class="k2">)</span></td></tr><tr><td class="number">2</td><td><span class="k2">{</span></td></tr><tr><td class="number">3</td><td>  Init<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">4</td><td>  </td></tr><tr><td class="number">5</td><td>  <span class="k1">while</span><span class="k2">(</span> <span class="k3">!</span>quit <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="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> <span class="k2">{</span></td></tr><tr><td class="number">8</td><td>      quit<span class="k3">=</span><span class="k1">true</span><span class="k2">;</span> <span class="k2">}</span></td></tr><tr><td class="number">9</td><td>  </td></tr><tr><td class="number">10</td><td>    <span class="k1">while</span><span class="k2">(</span>speed_counter<span class="k2">)</span></td></tr><tr><td class="number">11</td><td>    <span class="k2">{</span> <span class="c">// logic "step"</span></td></tr><tr><td class="number">12</td><td>      </td></tr><tr><td class="number">13</td><td>      </td></tr><tr><td class="number">14</td><td>      <span class="k3">-</span><span class="k3">-</span>speed_counter<span class="k2">;</span></td></tr><tr><td class="number">15</td><td>      yield_timeslice<span class="k2">(</span><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>    </td></tr><tr><td class="number">18</td><td>    <span class="c">// redraw</span></td></tr><tr><td class="number">19</td><td>    ScreenSystem-&gt;draw_flip<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">20</td><td>    fps<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span></td></tr><tr><td class="number">21</td><td>    yield_timeslice<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">22</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">23</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">24</td><td>  </td></tr><tr><td class="number">25</td><td>  <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">26</td><td><span class="k2">}</span></td></tr><tr><td class="number">27</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>

should work pretty well. Using the yield_timeslice() function will mean your program will yield it&#39;s processor usage if some other program needs it more, otherwise it will still use 100%. This means that your program might look like it&#39;s using 100% of the processor, but in reality most of it is going to waste unless it&#39;s actually needed. The rest(1) part will actually make the program appear to use less CPU.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Elverion)</author>
		<pubDate>Wed, 08 Feb 2006 06:37:39 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Using the yield_timeslice() function will mean your program will yield it&#39;s processor usage if some other program needs it more, otherwise it will still use 100%.
</p></div></div><p>Recently yield_timeslice was changed to rest(1), so it will cause 0% CPU usage.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (CGamesPlay)</author>
		<pubDate>Wed, 08 Feb 2006 06:59:07 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Hmm, didn&#39;t know that. When did this happen? Is this in the stable 4.2.0?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Elverion)</author>
		<pubDate>Wed, 08 Feb 2006 08:21:38 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Recently yield_timeslice was changed to rest(1), so it will cause 0% CPU usage.
</p></div></div><p>

rest(1) is not yielding, its sleeping.  When did someone decide to redefine the meanings of words.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (A J)</author>
		<pubDate>Wed, 08 Feb 2006 09:26:07 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>rest(0) does the same thing as yield_timeslice, which does <b>not</b> save the CPU (it&#39;ll come right back to your program when nothing else wants it). Using rest(1) is what you want, but you only want to call it when you&#39;re not falling behind.
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">while</span><span class="k2">(</span>playing<span class="k2">)</span>
<span class="k2">{</span>
   <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>
      <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="k1">while</span><span class="k2">(</span>counter <span class="k3">&gt;</span> <span class="n">0</span><span class="k2">)</span>
   <span class="k2">{</span>
      do_logic<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
      <span class="k3">-</span><span class="k3">-</span>counter<span class="k2">;</span>
   <span class="k2">}</span>

   draw<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Kitty Cat)</author>
		<pubDate>Wed, 08 Feb 2006 09:33:38 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I thought we had a big discussion and it was decided that: yes, yield_timeslice is by semantics rest(0), but everyone actually wants rest(1), so it was changed...
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (CGamesPlay)</author>
		<pubDate>Wed, 08 Feb 2006 11:45:16 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="source-code snippet"><div class="inner"><pre><span class="c">/* sys_directx_yield_timeslice:</span>
<span class="c"> *  Yields remaining timeslice portion to the system.</span>
<span class="c"> */</span>
<span class="k1">static</span> <span class="k1">void</span> sys_directx_yield_timeslice<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span>
<span class="k2">{</span>
   Sleep<span class="k2">(</span><span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>
I believe at one point during the WIPs, it was changed to Sleep(1). Yielding is <i>not</i> the same as resting for 1 msec and it&#39;s a good thing that it is still Sleep(0).</p><p>However, if you look back at news, you&#39;ll see &quot;Deprecated yield_timeslice in favour of rest(0).&quot; I don&#39;t remember why; maybe it had to do with differences in cross platform behaviour. But whatever, I think yield_timeslice makes a lot more sense then manually calling rest(0). If it was truly deprecated just because people wanted 0% CPU usage, that&#39;s stupid. Yield is yield. It&#39;s not rest.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Matthew Leverton)</author>
		<pubDate>Wed, 08 Feb 2006 12:00:42 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Recently yield_timeslice was changed to rest(1), so it will cause 0% CPU usage.
</p></div></div><p>

Did not!<br />yield_timeslice was declared deprecated, and it&#39;s implemented the same as rest(0), i.e. it won&#39;t reduce CPU usage, but just relinquish the processor.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Milan Mimica)</author>
		<pubDate>Wed, 08 Feb 2006 18:06:31 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I don`t know pretty much about writing games, so whould someone explain to me what would rest(0) do? It would rest 0 miliseconds so... I guess, that since is rests even for 0 time, then the program would give back the processor to other processes. So it`s like forcing the game to give the prcessor time to other applications without acutally  slowing down the game. Is that correct?</p><p>An in what context is &#39;yield&#39; used here? I get a bit confused, it seems that I don`t know all the meanings of this word.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Tomek Kozera)</author>
		<pubDate>Wed, 08 Feb 2006 19:28:21 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>On Unixes, rest(0) is implemented as <a href="http://www.2robots.com/static/man/index.php/sched_yield">sched_yield</a>. It will give back the processor to other processes, but it will also &quot;slow down&quot; your game because it will resume after more than 0 ms. It depends on the mood of other processes. However, yielding will be forced by OS every now and then. On linux 2.6.x it depends of kernel config CONFIG_HZ.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Milan Mimica)</author>
		<pubDate>Wed, 08 Feb 2006 19:42:12 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
This isn&#39;t exactly a problem, because the more CPU usage, the faster your game runs, and the more you can do in a second.
</p></div></div><p>
This <b>is</b> a problem. If you don&#39;t put the CPU to sleep when it could be sleeping then you require that the processor be run constantly at it&#39;s highest frequency. All laptops and many well designed desktops cut power to the CPU when it is sleeping a lot, e.g. by reducing the clock speed. Once the power is cut heat output decreases and often fans can be slowed down or switched off, reducing noise output. If your program uses 100% CPU just because it can then it will probably not stay on those machines for long.</p><p>Here is how I achieve non-100% CPU usage with Allegro (in this example, limiting to 70 fps):
</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="k1">volatile</span> <span class="k1">int</span> scupdate<span class="k3">=</span><span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">2</td><td><span class="k1">void</span> update280<span class="k2">(</span><span class="k2">)</span></td></tr><tr><td class="number">3</td><td><span class="k2">{</span></td></tr><tr><td class="number">4</td><td>        scupdate<span class="k3">+</span><span class="k3">+</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><a href="http://www.allegro.cc/manual/END_OF_FUNCTION" target="_blank"><span class="a">END_OF_FUNCTION</span></a><span class="k2">(</span>update280<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">7</td><td>&#160;</td></tr><tr><td class="number">8</td><td>...</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">/* at startup */</span></td></tr><tr><td class="number">11</td><td>        <a href="http://www.allegro.cc/manual/LOCK_FUNCTION" target="_blank"><span class="a">LOCK_FUNCTION</span></a><span class="k2">(</span>update280<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">12</td><td>        <a href="http://www.allegro.cc/manual/LOCK_VARIABLE" target="_blank"><span class="a">LOCK_VARIABLE</span></a><span class="k2">(</span>scupdate<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_int_ex" target="_blank"><span class="a">install_int_ex</span></a><span class="k2">(</span>update280,BPS_TO_TIMER<span class="k2">(</span><span class="n">280</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">14</td><td>&#160;</td></tr><tr><td class="number">15</td><td>&#160;</td></tr><tr><td class="number">16</td><td>        <span class="c">/* in game loop */</span></td></tr><tr><td class="number">17</td><td>        skipframe <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span></td></tr><tr><td class="number">18</td><td>        <span class="k1">if</span><span class="k2">(</span>scupdate <span class="k3">&lt;</span> <span class="n">4</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/rest" target="_blank"><span class="a">rest</span></a><span class="k2">(</span><span class="k2">(</span><span class="k2">(</span><span class="n">4</span><span class="k3">-</span>scupdate<span class="k2">)</span><span class="k3">*</span><span class="n">1000</span><span class="k2">)</span><span class="k3">/</span><span class="n">280</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">21</td><td>            scupdate <span class="k3">-</span><span class="k3">=</span> <span class="n">4</span><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>        <span class="k1">else</span> </td></tr><tr><td class="number">24</td><td>        <span class="k2">{</span></td></tr><tr><td class="number">25</td><td>            <span class="k1">if</span><span class="k2">(</span>scupdate <span class="k3">&gt;</span> <span class="n">4</span><span class="k2">)</span></td></tr><tr><td class="number">26</td><td>            <span class="k2">{</span></td></tr><tr><td class="number">27</td><td>                framecount<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span></td></tr><tr><td class="number">28</td><td>                <span class="k1">if</span><span class="k2">(</span>framecount<span class="k3">&amp;</span><span class="n">7</span><span class="k2">)</span> skipframe <span class="k3">=</span> <span class="k1">true</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">if</span><span class="k2">(</span>scupdate <span class="k3">&gt;</span> <span class="n">7</span><span class="k2">)</span> scupdate <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> <span class="k1">else</span> scupdate <span class="k3">-</span><span class="k3">=</span> <span class="n">4</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><span class="k2">}</span></td></tr></tbody></table></div></div><p>

EDIT: code fixed.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Harte)</author>
		<pubDate>Fri, 10 Feb 2006 01:33:20 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p><i>I don`t know pretty much about writing games, so whould someone explain to me what would rest(0) do? It would rest 0 miliseconds so... I guess, that since is rests even for 0 time, then the program would give back the processor to other processes. So it`s like forcing the game to give the prcessor time to other applications without acutally slowing down the game. Is that correct?

An in what context is &#39;yield&#39; used here? I get a bit confused, it seems that I don`t know all the meanings of this word.</i></p><p>Tomek - </p><p><tt>rest()</tt> in allegro, which is also <tt>sleep()</tt> on unices and <tt>Sleep()</tt> on Windows, tells the operating system to put the process to sleep for the specified number of milliseconds.</p><p>The concept of &quot;sleep&quot; is threading/operating system speak that means, in plain English, &quot;Hey, operating system - I&#39;m done for now.  Let other programs have the CPU, and don&#39;t bother me again for X milliseconds.&quot; </p><p>The concept of &quot;yield&quot; is threading/operating system speak that means, in plain English, &quot;Hey, operating system - I can stop what I&#39;m doing right now so you can let other programs do stuff they need to do.  BUT, if noone else has any work to do, then please let me know so I can keep going&quot;</p><p>That&#39;s what <tt>rest(0)</tt> or the windows <tt>Sleep(0)</tt> do.  They tell the o/s to give the CPU to others, but if noone else wants/needs it, let your process have it back.</p><p>That&#39;s why <tt>rest(0)</tt> won&#39;t accomplish what you&#39;re going for.  The CPU will still stay at 100% because your program is still working fulltime - it&#39;s just &quot;playing nice&quot; with everyone else.</p><p>If you actually <tt>rest(1)</tt>, you are telling the operating system to not even let you have the CPU until at least 1ms has passed.  Therefore, the CPU usage WILL actually drop.  With today&#39;s CPU speeds, 1 millisecond is an eternity.  If every millisecond you wake up, do a few hundred thousand instructions, then go back to sleep, you&#39;re barely using the CPU.</p><p>I hope that helps you understand the terminology better!</p><p>On a related note, as someone pointed out already, some desktops and many/most laptops the system crank up the fans when the CPU is at full usage for a long time.  Other power-management side-effects can also occur.  This is why going full throttle is bad form unless you actually have to.  I have a P4 3.0ghz in a laptop that is very quiet when at rest, but when something is using 100% cpu the thing SCREAMS.  I play hard core 3d games on my laptop and expect them to be using full resources all the time - I wear headphones.  But other games that are poorly designed don&#39;t last long on my computer.  I once ran across a KICK <span class="cuss"><span>ASS</span></span> solitaire suite that I loved, but it used 100% CPU.  I&#39;m sorry, there&#39;s no way you actually need 3 billion instruction cycles a second for me to play free cell.  <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Birdeeoh)</author>
		<pubDate>Fri, 10 Feb 2006 02:06:50 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>The best way would be using thread wake-up events, based on a timer. In short, you set up a timer to wake your main thread at regular intervals (with each timer click). After you are done drawing a frame and updating logic, make the main thread sleep until signalled again. It will use 0% cpu until the timer ticks again, but will continue if it already has.<br />Unfortunately, allegro doesn&#39;t have a mechanism to support this, so you&#39;ll have to use platform-specific api to do this.<br />In windows, one would have 2 threads, a main thread and a timer thread. The timer thread increments the counter and activates an event (thereby waking up the main thread if necessary). The main thread updates logic, draws, sleeps until timer event, and repeats.</p><p>If you don&#39;t want to multi-thread, use the rest() approach.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Tobias Dammers)</author>
		<pubDate>Fri, 10 Feb 2006 15:42:16 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>What&#39;s the difference between your approach and <a href="http://www.allegro.cc/manual/miscellaneous/frequently-asked-questions-(faq)/general-problems/bd35ed0706dad8b5c3aa3b3a91cdba2c">this</a>?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Milan Mimica)</author>
		<pubDate>Fri, 10 Feb 2006 16:01:11 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Because that doesn&#39;t rest at all <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" />. But seriously..
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">while</span><span class="k2">(</span>timer <span class="k3">&lt;</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</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>
</pre></div></div><p>
causes the thread to rest anywhere between 1ms and 10ms per call, which isn&#39;t very accurate, and it cuases the program to rest-check-rest-check-etc (which takes some, if negligible, CPU time) until its ready, instead of just staying down and letting the OS wake the thread up on time.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Kitty Cat)</author>
		<pubDate>Fri, 10 Feb 2006 16:08:38 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>How do you implement this timer thread?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Milan Mimica)</author>
		<pubDate>Fri, 10 Feb 2006 16:28:24 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>1. Write a thread function for the timer thread, which sleeps for the desired amount of time, then sets an event.<br />2. Spawn a thread from your main thread.<br />3. Use a waiting function in the main thread to suspend until the timer event is signalled.</p><p>For more details:<br /><a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/createevent.asp">http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/createevent.asp</a><br /><a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/setevent.asp">http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/setevent.asp</a><br /><a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/waitforsingleobject.asp">http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/waitforsingleobject.asp</a><br /><a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/createthread.asp">http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/createthread.asp</a><br />These should get you started.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Tobias Dammers)</author>
		<pubDate>Fri, 10 Feb 2006 16:43:50 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Hello, Windows-only only land. Nice to see you.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Kitty Cat)</author>
		<pubDate>Fri, 10 Feb 2006 16:46:39 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Yay, hello there. Haven&#39;t done any multithread programming on other platform, so I guess someone else should do the appropriate googling.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Tobias Dammers)</author>
		<pubDate>Fri, 10 Feb 2006 16:49:10 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Pthread is cross platfrom.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (GullRaDriel)</author>
		<pubDate>Fri, 10 Feb 2006 17:00:59 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>But it is also a pain in the <span class="cuss"><span>ass</span></span> to build and use on non-*n?x platforms, or at least so I&#39;ve heard.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (gnolam)</author>
		<pubDate>Fri, 10 Feb 2006 20:43:55 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I never have problems building themon solaris, linux (debian) , windows xp ( pthread pack from source.redhat.org )
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (GullRaDriel)</author>
		<pubDate>Fri, 10 Feb 2006 21:14:51 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;ve been using Boost::threads for months now.  I THINK they use pthreads on Unix but native on Windows (correct me if I&#39;m wrong, too lazy to go check)</p><p>but, regardless, it works great and easy, on either platform.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Birdeeoh)</author>
		<pubDate>Fri, 10 Feb 2006 22:09:07 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
1. Write a thread function for the timer thread, which sleeps for the desired amount of time, then sets an event.
</p></div></div><p>

Something like this?</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">while</span> <span class="k2">(</span><span class="k1">true</span><span class="k2">)</span> <span class="k2">{</span>
    Sleep<span class="k2">(</span><span class="n">20</span><span class="k2">)</span><span class="k2">;</span> <span class="c">//0.02 sec, 50 fps</span>
    SetEvent<span class="k2">(</span>handle<span class="k2">)</span><span class="k2">;</span>
<span class="k2">}</span><span class="k2">;</span>
</pre></div></div><p>

Is this more accurate than using allegro timer?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Milan Mimica)</author>
		<pubDate>Sat, 11 Feb 2006 00:30:15 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p><i>Is this more accurate than using allegro timer?</i></p><p>POSSIBLY/probably, but no guarantees.  The allegro timers go for a 5ms resolution.  Your snippet theoretically goes for 2ms resolution but, in reality, the documentation for all Sleep() style functions will say something like -</p><p>Sleep( int ms ) - Puts the process to sleep for AT LEAST ms milliseconds</p><p>Under a light load, you&#39;re likely to get pretty good results but there&#39;s no guarantee you will wake up right at 2ms everytime.  Also, I wasn&#39;t following the ENTIRE event queue discussion, but asynchronous event delivery is also not usually guaranteed to work instantly.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Birdeeoh)</author>
		<pubDate>Sat, 11 Feb 2006 01:06:06 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Is this more accurate than using allegro timer?
</p></div></div><p>
No. In fact, that could lead to time drifting. It takes a variable amount of time to call those functions and do whatever they&#39;re gonna do. You&#39;d have to find a way to make the OS put the thread to sleep and wake it up at specific intervals.</p><p>What you can try to do, is calculate the amount of time you need to sleep until the next tic should fire (using QPC/gettimeofday to track the current time vs. the next target time), sleep for that amount (via Sleep/usleep), wake up and do whatever, then repeat. This is basically what Allegro does for timers (though some jitter is introduced since <i>all</i> the timer functions run in the same thread/loop).
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">int</span> ms_to_sleep_for <span class="k3">=</span> one_second <span class="k3">/</span> tics_per_second<span class="k2">;</span>
<span class="k1">unsigned</span> <span class="k1">int</span> current_time <span class="k3">=</span> get_time<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="k1">while</span><span class="k2">(</span>running<span class="k2">)</span>
<span class="k2">{</span>
   <span class="k1">signed</span> <span class="k1">int</span> diff <span class="k3">=</span> current_time <span class="k3">-</span> get_time<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
   <span class="k1">if</span><span class="k2">(</span>diff <span class="k3">&gt;</span> <span class="n">0</span><span class="k2">)</span>
      Sleep<span class="k2">(</span>diff<span class="k2">)</span><span class="k2">;</span>

   do_something<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>

   current_time <span class="k3">+</span><span class="k3">=</span> ms_to_sleep_for<span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Kitty Cat)</author>
		<pubDate>Sat, 11 Feb 2006 08:04:43 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>pthreads works fine on windows... I use it myself.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (BAF)</author>
		<pubDate>Sat, 11 Feb 2006 08:09:53 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
What you can try to do, is calculate the amount of time you need to sleep until the next tic should fire (using QPC/gettimeofday to track the current time vs. the next target time)
</p></div></div><p>
Of course this is exactly the same solution as the code I gave (guess I found the thread sooner!), it just doesn&#39;t devolve time counting to an Allegro timer. So I guess follow on questions are whether your use of Sleep rather than rest is a non-platform neutral oversight and  whether anybody has a useful table of which high precision time functions are available on which OSs?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Harte)</author>
		<pubDate>Sat, 11 Feb 2006 08:09:59 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
So I guess follow on questions are whether your use of Sleep rather than rest is a non-platform neutral oversight and whether anybody has a useful table of which high precision time functions are available on which OSs?
</p></div></div><p>
Oversight, yes. I was going for psuedo-code and would&#39;ve used sleep(), but that a real libc function.</p><p>As for high precision time functions, sane OSs have gettimeofday, Windows has QueryPerformanceFrequency/QueryPerformanceCounter.  If neither of those exist/work, the system isn&#39;t worth worrying about.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Kitty Cat)</author>
		<pubDate>Sat, 11 Feb 2006 08:17:39 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I think it would be nice to have threads in Allegro. If I haven&#39;t misunderstood the universe, you need threads to fully enjoy the powers of dual core processors. And they are the future. <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Manfred D)</author>
		<pubDate>Sat, 11 Feb 2006 19:34:22 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;ve picked up a timing method that I like very much, using Allegro timers:</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;semaphore.h&gt;</span></td></tr><tr><td class="number">2</td><td>&#160;</td></tr><tr><td class="number">3</td><td>sem_t ticks<span class="k2">;</span></td></tr><tr><td class="number">4</td><td><span class="k1">void</span> inc_timer<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>  sem_post<span class="k2">(</span><span class="k3">&amp;</span>ticks<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>&#160;</td></tr><tr><td class="number">9</td><td>main<span class="k2">(</span><span class="k2">)</span></td></tr><tr><td class="number">10</td><td><span class="k2">{</span></td></tr><tr><td class="number">11</td><td>  sem_init<span class="k2">(</span><span class="k3">&amp;</span>ticks, <span class="n">0</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">12</td><td>  </td></tr><tr><td class="number">13</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>inc_timer, BPS_TO_TIMER<span class="k2">(</span><span class="n">30</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">14</td><td>&#160;</td></tr><tr><td class="number">15</td><td>  <span class="k1">while</span><span class="k2">(</span><span class="n">1</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>    <span class="k1">if</span><span class="k2">(</span>redraw<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="c">// Drawing</span></td></tr><tr><td class="number">20</td><td>      <a href="http://www.allegro.cc/manual/blit" target="_blank"><span class="a">blit</span></a><span class="k2">(</span>buffer, <a href="http://www.allegro.cc/manual/screen" target="_blank"><span class="a">screen</span></a>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span>, <a href="http://www.allegro.cc/manual/SCREEN_W" target="_blank"><span class="a">SCREEN_W</span></a>, <a href="http://www.allegro.cc/manual/SCREEN_H" target="_blank"><span class="a">SCREEN_H</span></a><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">21</td><td>      redraw <span class="k3">=</span> <span class="k1">false</span><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>    sem_wait<span class="k2">(</span><span class="k3">&amp;</span>ticks<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>    <span class="c">// Logic</span></td></tr><tr><td class="number">27</td><td>    redraw <span class="k3">=</span> <span class="k1">true</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>&#160;</td></tr><tr><td class="number">30</td><td>  <a href="http://www.allegro.cc/manual/remove_int" target="_blank"><span class="a">remove_int</span></a><span class="k2">(</span>inc_timer<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">31</td><td>  sem_destroy<span class="k2">(</span><span class="k3">&amp;</span>ticks<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">32</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>

The sem_wait causes the application to sleep for at least the right amount of time, but if it misses several ticks it simply won&#39;t sleep.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (CGamesPlay)</author>
		<pubDate>Sat, 11 Feb 2006 20:40:28 +0000</pubDate>
	</item>
</rss>
