<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>cpu fps etc...</title>
		<link>http://www.allegro.cc/forums/view/594692</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Tue, 15 Jan 2008 01:28:28 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>hi again.<br />ok, this is surely once again THE CLASSICAL QUESTIOn about CPU weight and allegro and blablablabla.</p><p>I begin without the app: <br /><span class="remote-thumbnail"><span class="json">{"name":"state0.jpg","src":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/5\/0\/5076464c4a2ed765dbb2a2fdd59a9e3a.jpg","w":511,"h":500,"tn":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/5\/0\/5076464c4a2ed765dbb2a2fdd59a9e3a"}</span><img src="http://www.allegro.cc//djungxnpq2nug.cloudfront.net/image/cache/5/0/5076464c4a2ed765dbb2a2fdd59a9e3a-240.jpg" alt="state0.jpg" width="240" height="234" /></span></p><p>The old version, without any rest(1) nor timer function:<br /><span class="remote-thumbnail"><span class="json">{"name":"schwz3_state.jpg","src":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/8\/3\/83af845627c7ee305ada2bea96a85b09.jpg","w":992,"h":468,"tn":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/8\/3\/83af845627c7ee305ada2bea96a85b09"}</span><img src="http://www.allegro.cc//djungxnpq2nug.cloudfront.net/image/cache/8/3/83af845627c7ee305ada2bea96a85b09-240.jpg" alt="schwz3_state.jpg" width="240" height="113" /></span></p><p>I have put in my main loop a rest of 1 sec, and putted in volatile funct activated by the timer all my printing to screen.<br />Notice here that I have only a poor bmp of 32k and less for mouse cursor...</p><p>Modification to the program with a rest and timer function, FPS 100:<br /><span class="remote-thumbnail"><span class="json">{"name":"fps100.jpg","src":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/4\/5\/45dac6f09ba88ffcdcb54dd614e4603a.jpg","w":962,"h":435,"tn":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/4\/5\/45dac6f09ba88ffcdcb54dd614e4603a"}</span><img src="http://www.allegro.cc//djungxnpq2nug.cloudfront.net/image/cache/4/5/45dac6f09ba88ffcdcb54dd614e4603a-240.jpg" alt="fps100.jpg" width="240" height="108" /></span></p><p>FPS 50:<br /><span class="remote-thumbnail"><span class="json">{"name":"fps50.jpg","src":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/a\/d\/ad05f6a1c21056bbebca180a3c788b4b.jpg","w":955,"h":447,"tn":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/a\/d\/ad05f6a1c21056bbebca180a3c788b4b"}</span><img src="http://www.allegro.cc//djungxnpq2nug.cloudfront.net/image/cache/a/d/ad05f6a1c21056bbebca180a3c788b4b-240.jpg" alt="fps50.jpg" width="240" height="112" /></span></p><p>Here is part of the code, I do not arrive to do less to not charge the CPU. Any idea ?</p><p><img src="http://www.allegro.cc/forums/smileys/embarassed.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>&#160;</td></tr><tr><td class="number">3</td><td><span class="k1">volatile</span> <span class="k1">long</span> screen_unit<span class="k3">=</span><span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">4</td><td><span class="k1">void</span> screen_printing<span class="k2">(</span><span class="k1">void</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>screen_unit<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span></td></tr><tr><td class="number">7</td><td>   </td></tr><tr><td class="number">8</td><td><span class="c">//... mes functions d affichage</span></td></tr><tr><td class="number">9</td><td>     <a href="http://www.allegro.cc/manual/rectfill" target="_blank"><span class="a">rectfill</span></a><span class="k2">(</span>buffer,<span class="n">0</span>,<span class="n">0</span>,<span class="n">440</span>,<span class="n">400</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">255</span>,<span class="n">255</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">10</td><td>     <a href="http://www.allegro.cc/manual/textprintf_ex" target="_blank"><span class="a">textprintf_ex</span></a><span class="k2">(</span>buffer,<a href="http://www.allegro.cc/manual/font" target="_blank"><span class="a">font</span></a>, <span class="n">105</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">255</span>,<span class="n">0</span>,<span class="n">0</span><span class="k2">)</span>,<span class="k3">-</span><span class="n">1</span>,AppliName<span class="k2">)</span><span class="k2">;</span><span class="c">//affichage nom appi</span></td></tr><tr><td class="number">11</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,fond1,<span class="k2">(</span><span class="k1">int</span><span class="k2">)</span><span class="k3">-</span><span class="n">5</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>     <span class="k1">if</span> <span class="k2">(</span>index_view_graph<span class="k3">=</span><span class="k3">=</span><span class="n">1</span><span class="k2">)</span></td></tr><tr><td class="number">14</td><td>     <span class="k2">{</span>    <a href="http://www.allegro.cc/manual/rectfill" target="_blank"><span class="a">rectfill</span></a><span class="k2">(</span>buffer, <span class="n">320</span>,<span class="n">350</span>,<span class="n">330</span>,<span class="n">360</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">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">15</td><td>          view_midi_visual<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="k1">if</span> <span class="k2">(</span>index_view_midiapps<span class="k3">=</span><span class="k3">=</span><span class="n">1</span><span class="k2">)</span> </td></tr><tr><td class="number">19</td><td>     <span class="k2">{</span> <a href="http://www.allegro.cc/manual/rectfill" target="_blank"><span class="a">rectfill</span></a><span class="k2">(</span>buffer, <span class="n">150</span>,<span class="n">350</span>,<span class="n">160</span>,<span class="n">360</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">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">20</td><td>       listOfAppl<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">21</td><td>     <span class="k2">}</span></td></tr><tr><td class="number">22</td><td>     </td></tr><tr><td class="number">23</td><td>      </td></tr><tr><td class="number">24</td><td>      <span class="k1">if</span> <span class="k2">(</span> index_write_deb<span class="k3">=</span><span class="k3">=</span><span class="n">1</span><span class="k2">)</span><span class="k2">{</span></td></tr><tr><td class="number">25</td><td>      <a href="http://www.allegro.cc/manual/rectfill" target="_blank"><span class="a">rectfill</span></a><span class="k2">(</span>buffer, <span class="n">415</span>, <span class="n">370</span>,<span class="n">425</span>, <span class="n">380</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">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">26</td><td>      <span class="k2">}</span></td></tr><tr><td class="number">27</td><td>      </td></tr><tr><td class="number">28</td><td>      </td></tr><tr><td class="number">29</td><td>     show_connected_to_midishare<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/textprintf_ex" target="_blank"><span class="a">textprintf_ex</span></a><span class="k2">(</span>buffer,<a href="http://www.allegro.cc/manual/font" target="_blank"><span class="a">font</span></a>, <span class="n">10</span>,<span class="n">200</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">0</span>,<span class="n">0</span><span class="k2">)</span>,<span class="k3">-</span><span class="n">1</span>,<span class="s">"Midi INPUT: "</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/textprintf_ex" target="_blank"><span class="a">textprintf_ex</span></a><span class="k2">(</span>buffer,<a href="http://www.allegro.cc/manual/font" target="_blank"><span class="a">font</span></a>, <span class="n">10</span>,<span class="n">210</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">0</span>,<span class="n">0</span><span class="k2">)</span>,<span class="k3">-</span><span class="n">1</span>,<span class="s">"%s"</span>, my_midi_string<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>     show_udp<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>      </td></tr><tr><td class="number">34</td><td>     choices<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">35</td><td>     <a href="http://www.allegro.cc/manual/textprintf_ex" target="_blank"><span class="a">textprintf_ex</span></a><span class="k2">(</span>buffer,<a href="http://www.allegro.cc/manual/font" target="_blank"><span class="a">font</span></a>, <span class="n">10</span>,<span class="n">180</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">0</span>,<span class="n">0</span><span class="k2">)</span>,<span class="k3">-</span><span class="n">1</span>,<span class="s">"FPS: %d "</span>,  FPS_defini<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">36</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,mouse,<span class="k2">(</span><span class="k1">int</span><span class="k2">)</span><a href="http://www.allegro.cc/manual/mouse_x" target="_blank"><span class="a">mouse_x</span></a>,<a href="http://www.allegro.cc/manual/mouse_y" target="_blank"><span class="a">mouse_y</span></a><span class="k2">)</span><span class="k2">;</span> </td></tr><tr><td class="number">37</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">442</span>,<span class="n">442</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">38</td><td>&#160;</td></tr><tr><td class="number">39</td><td><span class="k2">}</span></td></tr><tr><td class="number">40</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>screen_printing<span class="k2">)</span></td></tr><tr><td class="number">41</td><td>&#160;</td></tr><tr><td class="number">42</td><td>&#160;</td></tr><tr><td class="number">43</td><td>&#160;</td></tr><tr><td class="number">44</td><td><span class="c">////////////////////////////////////////////////////////////////////////////////</span></td></tr><tr><td class="number">45</td><td><span class="k1">int</span> main<span class="k2">(</span><span class="k2">)</span></td></tr><tr><td class="number">46</td><td><span class="k2">{</span></td></tr><tr><td class="number">47</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">48</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">49</td><td>    <a href="http://www.allegro.cc/manual/install_mouse" target="_blank"><span class="a">install_mouse</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>  </td></tr><tr><td class="number">50</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">51</td><td>    <a href="http://www.allegro.cc/manual/LOCK_FUNCTION" target="_blank"><span class="a">LOCK_FUNCTION</span></a><span class="k2">(</span>screen_printing<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">52</td><td>    <a href="http://www.allegro.cc/manual/LOCK_VARIABLE" target="_blank"><span class="a">LOCK_VARIABLE</span></a><span class="k2">(</span>screen_unit<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">53</td><td>  </td></tr><tr><td class="number">54</td><td>    <a href="http://www.allegro.cc/manual/set_color_depth" target="_blank"><span class="a">set_color_depth</span></a><span class="k2">(</span><span class="n">16</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">55</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">442</span>,<span class="n">442</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">56</td><td>     <span class="k1">if</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/set_gfx_mode" target="_blank"><span class="a">set_gfx_mode</span></a><span class="k2">(</span>GFX_AUTODETECT_WINDOWED,<span class="n">440</span>,<span class="n">400</span>,<span class="n">0</span>,<span class="n">0</span><span class="k2">)</span><span class="k3">!</span><span class="k3">=</span><span class="n">0</span><span class="k2">)</span></td></tr><tr><td class="number">57</td><td>   <span class="k2">{</span></td></tr><tr><td class="number">58</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_TEXT,<span class="n">0</span>,<span class="n">0</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">59</td><td>     <a href="http://www.allegro.cc/manual/allegro_message" target="_blank"><span class="a">allegro_message</span></a><span class="k2">(</span><span class="s">"%s\nSchwartz_Peter's Video Mode:\n 1024x768 and Higher\n16 or 32 bits better look\n\n"</span>, <a href="http://www.allegro.cc/manual/allegro_error" target="_blank"><span class="a">allegro_error</span></a><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">60</td><td>     quit_funct<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span><span class="k1">return</span> <span class="n">1</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>      fond1<span class="k3">=</span><a href="http://www.allegro.cc/manual/load_bitmap" target="_blank"><span class="a">load_bitmap</span></a><span class="k2">(</span><span class="s">"chaton2.tga"</span>,NULL<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">63</td><td>      mouse<span class="k3">=</span><a href="http://www.allegro.cc/manual/load_bitmap" target="_blank"><span class="a">load_bitmap</span></a><span class="k2">(</span><span class="s">"curseur1.bmp"</span>,NULL<span class="k2">)</span><span class="k2">;</span>  </td></tr><tr><td class="number">64</td><td>&#160;</td></tr><tr><td class="number">65</td><td>     buffer<span class="k3">=</span><a href="http://www.allegro.cc/manual/create_bitmap" target="_blank"><span class="a">create_bitmap</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/SCREEN_W" target="_blank"><span class="a">SCREEN_W</span></a>,<a href="http://www.allegro.cc/manual/SCREEN_H" target="_blank"><span class="a">SCREEN_H</span></a><span class="k2">)</span><span class="k2">;</span>     </td></tr><tr><td class="number">66</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">442</span>,<span class="n">442</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">67</td><td>&#160;</td></tr><tr><td class="number">68</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="k2">)</span></td></tr><tr><td class="number">69</td><td>  <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="k2">;</span><span class="k2">}</span></td></tr><tr><td class="number">70</td><td>  </td></tr><tr><td class="number">71</td><td>  </td></tr><tr><td class="number">72</td><td>  load_ip_conf<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">73</td><td>  SetUpMidi<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> </td></tr><tr><td class="number">74</td><td>&#160;</td></tr><tr><td class="number">75</td><td>    initialisation_client<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">76</td><td>&#160;</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>index_quit<span class="k3">=</span><span class="k3">=</span><span class="n">0</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>     <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">81</td><td>&#160;</td></tr><tr><td class="number">82</td><td>&#160;</td></tr><tr><td class="number">83</td><td>   </td></tr><tr><td class="number">84</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>screen_printing,BPS_TO_TIMER<span class="k2">(</span>FPS_defini<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">85</td><td>&#160;</td></tr><tr><td class="number">86</td><td>&#160;</td></tr><tr><td class="number">87</td><td>&#160;</td></tr><tr><td class="number">88</td><td>     <span class="k2">}</span></td></tr><tr><td class="number">89</td><td>&#160;</td></tr><tr><td class="number">90</td><td>     </td></tr><tr><td class="number">91</td><td>quit_funct<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">92</td><td>&#160;</td></tr><tr><td class="number">93</td><td>&#160;</td></tr><tr><td class="number">94</td><td>     </td></tr><tr><td class="number">95</td><td><span class="k1">return</span> <span class="n">0</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><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 (karistouf)</author>
		<pubDate>Tue, 08 Jan 2008 20:37:48 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>umpf !!!</p><p>Chris, n&#39;appelle install_int_ex qu&#39;une seule fois ! et en dehors de la boucle while !</p><p>Apres quoi tu pourras boucler sur ton rest(1); tranquillement !
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (GullRaDriel)</author>
		<pubDate>Tue, 08 Jan 2008 20:42:23 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>First of all you shouldn&#39;t be doing so much work in a timer function. Setting a flag or incrementing a counter and responding to it in the game loop is the preferred (and feasible) approach. I&#39;m not sure why you repeatedly call <tt>install_int_ex</tt>, but that seems shifty as well...
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (bamccaig)</author>
		<pubDate>Tue, 08 Jan 2008 20:46:12 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;m surprised that doesn&#39;t outright <i>crash</i>, what with Allegro&#39;s notorious thread unsafety and all.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (gnolam)</author>
		<pubDate>Tue, 08 Jan 2008 20:46:55 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>You can attempt to rest() for more than 1ms at once.<br />Try 5, 10, 15, 20.</p><p>edit<br />As for the drawing part, chances are the biggest job for the CPU is the
</p><div class="source-code snippet"><div class="inner"><pre><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">442</span>,<span class="n">442</span><span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>
Considering that less than 10% of the screen surface may have changed, you could just blit these parts individually, like a &quot;dirty rectangles&quot; system.</p><p>(Additionally, you can memorize if these screen parts HAVE changed at all. For example, the top text: No need to redraw the paragraph if it has the same content as when it was last redrawn.)
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Audric)</author>
		<pubDate>Tue, 08 Jan 2008 21:59:14 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Is it Tuesday again?</p><p>Voyez: <a href="http://wiki.allegro.cc/Timers#Yielding_the_CPU">http://wiki.allegro.cc/Timers#Yielding_the_CPU</a>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Goalie Ca)</author>
		<pubDate>Wed, 09 Jan 2008 01:08:40 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Are there any advantages of using semaphores over normal high-res timers?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Vanneto)</author>
		<pubDate>Wed, 09 Jan 2008 01:30:53 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>ooooups, i didn t know it was an error, I have an hudge programm wich is running with install_ex inside of the main loop since 4 years of dev... without any error i mean errors of timers (and its real time manipulation)...</p><p>but its still doing nothing o my troubles of CPU...<br />with:
</p><div class="source-code snippet"><div class="inner"><pre>
     <span class="k1">while</span> <span class="k2">(</span>index_quit<span class="k3">=</span><span class="k3">=</span><span class="n">0</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">1</span><span class="k2">)</span><span class="k2">;</span>
<span class="c">//nothing... but refreshment is done in the volatile as previous and first code</span>

     <span class="k2">}</span>
</pre></div></div><p>


CPU weight is still from 41 % and up to 70%</p><p><span class="remote-thumbnail"><span class="json">{"name":"outofloop.jpg","src":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/0\/3\/032ede2c76a20c40b9e54221cb2392ea.jpg","w":983,"h":510,"tn":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/0\/3\/032ede2c76a20c40b9e54221cb2392ea"}</span><img src="http://www.allegro.cc//djungxnpq2nug.cloudfront.net/image/cache/0/3/032ede2c76a20c40b9e54221cb2392ea-240.jpg" alt="outofloop.jpg" width="240" height="124" /></span></p><p>so? I mean install_ex is there tomake use of timer in an easy manner, to avoid calculations of tclock ?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (karistouf)</author>
		<pubDate>Wed, 09 Jan 2008 02:29:06 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>install_int* granularity can vary from 1 msec to 14-20 msec
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (GullRaDriel)</author>
		<pubDate>Wed, 09 Jan 2008 03:30:20 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Are there any advantages of using semaphores over normal high-res timers?
</p></div></div><p>

Yay. Someone asked the RIGHT question. </p><p>Why did i use a locking semaphore? Because allegro timers spawn <b>their own</b> thread, wake it up, run user code (increment value), and then go back to sleep. </p><p>I used a semaphore because i wanted to put the <b>mail loop</b> to sleep and have the <b>timer wake it up</b> like it should happen. You only want your main loop to execute when the timer beeps! Allegro timer simplifies this possibility away but certain operating systems (not all) libraries can handle this without a problem.</p><p>Rest is basically a way to stop constant spin locking by taking shifts. It will tell the operating system to put the thread to sleep... but <b>only for a really short time</b>. It then checks again.. whenever the operating system feels like it. It may check almost right away (bad because more cpu wasted) but the general rule of thumb is that rest is only accurate to within 15ms. </p><p>To summarize: rest still wastes tons of cpu. It constantly wakes up and goes back to sleep. </p><p>With my locking mechanism i can get my own (graphically simple) allegrogl games to use &lt; 1% cpu.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Goalie Ca)</author>
		<pubDate>Wed, 09 Jan 2008 05:23:50 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>That&#39;s really cool Goalie Ca, but how portable is it...? <img src="http://www.allegro.cc/forums/smileys/undecided.gif" alt=":-/" /> Will your example work on Windows and Linux? <img src="http://www.allegro.cc/forums/smileys/undecided.gif" alt=":-/" /> Do you need to install third party libraries or anything?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (bamccaig)</author>
		<pubDate>Wed, 09 Jan 2008 07:03:52 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>If your OS is posix then you have it. All linux, mac, and older winnt. For new windows you need to download pthread. <a href="http://sourceware.org/pthreads-win32/">http://sourceware.org/pthreads-win32/</a><br />If you really wanted to you could use windows locking mechanism. It is in winapi and does the same thing.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Goalie Ca)</author>
		<pubDate>Wed, 09 Jan 2008 09:31:14 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I guess I will attempt to learn to use semaphores then. <img src="http://www.allegro.cc/forums/smileys/cheesy.gif" alt=":D" /> Until then, here is my revised raw timer template...
</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"> * Name:          fps.h</span></td></tr><tr><td class="number">3</td><td><span class="c"> * Author:        bamccaig-&gt;members.allegro.cc</span></td></tr><tr><td class="number">4</td><td><span class="c"> * Purpose:       Example of using Allegro timer routines to limit frames-per-second</span></td></tr><tr><td class="number">5</td><td><span class="c"> *                    in a game.</span></td></tr><tr><td class="number">6</td><td><span class="c"> * Disclaimer:    Use at own risk. :P</span></td></tr><tr><td class="number">7</td><td><span class="c"> */</span></td></tr><tr><td class="number">8</td><td><span class="p">#include &lt;allegro.h&gt;</span></td></tr><tr><td class="number">9</td><td><span class="p">#include &lt;stdio.h&gt;</span></td></tr><tr><td class="number">10</td><td><span class="p">#include &lt;stdlib.h&gt;</span></td></tr><tr><td class="number">11</td><td>&#160;</td></tr><tr><td class="number">12</td><td><span class="p">#define bool short int</span></td></tr><tr><td class="number">13</td><td><span class="p">#define false 0</span></td></tr><tr><td class="number">14</td><td><span class="p">#define true -1</span></td></tr><tr><td class="number">15</td><td>&#160;</td></tr><tr><td class="number">16</td><td><span class="p">#define SECS_PER_MIN 60</span></td></tr><tr><td class="number">17</td><td><span class="p">#define MINS_PER_HOUR 60</span></td></tr><tr><td class="number">18</td><td><span class="p">#define HOURS_PER_DAY 24</span></td></tr><tr><td class="number">19</td><td><span class="p">#define TARGET_FPS 30</span></td></tr><tr><td class="number">20</td><td><span class="p">#define WHITE makecol(255, 255, 255)</span></td></tr><tr><td class="number">21</td><td>&#160;</td></tr><tr><td class="number">22</td><td><span class="k1">volatile</span> <span class="k1">bool</span>                  gblnCloseButtonPressed <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>    <span class="c">// Flag for window close (X) button status.</span></td></tr><tr><td class="number">23</td><td><span class="k1">volatile</span> <span class="k1">unsigned</span> <span class="k1">short</span> <span class="k1">int</span>    gushrFramesPerSecond <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>          <span class="c">// Count of frames last second (Set).</span></td></tr><tr><td class="number">24</td><td><span class="k1">volatile</span> <span class="k1">unsigned</span> <span class="k1">short</span> <span class="k1">int</span>    gushrFramesThisSecond <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>         <span class="c">// Count of frames this second (Increment).</span></td></tr><tr><td class="number">25</td><td><span class="k1">volatile</span> <span class="k1">unsigned</span> <span class="k1">int</span>          guintPendingFrames <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>            <span class="c">// Number of frames OK'd to be processed.</span></td></tr><tr><td class="number">26</td><td><span class="k1">volatile</span> <span class="k1">unsigned</span> <span class="k1">int</span>          guintTotalFrames <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>              <span class="c">// Total number of frames.</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">unsigned</span> <span class="k1">short</span> <span class="k1">int</span>    gushrSeconds <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">29</td><td><span class="k1">unsigned</span> <span class="k1">short</span> <span class="k1">int</span>             gushrMinutes <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">30</td><td><span class="k1">unsigned</span> <span class="k1">short</span> <span class="k1">int</span>             gushrHours <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">31</td><td><span class="k1">unsigned</span> <span class="k1">short</span> <span class="k1">int</span>             gushrDays <span class="k3">=</span> <span class="n">0</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">void</span>    add_frame<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span><span class="k2">;</span>                    <span class="c">// Timer routine.</span></td></tr><tr><td class="number">34</td><td><span class="k1">void</span>    close_button_handler<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span><span class="k2">;</span>         <span class="c">// Window X button handler on supported platforms.</span></td></tr><tr><td class="number">35</td><td><span class="k1">void</span>    draw<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><span class="k2">;</span>                      <span class="c">// Draws the scene.</span></td></tr><tr><td class="number">36</td><td><span class="k1">int</span>     initialize<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span><span class="k2">;</span>                   <span class="c">// Initializes the application.</span></td></tr><tr><td class="number">37</td><td><span class="k1">void</span>    logic<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span><span class="k2">;</span>                        <span class="c">// Processes gameplay.</span></td></tr><tr><td class="number">38</td><td><span class="k1">void</span>    tick<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span><span class="k2">;</span>                         <span class="c">// Timer routine.</span></td></tr><tr><td class="number">39</td><td><span class="k1">void</span>    update_time<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span><span class="k2">;</span>                  <span class="c">// Updates clock variables.</span></td></tr></tbody></table></div></div><p>
</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"> * Name:          fps.c</span></td></tr><tr><td class="number">3</td><td><span class="c"> * Author:        bamccaig-&gt;members.allegro.cc</span></td></tr><tr><td class="number">4</td><td><span class="c"> * Purpose:       Example of using Allegro timer routines to limit frames-per-second</span></td></tr><tr><td class="number">5</td><td><span class="c"> *                    in a game.</span></td></tr><tr><td class="number">6</td><td><span class="c"> * Disclaimer:    Use at own risk. :P</span></td></tr><tr><td class="number">7</td><td><span class="c"> */</span></td></tr><tr><td class="number">8</td><td><span class="p">#include "fps.h"</span></td></tr><tr><td class="number">9</td><td>&#160;</td></tr><tr><td class="number">10</td><td><span class="k1">int</span> main<span class="k2">(</span><span class="k1">int</span> argc, <span class="k1">char</span><span class="k3">*</span> argv<span class="k2">[</span><span class="k2">]</span><span class="k2">)</span></td></tr><tr><td class="number">11</td><td><span class="k2">{</span></td></tr><tr><td class="number">12</td><td>    <a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a><span class="k3">*</span> bmpBuffer <span class="k3">=</span> NULL<span class="k2">;</span></td></tr><tr><td class="number">13</td><td>&#160;</td></tr><tr><td class="number">14</td><td>    <span class="c">// Try to initialize game.</span></td></tr><tr><td class="number">15</td><td>    <span class="k1">if</span><span class="k2">(</span>initialize<span class="k2">(</span><span class="k2">)</span> <span class="k3">!</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span></td></tr><tr><td class="number">16</td><td>        <a href="http://www.delorie.com/djgpp/doc/libc/libc_298.html" target="_blank">exit</a><span class="k2">(</span><span class="k3">-</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">17</td><td>&#160;</td></tr><tr><td class="number">18</td><td>    <span class="c">// Create and clear screen buffer.</span></td></tr><tr><td class="number">19</td><td>    bmpBuffer <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">800</span>, <span class="n">600</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">20</td><td>    clear<span class="k2">(</span>bmpBuffer<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">// Main game loop.</span></td></tr><tr><td class="number">23</td><td>    <span class="k1">while</span><span class="k2">(</span><span class="k3">!</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="k3">|</span><span class="k3">|</span> gblnCloseButtonPressed<span class="k2">)</span><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>        <span class="c">// Rest loop. Nothing to do until next frame so we "go to sleep" temporarily.</span></td></tr><tr><td class="number">26</td><td>        <span class="k1">while</span><span class="k2">(</span><span class="k3">!</span>guintPendingFrames<span class="k2">)</span></td></tr><tr><td class="number">27</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">16</span><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>        <span class="c">// Logic loop. Changes to the game happen here.</span></td></tr><tr><td class="number">30</td><td>        <span class="k1">while</span><span class="k2">(</span>guintPendingFrames<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>            logic<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">33</td><td>            guintPendingFrames--<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>&#160;</td></tr><tr><td class="number">36</td><td>        <span class="c">/*</span></td></tr><tr><td class="number">37</td><td><span class="c">         * Draw. Here we draw the current frame first to a buffer in main memory and</span></td></tr><tr><td class="number">38</td><td><span class="c">         * then to the video memory (screen).</span></td></tr><tr><td class="number">39</td><td><span class="c">         */</span></td></tr><tr><td class="number">40</td><td>        draw<span class="k2">(</span>bmpBuffer<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">41</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">42</td><td>&#160;</td></tr><tr><td class="number">43</td><td>    <span class="c">// Release buffer.</span></td></tr><tr><td class="number">44</td><td>    <a href="http://www.allegro.cc/manual/destroy_bitmap" target="_blank"><span class="a">destroy_bitmap</span></a><span class="k2">(</span>bmpBuffer<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">45</td><td>&#160;</td></tr><tr><td class="number">46</td><td>    <span class="k1">return</span><span class="k2">(</span><span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">47</td><td><span class="k2">}</span></td></tr><tr><td class="number">48</td><td><a href="http://www.allegro.cc/manual/END_OF_MAIN" target="_blank"><span class="a">END_OF_MAIN</span></a><span class="k2">(</span><span class="k2">)</span></td></tr><tr><td class="number">49</td><td>&#160;</td></tr><tr><td class="number">50</td><td>&#160;</td></tr><tr><td class="number">51</td><td>&#160;</td></tr><tr><td class="number">52</td><td><span class="k1">void</span> add_frame<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span></td></tr><tr><td class="number">53</td><td><span class="c">/*</span></td></tr><tr><td class="number">54</td><td><span class="c"> * This is a timer routine that signals the main game loop to execute the logic (and redraw).</span></td></tr><tr><td class="number">55</td><td><span class="c"> * Every time it executes it increments a counter. When the counter is non-zero the main game</span></td></tr><tr><td class="number">56</td><td><span class="c"> * loop will execute the logic and then decrement the counter. Logic only happens once</span></td></tr><tr><td class="number">57</td><td><span class="c"> * for every execution of this timer routine. Drawing happens at most once, but perhaps less</span></td></tr><tr><td class="number">58</td><td><span class="c"> * if the program starts to get behind and needs to catch up again by repeating logic.</span></td></tr><tr><td class="number">59</td><td><span class="c"> */</span></td></tr><tr><td class="number">60</td><td><span class="k2">{</span></td></tr><tr><td class="number">61</td><td>    guintPendingFrames<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span></td></tr><tr><td class="number">62</td><td><span class="k2">}</span></td></tr><tr><td class="number">63</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>add_frame<span class="k2">)</span></td></tr><tr><td class="number">64</td><td>&#160;</td></tr><tr><td class="number">65</td><td>&#160;</td></tr><tr><td class="number">66</td><td>&#160;</td></tr><tr><td class="number">67</td><td><span class="k1">void</span> close_button_handler<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span></td></tr><tr><td class="number">68</td><td><span class="c">/*</span></td></tr><tr><td class="number">69</td><td><span class="c"> * Handles the X button of the window on supported platforms. Signals the main game loop</span></td></tr><tr><td class="number">70</td><td><span class="c"> * to exit.</span></td></tr><tr><td class="number">71</td><td><span class="c"> */</span></td></tr><tr><td class="number">72</td><td><span class="k2">{</span></td></tr><tr><td class="number">73</td><td>    gblnCloseButtonPressed <span class="k3">=</span> <span class="k1">true</span><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><a href="http://www.allegro.cc/manual/END_OF_FUNCTION" target="_blank"><span class="a">END_OF_FUNCTION</span></a><span class="k2">(</span>close_button_callback<span class="k2">)</span></td></tr><tr><td class="number">76</td><td>&#160;</td></tr><tr><td class="number">77</td><td>&#160;</td></tr><tr><td class="number">78</td><td>&#160;</td></tr><tr><td class="number">79</td><td><span class="k1">void</span> draw<span class="k2">(</span><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a><span class="k3">*</span> bmpBuffer<span class="k2">)</span></td></tr><tr><td class="number">80</td><td><span class="c">/*</span></td></tr><tr><td class="number">81</td><td><span class="c"> * Draws the current frame to a BITMAP buffer in main memory and then to the video memory (screen).</span></td></tr><tr><td class="number">82</td><td><span class="c"> * In this example we're only drawing the total frame count and the frames-per-second count.</span></td></tr><tr><td class="number">83</td><td><span class="c"> */</span></td></tr><tr><td class="number">84</td><td><span class="k2">{</span></td></tr><tr><td class="number">85</td><td>    <span class="c">// Draw to buffer.</span></td></tr><tr><td class="number">86</td><td>    <a href="http://www.allegro.cc/manual/textprintf_ex" target="_blank"><span class="a">textprintf_ex</span></a><span class="k2">(</span>bmpBuffer, <a href="http://www.allegro.cc/manual/font" target="_blank"><span class="a">font</span></a>, <span class="n">20</span>, <span class="n">20</span>, WHITE, <span class="k3">-</span><span class="n">1</span>, <span class="s">"frame-count: %d"</span>, guintTotalFrames<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">87</td><td>    <a href="http://www.allegro.cc/manual/textprintf_ex" target="_blank"><span class="a">textprintf_ex</span></a><span class="k2">(</span>bmpBuffer, <a href="http://www.allegro.cc/manual/font" target="_blank"><span class="a">font</span></a>, <span class="n">20</span>, <span class="n">40</span>, WHITE, <span class="k3">-</span><span class="n">1</span>, <span class="s">"time: %03d:%02d:%02d:%02d"</span>, gushrDays, gushrHours, gushrMinutes, gushrSeconds<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">88</td><td>    <a href="http://www.allegro.cc/manual/textprintf_ex" target="_blank"><span class="a">textprintf_ex</span></a><span class="k2">(</span>bmpBuffer, <a href="http://www.allegro.cc/manual/font" target="_blank"><span class="a">font</span></a>, <span class="n">20</span>, <span class="n">60</span>, WHITE, <span class="k3">-</span><span class="n">1</span>, <span class="s">"fps: %d"</span>, gushrFramesPerSecond<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">89</td><td>&#160;</td></tr><tr><td class="number">90</td><td>    <span class="c">// Draw to screen.</span></td></tr><tr><td class="number">91</td><td>    <a href="http://www.allegro.cc/manual/blit" target="_blank"><span class="a">blit</span></a><span class="k2">(</span>bmpBuffer, <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">800</span>, <span class="n">600</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">92</td><td>    clear<span class="k2">(</span>bmpBuffer<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">93</td><td><span class="k2">}</span></td></tr><tr><td class="number">94</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>draw<span class="k2">)</span></td></tr><tr><td class="number">95</td><td>&#160;</td></tr><tr><td class="number">96</td><td>&#160;</td></tr><tr><td class="number">97</td><td>&#160;</td></tr><tr><td class="number">98</td><td><span class="k1">int</span> initialize<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span></td></tr><tr><td class="number">99</td><td><span class="c">// Initializes the program.</span></td></tr><tr><td class="number">100</td><td><span class="k2">{</span></td></tr><tr><td class="number">101</td><td>    <span class="k1">char</span><span class="k3">*</span> chrGLaDOS_msg <span class="k3">=</span> <span class="s">"If at first you don't succeed,...you fail"</span><span class="k2">;</span></td></tr><tr><td class="number">102</td><td>&#160;</td></tr><tr><td class="number">103</td><td>    <span class="c">// Try to initialize allegro.</span></td></tr><tr><td class="number">104</td><td>    <span class="k1">if</span><span class="k2">(</span><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="k3">!</span><span class="k3">=</span> <span class="n">0</span><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>        <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"%s [to initialize Allegro].\n"</span>, chrGLaDOS_msg<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">107</td><td>        <span class="k1">return</span><span class="k2">(</span><span class="k3">-</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">108</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">109</td><td>&#160;</td></tr><tr><td class="number">110</td><td>    <span class="c">// Try to install keyboard.</span></td></tr><tr><td class="number">111</td><td>    <span class="k1">if</span><span class="k2">(</span><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="k3">!</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span></td></tr><tr><td class="number">112</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">113</td><td>        <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"%s [to install the keyboard routines].\n"</span>, chrGLaDOS_msg<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">114</td><td>        <span class="k1">return</span><span class="k2">(</span><span class="k3">-</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">115</td><td>    <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="c">// Try to install timer.</span></td></tr><tr><td class="number">118</td><td>    <span class="k1">if</span><span class="k2">(</span><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="k3">!</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span></td></tr><tr><td class="number">119</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">120</td><td>        <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"%s [to install the timer routines]."</span>, chrGLaDOS_msg<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">121</td><td>        <span class="k1">return</span><span class="k2">(</span><span class="k3">-</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">122</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">123</td><td>&#160;</td></tr><tr><td class="number">124</td><td>    <span class="c">// Set color depth.</span></td></tr><tr><td class="number">125</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">32</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">126</td><td>&#160;</td></tr><tr><td class="number">127</td><td>    <span class="c">// Try to set graphic mode.</span></td></tr><tr><td class="number">128</td><td>    <span class="k1">if</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/set_gfx_mode" target="_blank"><span class="a">set_gfx_mode</span></a><span class="k2">(</span>GFX_AUTODETECT_WINDOWED, <span class="n">800</span>, <span class="n">600</span>, <span class="n">0</span>, <span class="n">0</span><span class="k2">)</span> <span class="k3">!</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span></td></tr><tr><td class="number">129</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">130</td><td>        <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"%s [to set the graphics mode]. %s.\n"</span>, chrGLaDOS_msg, <a href="http://www.allegro.cc/manual/allegro_error" target="_blank"><span class="a">allegro_error</span></a><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">131</td><td>        <span class="k1">return</span><span class="k2">(</span><span class="k3">-</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">132</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">133</td><td>&#160;</td></tr><tr><td class="number">134</td><td>    <span class="c">/*</span></td></tr><tr><td class="number">135</td><td><span class="c">     * Set display switch mode so the game will continue processing even if the</span></td></tr><tr><td class="number">136</td><td><span class="c">     * user switches to another window.</span></td></tr><tr><td class="number">137</td><td><span class="c">     */</span></td></tr><tr><td class="number">138</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">139</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">140</td><td>        <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"%s [to set display switch mode].\n"</span>, chrGLaDOS_msg, <a href="http://www.allegro.cc/manual/allegro_error" target="_blank"><span class="a">allegro_error</span></a><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">141</td><td>        <span class="k1">return</span><span class="k2">(</span><span class="k3">-</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">142</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">143</td><td>&#160;</td></tr><tr><td class="number">144</td><td>    <span class="c">// Lock timer variables.</span></td></tr><tr><td class="number">145</td><td>    <a href="http://www.allegro.cc/manual/LOCK_VARIABLE" target="_blank"><span class="a">LOCK_VARIABLE</span></a><span class="k2">(</span>gblnCloseButtonPressed<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">146</td><td>    <a href="http://www.allegro.cc/manual/LOCK_VARIABLE" target="_blank"><span class="a">LOCK_VARIABLE</span></a><span class="k2">(</span>guintPendingFrames<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">147</td><td>    <a href="http://www.allegro.cc/manual/LOCK_VARIABLE" target="_blank"><span class="a">LOCK_VARIABLE</span></a><span class="k2">(</span>gushrFramesPerSecond<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">148</td><td>    <a href="http://www.allegro.cc/manual/LOCK_VARIABLE" target="_blank"><span class="a">LOCK_VARIABLE</span></a><span class="k2">(</span>gushrFramesThisSecond<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">149</td><td>    <a href="http://www.allegro.cc/manual/LOCK_VARIABLE" target="_blank"><span class="a">LOCK_VARIABLE</span></a><span class="k2">(</span>gushrSeconds<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">150</td><td>    <a href="http://www.allegro.cc/manual/LOCK_VARIABLE" target="_blank"><span class="a">LOCK_VARIABLE</span></a><span class="k2">(</span>gushrMinutes<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">151</td><td>    <a href="http://www.allegro.cc/manual/LOCK_VARIABLE" target="_blank"><span class="a">LOCK_VARIABLE</span></a><span class="k2">(</span>gushrHours<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">152</td><td>    <a href="http://www.allegro.cc/manual/LOCK_VARIABLE" target="_blank"><span class="a">LOCK_VARIABLE</span></a><span class="k2">(</span>gushrDays<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>    <span class="c">// Lock timer routines.</span></td></tr><tr><td class="number">155</td><td>    <a href="http://www.allegro.cc/manual/LOCK_FUNCTION" target="_blank"><span class="a">LOCK_FUNCTION</span></a><span class="k2">(</span>add_frame<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">156</td><td>    <a href="http://www.allegro.cc/manual/LOCK_FUNCTION" target="_blank"><span class="a">LOCK_FUNCTION</span></a><span class="k2">(</span>close_button_handler<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">157</td><td>    <a href="http://www.allegro.cc/manual/LOCK_FUNCTION" target="_blank"><span class="a">LOCK_FUNCTION</span></a><span class="k2">(</span>tick<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">// Install timer callbacks.</span></td></tr><tr><td class="number">160</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>add_frame, BPS_TO_TIMER<span class="k2">(</span>TARGET_FPS<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">161</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>tick, BPS_TO_TIMER<span class="k2">(</span><span class="n">1</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">162</td><td>&#160;</td></tr><tr><td class="number">163</td><td>    <span class="c">// Install close-button callback.</span></td></tr><tr><td class="number">164</td><td>    <a href="http://www.allegro.cc/manual/set_close_button_callback" target="_blank"><span class="a">set_close_button_callback</span></a><span class="k2">(</span>close_button_handler<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">165</td><td>&#160;</td></tr><tr><td class="number">166</td><td>    <span class="k1">return</span><span class="k2">(</span><span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">167</td><td><span class="k2">}</span></td></tr><tr><td class="number">168</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>initialize<span class="k2">)</span></td></tr><tr><td class="number">169</td><td>&#160;</td></tr><tr><td class="number">170</td><td>&#160;</td></tr><tr><td class="number">171</td><td>&#160;</td></tr><tr><td class="number">172</td><td><span class="k1">void</span> logic<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span></td></tr><tr><td class="number">173</td><td><span class="c">/*</span></td></tr><tr><td class="number">174</td><td><span class="c"> * Logic. In this example we're only incrementing a total frame counter, a</span></td></tr><tr><td class="number">175</td><td><span class="c"> * frames-per-second counter, and updating time variables.</span></td></tr><tr><td class="number">176</td><td><span class="c"> */</span></td></tr><tr><td class="number">177</td><td><span class="k2">{</span></td></tr><tr><td class="number">178</td><td>    update_time<span class="k2">(</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>    guintTotalFrames<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span></td></tr><tr><td class="number">181</td><td>    gushrFramesThisSecond<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span></td></tr><tr><td class="number">182</td><td><span class="k2">}</span></td></tr><tr><td class="number">183</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>logic<span class="k2">)</span></td></tr><tr><td class="number">184</td><td>&#160;</td></tr><tr><td class="number">185</td><td>&#160;</td></tr><tr><td class="number">186</td><td>&#160;</td></tr><tr><td class="number">187</td><td><span class="k1">void</span> tick<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span></td></tr><tr><td class="number">188</td><td><span class="c">/*</span></td></tr><tr><td class="number">189</td><td><span class="c"> * This is another timer routine that executes [approximately] once per second.</span></td></tr><tr><td class="number">190</td><td><span class="c"> * It's role is to set the frames-per-second count and reset the</span></td></tr><tr><td class="number">191</td><td><span class="c"> * frames-this-second counter.</span></td></tr><tr><td class="number">192</td><td><span class="c"> */</span></td></tr><tr><td class="number">193</td><td><span class="k2">{</span></td></tr><tr><td class="number">194</td><td>    <span class="c">// Update game time.</span></td></tr><tr><td class="number">195</td><td>    gushrSeconds<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span></td></tr><tr><td class="number">196</td><td>&#160;</td></tr><tr><td class="number">197</td><td>    <span class="c">// Update frames per second.</span></td></tr><tr><td class="number">198</td><td>    gushrFramesPerSecond <span class="k3">=</span> gushrFramesThisSecond<span class="k2">;</span></td></tr><tr><td class="number">199</td><td>    gushrFramesThisSecond <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">200</td><td><span class="k2">}</span></td></tr><tr><td class="number">201</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>tick<span class="k2">)</span></td></tr><tr><td class="number">202</td><td>&#160;</td></tr><tr><td class="number">203</td><td>&#160;</td></tr><tr><td class="number">204</td><td>&#160;</td></tr><tr><td class="number">205</td><td><span class="k1">void</span> update_time<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span></td></tr><tr><td class="number">206</td><td><span class="c">// Updates time variables.</span></td></tr><tr><td class="number">207</td><td><span class="k2">{</span></td></tr><tr><td class="number">208</td><td>    <span class="k1">if</span><span class="k2">(</span>gushrSeconds <span class="k3">=</span><span class="k3">=</span> SECS_PER_MIN<span class="k2">)</span></td></tr><tr><td class="number">209</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">210</td><td>        gushrMinutes<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span></td></tr><tr><td class="number">211</td><td>        gushrSeconds <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">212</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">213</td><td>&#160;</td></tr><tr><td class="number">214</td><td>    <span class="k1">if</span><span class="k2">(</span>gushrMinutes <span class="k3">=</span><span class="k3">=</span> MINS_PER_HOUR<span class="k2">)</span></td></tr><tr><td class="number">215</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">216</td><td>        gushrHours<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span></td></tr><tr><td class="number">217</td><td>        gushrMinutes <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">218</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">219</td><td>&#160;</td></tr><tr><td class="number">220</td><td>    <span class="k1">if</span><span class="k2">(</span>gushrHours <span class="k3">=</span><span class="k3">=</span> HOURS_PER_DAY<span class="k2">)</span></td></tr><tr><td class="number">221</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">222</td><td>        gushrDays<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span></td></tr><tr><td class="number">223</td><td>        gushrHours <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">224</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">225</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>
To compile it the following commands should work (you must have Allegro installed).
</p><pre>Windows/MinGW: gcc -O2 fps.c -o fps.exe -lalleg</pre><p>
</p><pre>*nix/GCC: gcc -O2 fps.c -o fps $(allegro-config --libs)</pre><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (bamccaig)</author>
		<pubDate>Thu, 10 Jan 2008 21:26:30 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
I guess I will attempt to learn to use semaphores then.
</p></div></div><p>

Simple. A semaphore is like a locking counter. I&#39;ve pasted the code i wrote to the wiki and have added a few useful comments. Basically main goes to sleep, ticker wakes it up. No wasted cycles, no extra context switches, no spinlocks. </p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="p">#include &lt;allegro.h&gt;</span></td></tr><tr><td class="number">2</td><td><span class="p">#include &lt;semaphore.h&gt;</span></td></tr><tr><td class="number">3</td><td>sem_t ticks<span class="k2">;</span> <span class="c">//our new "counter" variable. </span></td></tr><tr><td class="number">4</td><td>&#160;</td></tr><tr><td class="number">5</td><td>&#160;</td></tr><tr><td class="number">6</td><td><span class="k1">void</span> ticker<span class="k2">(</span><span class="k2">)</span><span class="k2">{</span></td></tr><tr><td class="number">7</td><td>        sem_post<span class="k2">(</span><span class="k3">&amp;</span>ticks<span class="k2">)</span><span class="k2">;</span> <span class="c">//increases count. wakes up first waiting thread (sem_wait) if count &gt; 0</span></td></tr><tr><td class="number">8</td><td><span class="k2">}</span><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></td></tr><tr><td class="number">9</td><td>&#160;</td></tr><tr><td class="number">10</td><td><span class="k1">void</span> main<span class="k2">(</span><span class="k2">)</span><span class="k2">{</span></td></tr><tr><td class="number">11</td><td>        setup_stuff<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">12</td><td>&#160;</td></tr><tr><td class="number">13</td><td>        sem_init<span class="k2">(</span><span class="k3">&amp;</span>ticks, <span class="n">0</span>, <span class="n">1</span><span class="k2">)</span><span class="k2">;</span> <span class="c">//sets a good default value to count. (count = 1)</span></td></tr><tr><td class="number">14</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">15</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><span class="n">60</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">16</td><td>&#160;</td></tr><tr><td class="number">17</td><td>        <span class="k1">while</span><span class="k2">(</span>game_on<span class="k2">)</span><span class="k2">{</span></td></tr><tr><td class="number">18</td><td>                sem_wait<span class="k2">(</span><span class="k3">&amp;</span>ticks<span class="k2">)</span><span class="k2">;</span> <span class="c">//decreases count, goes to sleep if count &lt; 0, wakes back up when count &gt;= 0 (through sem_post)</span></td></tr><tr><td class="number">19</td><td>                update_stuff<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">20</td><td>                draw_stuff<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">21</td><td>        <span class="k2">}</span></td></tr><tr><td class="number">22</td><td><span class="k2">}</span><a href="http://www.allegro.cc/manual/END_OF_MAIN" target="_blank"><span class="a">END_OF_MAIN</span></a><span class="k2">(</span><span class="k2">)</span></td></tr></tbody></table></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Goalie Ca)</author>
		<pubDate>Fri, 11 Jan 2008 05:46:12 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>OK <b>finally</b> I founded why it was taking so many weight in memory:<br />im using 
</p><div class="source-code snippet"><div class="inner"><pre>   <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="k2">)</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="k2">;</span><span class="k2">}</span>
</pre></div></div><p>
to enable the visual refreshing of information if I m not on its window.<br />... oups !
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (karistouf)</author>
		<pubDate>Fri, 11 Jan 2008 23:07:03 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">while</span><span class="k2">(</span>game_on<span class="k2">)</span><span class="k2">{</span>
    sem_wait<span class="k2">(</span><span class="k3">&amp;</span>ticks<span class="k2">)</span><span class="k2">;</span> <span class="c">//decreases count, goes to sleep if count &lt; 0, wakes back up when count &gt;= 0 (through sem_post)</span>
    update_stuff<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
    draw_stuff<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>
</p></div></div><p>
If you want to do frameskipping, this should work:
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">while</span><span class="k2">(</span>game_on<span class="k2">)</span><span class="k2">{</span>
    sem_wait<span class="k2">(</span><span class="k3">&amp;</span>ticks<span class="k2">)</span><span class="k2">;</span>
    <span class="k1">do</span> <span class="k2">{</span>
        update_stuff<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
    <span class="k2">}</span> <span class="k1">while</span><span class="k2">(</span>sem_trywait<span class="k2">(</span><span class="k3">&amp;</span>ticks<span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
    draw_stuff<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>Fri, 11 Jan 2008 23:25:36 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>MAOUW its nice, but it need to run , while its not on nor selected.<br />So in fact putting in an install_ex routines enable not to freeze the tasks, just the screen refreshment is not done ( wich take a HUDGE place in mem)
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (karistouf)</author>
		<pubDate>Fri, 11 Jan 2008 23:40:11 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
I&#39;m surprised that doesn&#39;t outright crash, what with Allegro&#39;s notorious thread unsafety and all.
</p></div></div><p>A lot of the crashieness was &quot;fixed&quot; in the last release or two. But it means theres a ton of locking and unlocking going on, slowing things down and potentially using lots of cpu. That doesn&#39;t mean you <u>should</u> use the same allegro resources from multiple thread (in fact you probably shouldn&#39;t), unless you&#39;re absolutely sure you know what you&#39;re doing.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Fri, 11 Jan 2008 23:46:26 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><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"> * Name:          fps2.h</span></td></tr><tr><td class="number">3</td><td><span class="c"> * Author:        bamccaig-&gt;members.allegro.cc</span></td></tr><tr><td class="number">4</td><td><span class="c"> * Purpose:       Example of using Allegro timer routines and semaphores to limit frames-per-second</span></td></tr><tr><td class="number">5</td><td><span class="c"> *                    in a game and reduce wasted cycles.</span></td></tr><tr><td class="number">6</td><td><span class="c"> * Disclaimer:    Use at own risk. :P</span></td></tr><tr><td class="number">7</td><td><span class="c"> */</span></td></tr><tr><td class="number">8</td><td><span class="p">#include &lt;allegro.h&gt;</span></td></tr><tr><td class="number">9</td><td><span class="p">#include &lt;semaphore.h&gt;</span></td></tr><tr><td class="number">10</td><td><span class="p">#include &lt;stdio.h&gt;</span></td></tr><tr><td class="number">11</td><td><span class="p">#include &lt;stdlib.h&gt;</span></td></tr><tr><td class="number">12</td><td>&#160;</td></tr><tr><td class="number">13</td><td><span class="p">#define bool short int</span></td></tr><tr><td class="number">14</td><td><span class="p">#define false 0</span></td></tr><tr><td class="number">15</td><td><span class="p">#define true -1</span></td></tr><tr><td class="number">16</td><td>&#160;</td></tr><tr><td class="number">17</td><td><span class="p">#define SECS_PER_MIN 60</span></td></tr><tr><td class="number">18</td><td><span class="p">#define MINS_PER_HOUR 60</span></td></tr><tr><td class="number">19</td><td><span class="p">#define HOURS_PER_DAY 24</span></td></tr><tr><td class="number">20</td><td><span class="p">#define TARGET_FPS 30</span></td></tr><tr><td class="number">21</td><td><span class="p">#define WHITE makecol(255, 255, 255)</span></td></tr><tr><td class="number">22</td><td>&#160;</td></tr><tr><td class="number">23</td><td>sem_t                          gSemaphore<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="k1">volatile</span> <span class="k1">bool</span>                  gblnCloseButtonPressed <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>    <span class="c">// Flag for window close (X) button status.</span></td></tr><tr><td class="number">26</td><td><span class="k1">volatile</span> <span class="k1">unsigned</span> <span class="k1">short</span> <span class="k1">int</span>    gushrFramesPerSecond <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>          <span class="c">// Count of frames last second (Set).</span></td></tr><tr><td class="number">27</td><td><span class="k1">volatile</span> <span class="k1">unsigned</span> <span class="k1">short</span> <span class="k1">int</span>    gushrFramesThisSecond <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>         <span class="c">// Count of frames this second (Increment).</span></td></tr><tr><td class="number">28</td><td><span class="k1">volatile</span> <span class="k1">unsigned</span> <span class="k1">int</span>          guintTotalFrames <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>              <span class="c">// Total number of frames.</span></td></tr><tr><td class="number">29</td><td>&#160;</td></tr><tr><td class="number">30</td><td><span class="k1">volatile</span> <span class="k1">unsigned</span> <span class="k1">short</span> <span class="k1">int</span>    gushrSeconds <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">31</td><td><span class="k1">unsigned</span> <span class="k1">short</span> <span class="k1">int</span>             gushrMinutes <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">32</td><td><span class="k1">unsigned</span> <span class="k1">short</span> <span class="k1">int</span>             gushrHours <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">33</td><td><span class="k1">unsigned</span> <span class="k1">short</span> <span class="k1">int</span>             gushrDays <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">34</td><td>&#160;</td></tr><tr><td class="number">35</td><td><span class="k1">void</span>    add_frame<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span><span class="k2">;</span>                    <span class="c">// Timer routine.</span></td></tr><tr><td class="number">36</td><td><span class="k1">void</span>    close_button_handler<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span><span class="k2">;</span>         <span class="c">// Window X button handler on supported platforms.</span></td></tr><tr><td class="number">37</td><td><span class="k1">void</span>    draw<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><span class="k2">;</span>                      <span class="c">// Draws the scene.</span></td></tr><tr><td class="number">38</td><td><span class="k1">int</span>     initialize<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span><span class="k2">;</span>                   <span class="c">// Initializes the application.</span></td></tr><tr><td class="number">39</td><td><span class="k1">void</span>    logic<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span><span class="k2">;</span>                        <span class="c">// Processes gameplay.</span></td></tr><tr><td class="number">40</td><td><span class="k1">void</span>    tick<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span><span class="k2">;</span>                         <span class="c">// Timer routine.</span></td></tr><tr><td class="number">41</td><td><span class="k1">void</span>    update_time<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span><span class="k2">;</span>                  <span class="c">// Updates clock variables.</span></td></tr></tbody></table></div></div><p>
</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"> * Name:          fps2.c</span></td></tr><tr><td class="number">3</td><td><span class="c"> * Author:        bamccaig-&gt;members.allegro.cc</span></td></tr><tr><td class="number">4</td><td><span class="c"> * Purpose:       Example of using Allegro timer routines and semaphores to limit frames-per-second</span></td></tr><tr><td class="number">5</td><td><span class="c"> *                    in a game and reduce wasted cycles.</span></td></tr><tr><td class="number">6</td><td><span class="c"> * Disclaimer:    Use at own risk. :P</span></td></tr><tr><td class="number">7</td><td><span class="c"> */</span></td></tr><tr><td class="number">8</td><td><span class="p">#include "fps2.h"</span></td></tr><tr><td class="number">9</td><td>&#160;</td></tr><tr><td class="number">10</td><td><span class="k1">int</span> main<span class="k2">(</span><span class="k1">int</span> argc, <span class="k1">char</span><span class="k3">*</span> argv<span class="k2">[</span><span class="k2">]</span><span class="k2">)</span></td></tr><tr><td class="number">11</td><td><span class="k2">{</span></td></tr><tr><td class="number">12</td><td>    <a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a><span class="k3">*</span> bmpBuffer <span class="k3">=</span> NULL<span class="k2">;</span></td></tr><tr><td class="number">13</td><td>&#160;</td></tr><tr><td class="number">14</td><td>    <span class="c">// Try to initialize game.</span></td></tr><tr><td class="number">15</td><td>    <span class="k1">if</span><span class="k2">(</span>initialize<span class="k2">(</span><span class="k2">)</span> <span class="k3">!</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span></td></tr><tr><td class="number">16</td><td>        <a href="http://www.delorie.com/djgpp/doc/libc/libc_298.html" target="_blank">exit</a><span class="k2">(</span><span class="k3">-</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">17</td><td>&#160;</td></tr><tr><td class="number">18</td><td>    <span class="c">// Initalize semaphore.</span></td></tr><tr><td class="number">19</td><td>    sem_init<span class="k2">(</span><span class="k3">&amp;</span>gSemaphore, <span class="n">0</span>, <span class="n">1</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">20</td><td>&#160;</td></tr><tr><td class="number">21</td><td>    <span class="c">// Create and clear screen buffer.</span></td></tr><tr><td class="number">22</td><td>    bmpBuffer <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">800</span>, <span class="n">600</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">23</td><td>    clear<span class="k2">(</span>bmpBuffer<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">// Main game loop.</span></td></tr><tr><td class="number">26</td><td>    <span class="k1">while</span><span class="k2">(</span><span class="k3">!</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="k3">|</span><span class="k3">|</span> gblnCloseButtonPressed<span class="k2">)</span><span class="k2">)</span></td></tr><tr><td class="number">27</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">28</td><td>        <span class="c">// Sleep until next frame.</span></td></tr><tr><td class="number">29</td><td>        sem_wait<span class="k2">(</span><span class="k3">&amp;</span>gSemaphore<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">30</td><td>&#160;</td></tr><tr><td class="number">31</td><td>        <span class="c">// Logic loop. Changes to the game happen here.</span></td></tr><tr><td class="number">32</td><td>        logic<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">33</td><td>&#160;</td></tr><tr><td class="number">34</td><td>        <span class="c">/*</span></td></tr><tr><td class="number">35</td><td><span class="c">         * Draw. Here we draw the current frame first to a buffer in main memory and</span></td></tr><tr><td class="number">36</td><td><span class="c">         * then to the video memory (screen).</span></td></tr><tr><td class="number">37</td><td><span class="c">         */</span></td></tr><tr><td class="number">38</td><td>        draw<span class="k2">(</span>bmpBuffer<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">39</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">40</td><td>&#160;</td></tr><tr><td class="number">41</td><td>    <span class="c">// Release buffer.</span></td></tr><tr><td class="number">42</td><td>    <a href="http://www.allegro.cc/manual/destroy_bitmap" target="_blank"><span class="a">destroy_bitmap</span></a><span class="k2">(</span>bmpBuffer<span class="k2">)</span><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="k2">(</span><span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">45</td><td><span class="k2">}</span></td></tr><tr><td class="number">46</td><td><a href="http://www.allegro.cc/manual/END_OF_MAIN" target="_blank"><span class="a">END_OF_MAIN</span></a><span class="k2">(</span><span class="k2">)</span></td></tr><tr><td class="number">47</td><td>&#160;</td></tr><tr><td class="number">48</td><td>&#160;</td></tr><tr><td class="number">49</td><td>&#160;</td></tr><tr><td class="number">50</td><td><span class="k1">void</span> add_frame<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span></td></tr><tr><td class="number">51</td><td><span class="c">/*</span></td></tr><tr><td class="number">52</td><td><span class="c"> * This is a timer routine that signals the main game loop to execute the logic (and redraw).</span></td></tr><tr><td class="number">53</td><td><span class="c"> */</span></td></tr><tr><td class="number">54</td><td><span class="k2">{</span></td></tr><tr><td class="number">55</td><td>    <span class="c">// Wake up game.</span></td></tr><tr><td class="number">56</td><td>    sem_post<span class="k2">(</span><span class="k3">&amp;</span>gSemaphore<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">57</td><td><span class="k2">}</span></td></tr><tr><td class="number">58</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>add_frame<span class="k2">)</span></td></tr><tr><td class="number">59</td><td>&#160;</td></tr><tr><td class="number">60</td><td>&#160;</td></tr><tr><td class="number">61</td><td>&#160;</td></tr><tr><td class="number">62</td><td><span class="k1">void</span> close_button_handler<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span></td></tr><tr><td class="number">63</td><td><span class="c">/*</span></td></tr><tr><td class="number">64</td><td><span class="c"> * Handles the X button of the window on supported platforms. Signals the main game loop</span></td></tr><tr><td class="number">65</td><td><span class="c"> * to exit.</span></td></tr><tr><td class="number">66</td><td><span class="c"> */</span></td></tr><tr><td class="number">67</td><td><span class="k2">{</span></td></tr><tr><td class="number">68</td><td>    gblnCloseButtonPressed <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span></td></tr><tr><td class="number">69</td><td><span class="k2">}</span></td></tr><tr><td class="number">70</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>close_button_callback<span class="k2">)</span></td></tr><tr><td class="number">71</td><td>&#160;</td></tr><tr><td class="number">72</td><td>&#160;</td></tr><tr><td class="number">73</td><td>&#160;</td></tr><tr><td class="number">74</td><td><span class="k1">void</span> draw<span class="k2">(</span><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a><span class="k3">*</span> bmpBuffer<span class="k2">)</span></td></tr><tr><td class="number">75</td><td><span class="c">/*</span></td></tr><tr><td class="number">76</td><td><span class="c"> * Draws the current frame to a BITMAP buffer in main memory and then to the video memory (screen).</span></td></tr><tr><td class="number">77</td><td><span class="c"> * In this example we're only drawing the total frame count and the frames-per-second count.</span></td></tr><tr><td class="number">78</td><td><span class="c"> */</span></td></tr><tr><td class="number">79</td><td><span class="k2">{</span></td></tr><tr><td class="number">80</td><td>    <span class="c">// To buffer.</span></td></tr><tr><td class="number">81</td><td>    <a href="http://www.allegro.cc/manual/textprintf_ex" target="_blank"><span class="a">textprintf_ex</span></a><span class="k2">(</span>bmpBuffer, <a href="http://www.allegro.cc/manual/font" target="_blank"><span class="a">font</span></a>, <span class="n">20</span>, <span class="n">20</span>, WHITE, <span class="k3">-</span><span class="n">1</span>, <span class="s">"frame-count: %d"</span>, guintTotalFrames<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">82</td><td>    <a href="http://www.allegro.cc/manual/textprintf_ex" target="_blank"><span class="a">textprintf_ex</span></a><span class="k2">(</span>bmpBuffer, <a href="http://www.allegro.cc/manual/font" target="_blank"><span class="a">font</span></a>, <span class="n">20</span>, <span class="n">40</span>, WHITE, <span class="k3">-</span><span class="n">1</span>, <span class="s">"time: %03d:%02d:%02d:%02d"</span>, gushrDays, gushrHours, gushrMinutes, gushrSeconds<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">83</td><td>    <a href="http://www.allegro.cc/manual/textprintf_ex" target="_blank"><span class="a">textprintf_ex</span></a><span class="k2">(</span>bmpBuffer, <a href="http://www.allegro.cc/manual/font" target="_blank"><span class="a">font</span></a>, <span class="n">20</span>, <span class="n">60</span>, WHITE, <span class="k3">-</span><span class="n">1</span>, <span class="s">"fps: %d"</span>, gushrFramesPerSecond<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">84</td><td>&#160;</td></tr><tr><td class="number">85</td><td>    <span class="c">// To screen.</span></td></tr><tr><td class="number">86</td><td>    <a href="http://www.allegro.cc/manual/blit" target="_blank"><span class="a">blit</span></a><span class="k2">(</span>bmpBuffer, <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">800</span>, <span class="n">600</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">87</td><td>    clear<span class="k2">(</span>bmpBuffer<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">88</td><td><span class="k2">}</span></td></tr><tr><td class="number">89</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>draw<span class="k2">)</span></td></tr><tr><td class="number">90</td><td>&#160;</td></tr><tr><td class="number">91</td><td>&#160;</td></tr><tr><td class="number">92</td><td>&#160;</td></tr><tr><td class="number">93</td><td><span class="k1">int</span> initialize<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span></td></tr><tr><td class="number">94</td><td><span class="c">// Initializes the program.</span></td></tr><tr><td class="number">95</td><td><span class="k2">{</span></td></tr><tr><td class="number">96</td><td>    <span class="k1">char</span><span class="k3">*</span> chrGLaDOS_msg <span class="k3">=</span> <span class="s">"If at first you don't succeed,...you fail"</span><span class="k2">;</span></td></tr><tr><td class="number">97</td><td>&#160;</td></tr><tr><td class="number">98</td><td>    <span class="c">// Try to initialize allegro.</span></td></tr><tr><td class="number">99</td><td>    <span class="k1">if</span><span class="k2">(</span><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="k3">!</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span></td></tr><tr><td class="number">100</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">101</td><td>        <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"%s [to initialize Allegro]. %s.\n"</span>, chrGLaDOS_msg, <a href="http://www.allegro.cc/manual/allegro_error" target="_blank"><span class="a">allegro_error</span></a><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">102</td><td>        <span class="k1">return</span><span class="k2">(</span><span class="k3">-</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">103</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">104</td><td>&#160;</td></tr><tr><td class="number">105</td><td>    <span class="c">// Try to install keyboard.</span></td></tr><tr><td class="number">106</td><td>    <span class="k1">if</span><span class="k2">(</span><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="k3">!</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span></td></tr><tr><td class="number">107</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">108</td><td>        <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"%s [to install the keyboard routines].\n"</span>, chrGLaDOS_msg<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">109</td><td>        <span class="k1">return</span><span class="k2">(</span><span class="k3">-</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">110</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">111</td><td>&#160;</td></tr><tr><td class="number">112</td><td>    <span class="c">// Try to install timer.</span></td></tr><tr><td class="number">113</td><td>    <span class="k1">if</span><span class="k2">(</span><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="k3">!</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span></td></tr><tr><td class="number">114</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">115</td><td>        <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"%s [to install the timer routines]."</span>, chrGLaDOS_msg<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">116</td><td>        <span class="k1">return</span><span class="k2">(</span><span class="k3">-</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">117</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">118</td><td>&#160;</td></tr><tr><td class="number">119</td><td>    <span class="c">// Set color depth.</span></td></tr><tr><td class="number">120</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">32</span><span class="k2">)</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">// Try to set graphic mode.</span></td></tr><tr><td class="number">123</td><td>    <span class="k1">if</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/set_gfx_mode" target="_blank"><span class="a">set_gfx_mode</span></a><span class="k2">(</span>GFX_AUTODETECT_WINDOWED, <span class="n">800</span>, <span class="n">600</span>, <span class="n">0</span>, <span class="n">0</span><span class="k2">)</span> <span class="k3">!</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span></td></tr><tr><td class="number">124</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">125</td><td>        <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"%s [to set the graphics mode]. %s.\n"</span>, chrGLaDOS_msg, <a href="http://www.allegro.cc/manual/allegro_error" target="_blank"><span class="a">allegro_error</span></a><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">126</td><td>        <span class="k1">return</span><span class="k2">(</span><span class="k3">-</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">127</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">128</td><td>&#160;</td></tr><tr><td class="number">129</td><td>    <span class="c">/*</span></td></tr><tr><td class="number">130</td><td><span class="c">     * Set display switch mode so the game will continue processing even if the</span></td></tr><tr><td class="number">131</td><td><span class="c">     * user switches to another window.</span></td></tr><tr><td class="number">132</td><td><span class="c">     */</span></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/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">134</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">135</td><td>        <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"%s [to set display switch mode].\n"</span>, chrGLaDOS_msg, <a href="http://www.allegro.cc/manual/allegro_error" target="_blank"><span class="a">allegro_error</span></a><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">136</td><td>        <span class="k1">return</span><span class="k2">(</span><span class="k3">-</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">137</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">138</td><td>&#160;</td></tr><tr><td class="number">139</td><td>    <span class="c">// Lock timer variables.</span></td></tr><tr><td class="number">140</td><td>    <a href="http://www.allegro.cc/manual/LOCK_VARIABLE" target="_blank"><span class="a">LOCK_VARIABLE</span></a><span class="k2">(</span>gblnCloseButtonPressed<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">141</td><td>    <a href="http://www.allegro.cc/manual/LOCK_VARIABLE" target="_blank"><span class="a">LOCK_VARIABLE</span></a><span class="k2">(</span>guintPendingFrames<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">142</td><td>    <a href="http://www.allegro.cc/manual/LOCK_VARIABLE" target="_blank"><span class="a">LOCK_VARIABLE</span></a><span class="k2">(</span>gushrFramesPerSecond<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">143</td><td>    <a href="http://www.allegro.cc/manual/LOCK_VARIABLE" target="_blank"><span class="a">LOCK_VARIABLE</span></a><span class="k2">(</span>gushrFramesThisSecond<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">144</td><td>    <a href="http://www.allegro.cc/manual/LOCK_VARIABLE" target="_blank"><span class="a">LOCK_VARIABLE</span></a><span class="k2">(</span>gushrSeconds<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">145</td><td>    <a href="http://www.allegro.cc/manual/LOCK_VARIABLE" target="_blank"><span class="a">LOCK_VARIABLE</span></a><span class="k2">(</span>gushrMinutes<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">146</td><td>    <a href="http://www.allegro.cc/manual/LOCK_VARIABLE" target="_blank"><span class="a">LOCK_VARIABLE</span></a><span class="k2">(</span>gushrHours<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">147</td><td>    <a href="http://www.allegro.cc/manual/LOCK_VARIABLE" target="_blank"><span class="a">LOCK_VARIABLE</span></a><span class="k2">(</span>gushrDays<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">148</td><td>&#160;</td></tr><tr><td class="number">149</td><td>    <span class="c">// Lock timer routines.</span></td></tr><tr><td class="number">150</td><td>    <a href="http://www.allegro.cc/manual/LOCK_FUNCTION" target="_blank"><span class="a">LOCK_FUNCTION</span></a><span class="k2">(</span>add_frame<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">151</td><td>    <a href="http://www.allegro.cc/manual/LOCK_FUNCTION" target="_blank"><span class="a">LOCK_FUNCTION</span></a><span class="k2">(</span>close_button_handler<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">152</td><td>    <a href="http://www.allegro.cc/manual/LOCK_FUNCTION" target="_blank"><span class="a">LOCK_FUNCTION</span></a><span class="k2">(</span>tick<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>    <span class="c">// Install timer callbacks.</span></td></tr><tr><td class="number">155</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>add_frame, BPS_TO_TIMER<span class="k2">(</span>TARGET_FPS<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">156</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>tick, BPS_TO_TIMER<span class="k2">(</span><span class="n">1</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">157</td><td>&#160;</td></tr><tr><td class="number">158</td><td>    <span class="c">// Install close-button callback.</span></td></tr><tr><td class="number">159</td><td>    <a href="http://www.allegro.cc/manual/set_close_button_callback" target="_blank"><span class="a">set_close_button_callback</span></a><span class="k2">(</span>close_button_handler<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">160</td><td>&#160;</td></tr><tr><td class="number">161</td><td>    <span class="k1">return</span><span class="k2">(</span><span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">162</td><td><span class="k2">}</span></td></tr><tr><td class="number">163</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>initialize<span class="k2">)</span></td></tr><tr><td class="number">164</td><td>&#160;</td></tr><tr><td class="number">165</td><td>&#160;</td></tr><tr><td class="number">166</td><td>&#160;</td></tr><tr><td class="number">167</td><td><span class="k1">void</span> logic<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span></td></tr><tr><td class="number">168</td><td><span class="c">/*</span></td></tr><tr><td class="number">169</td><td><span class="c"> * Logic. In this example we're only incrementing a total frame counter, a</span></td></tr><tr><td class="number">170</td><td><span class="c"> * frames-per-second counter, and updating time variables.</span></td></tr><tr><td class="number">171</td><td><span class="c"> */</span></td></tr><tr><td class="number">172</td><td><span class="k2">{</span></td></tr><tr><td class="number">173</td><td>    update_time<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>    guintTotalFrames<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span></td></tr><tr><td class="number">176</td><td>    gushrFramesThisSecond<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span></td></tr><tr><td class="number">177</td><td><span class="k2">}</span></td></tr><tr><td class="number">178</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>logic<span class="k2">)</span></td></tr><tr><td class="number">179</td><td>&#160;</td></tr><tr><td class="number">180</td><td>&#160;</td></tr><tr><td class="number">181</td><td>&#160;</td></tr><tr><td class="number">182</td><td><span class="k1">void</span> tick<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span></td></tr><tr><td class="number">183</td><td><span class="c">/*</span></td></tr><tr><td class="number">184</td><td><span class="c"> * This is another timer routine that executes [approximately] once per second.</span></td></tr><tr><td class="number">185</td><td><span class="c"> * It's role is to set the frames-per-second count and reset the</span></td></tr><tr><td class="number">186</td><td><span class="c"> * frames-this-second counter.</span></td></tr><tr><td class="number">187</td><td><span class="c"> */</span></td></tr><tr><td class="number">188</td><td><span class="k2">{</span></td></tr><tr><td class="number">189</td><td>    <span class="c">// Update game time.</span></td></tr><tr><td class="number">190</td><td>    gushrSeconds<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span></td></tr><tr><td class="number">191</td><td>&#160;</td></tr><tr><td class="number">192</td><td>    <span class="c">// Update frames per second.</span></td></tr><tr><td class="number">193</td><td>    gushrFramesPerSecond <span class="k3">=</span> gushrFramesThisSecond<span class="k2">;</span></td></tr><tr><td class="number">194</td><td>    gushrFramesThisSecond <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">195</td><td><span class="k2">}</span></td></tr><tr><td class="number">196</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>tick<span class="k2">)</span></td></tr><tr><td class="number">197</td><td>&#160;</td></tr><tr><td class="number">198</td><td>&#160;</td></tr><tr><td class="number">199</td><td>&#160;</td></tr><tr><td class="number">200</td><td><span class="k1">void</span> update_time<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span></td></tr><tr><td class="number">201</td><td><span class="c">// Updates time variables.</span></td></tr><tr><td class="number">202</td><td><span class="k2">{</span></td></tr><tr><td class="number">203</td><td>    <span class="k1">if</span><span class="k2">(</span>gushrSeconds <span class="k3">=</span><span class="k3">=</span> SECS_PER_MIN<span class="k2">)</span></td></tr><tr><td class="number">204</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">205</td><td>        gushrMinutes<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span></td></tr><tr><td class="number">206</td><td>        gushrSeconds <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">207</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">208</td><td>&#160;</td></tr><tr><td class="number">209</td><td>    <span class="k1">if</span><span class="k2">(</span>gushrMinutes <span class="k3">=</span><span class="k3">=</span> MINS_PER_HOUR<span class="k2">)</span></td></tr><tr><td class="number">210</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">211</td><td>        gushrHours<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span></td></tr><tr><td class="number">212</td><td>        gushrMinutes <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">213</td><td>    <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">if</span><span class="k2">(</span>gushrHours <span class="k3">=</span><span class="k3">=</span> HOURS_PER_DAY<span class="k2">)</span></td></tr><tr><td class="number">216</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">217</td><td>        gushrDays<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span></td></tr><tr><td class="number">218</td><td>        gushrHours <span class="k3">=</span> <span class="n">0</span><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><span class="k2">}</span></td></tr></tbody></table></div></div><p>
To compile it the following commands should work (you must have Allegro [and <a href="http://sourceware.org/pthreads-win32/">pthreads</a> installed - Windows users, this probably means you]).
</p><pre>Windows/MinGW: gcc -O2 fps2.c -o fps2.exe -lalleg -lpthreadGC2</pre><p>
</p><pre>*nix/GCC: gcc -O2 fps2.c -o fps2.exe $(allegro-config --libs) -lpthread</pre><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (bamccaig)</author>
		<pubDate>Sat, 12 Jan 2008 00:31:16 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
I&#39;m surprised that doesn&#39;t outright crash, what with Allegro&#39;s notorious thread unsafety and all.
</p></div></div><p>

never crashed... 4 years this damn calling inside main loop... hundred of performances and theatre play without crash... <img src="http://www.allegro.cc/forums/smileys/grin.gif" alt=";D" /><img src="http://www.allegro.cc/forums/smileys/grin.gif" alt=";D" /><img src="http://www.allegro.cc/forums/smileys/grin.gif" alt=";D" /><img src="http://www.allegro.cc/forums/smileys/grin.gif" alt=";D" /></p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
unless you&#39;re absolutely sure you know what you&#39;re doing.
</p></div></div><p>

well, or people have made studies, and better than say&#39;until you know what you are doing&#39; they can explain WHY and HOW ( more constructiv), or they didn t ... no ?</p><p><img src="http://www.allegro.cc/forums/smileys/grin.gif" alt=";D" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (karistouf)</author>
		<pubDate>Sat, 12 Jan 2008 01:52:54 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
well, or people have made studies, and better than say&#39;until you know what you are doing&#39; they can explain WHY and HOW ( more constructiv), or they didn t ... no ?
</p></div></div><p>I don&#39;t understand a thing you just said.</p><p>However, what i meant was, if you know the issues inherent with threading, and know what to work around them, do as you please.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Sat, 12 Jan 2008 02:09:54 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>On a side note, should a semaphore (<tt>sem_t</tt>) be <tt>volatile</tt>? <img src="http://www.allegro.cc/forums/smileys/undecided.gif" alt=":-/" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (bamccaig)</author>
		<pubDate>Sat, 12 Jan 2008 03:24:18 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>No. Just ignore that keyword. It doesn&#39;t do what most people think it does.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Sat, 12 Jan 2008 03:37:13 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
On a side note, should a semaphore (sem_t) be volatile?
</p></div></div><p>

Actually it relies on a special CPU instruction called (roughly) &quot;test and set lock&quot;. It is an entirely atomic operation. sem_t itself is a struct.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Goalie Ca)</author>
		<pubDate>Sat, 12 Jan 2008 05:51:48 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Thomas Fjellstrom said:</div><div class="quote"><p>
No. Just ignore that keyword. It doesn&#39;t do what most people think it does.
</p></div></div><p>
Is <a href="http://en.wikipedia.org/wiki/Volatile_variable">this</a> not what it does? <img src="http://www.allegro.cc/forums/smileys/undecided.gif" alt=":-/" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (bamccaig)</author>
		<pubDate>Sat, 12 Jan 2008 06:55:44 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>He must be referring to the fact that people assume volatile is atomic. That is it reads, processes, and writes back. </p><p>I think of Volatile as the (sort of) opposite of &quot;register&quot;. That is, this is not to be cached in a register. Write-through!!! Read too!
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Goalie Ca)</author>
		<pubDate>Sat, 12 Jan 2008 08:03:39 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Thanks, Goalie Ca! My raw Allegro timer example uses approximately 20% CPU. The modified version implementing pthreads/semaphores is using 3-5% CPU. <img src="http://www.allegro.cc/forums/smileys/cheesy.gif" alt=":D" /></p><p> <i>** EDIT **</i></p><p>I may have spoken too soon. The 20% CPU usage was seen on another system. My home system is actually using a very similar amount of CPU with raw Allegro timers... <img src="http://www.allegro.cc/forums/smileys/undecided.gif" alt=":-/" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (bamccaig)</author>
		<pubDate>Sun, 13 Jan 2008 03:32:34 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Also, see this: <a href="http://kerneltrap.org/Linux/Volatile_Superstition">http://kerneltrap.org/Linux/Volatile_Superstition</a>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Sun, 13 Jan 2008 03:47:25 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
I may have spoken too soon. The 20% CPU usage was seen on another system. My home system is actually using a very similar amount of CPU with raw Allegro timers... <img src="http://www.allegro.cc/forums/smileys/undecided.gif" alt=":-/" />
</p></div></div><p>

rest() will vary from system to system. It is dependant on the operating system scheduler. It may even vary from session to session. Might vary if you run it in win2k instead of vista. </p><p>I also wonder about pthread performance on windows. Windows does not have native posix threading. Windows threads will have to be &quot;Wrapped&quot; in order to have the necessary behaviour. </p><p>I can take my code and run it on a junker linux system and it will use &lt; 1%.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Goalie Ca)</author>
		<pubDate>Sun, 13 Jan 2008 08:15:53 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
<a href="http://wiki.allegro.cc/Timers#Yielding_the_CPU">http://wiki.allegro.cc/Timers#Yielding_the_CPU</a>
</p></div></div><p>
BTW, is there a way to do this <i>without</i> relying on an Allegro timer? It&#39;s just that if you&#39;re trying to move away from a <span class="source-code"><span class="k1">while</span><span class="k2">(</span>waiting<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> loop, that&#39;s basically what Allegro&#39;s timers do. Though the timer thread does attempt to use precise resting, and calculating the rest time &#39;til it needs to wake up next, it still won&#39;t get any more accurate than 75 to 100 fps (since once it goes to sleep, the thread won&#39;t wake up again for about 10ms, which maxes you out at 100 tics per second; and if you&#39;re trying for 100fps, then you&#39;re not getting any better than a rest(1) anyway.. or worse, rest past the intended wakeup time causing an additional 10ms delay; then add the overhead of the callback loop itself, plus other timers trying to run..).</p><p>Obviously there&#39;d be no portable way to do it, but I think having the system interrupt and call into your process at specific intervals to do a simple sem_post wouldn&#39;t be too hard to wrap.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Kitty Cat)</author>
		<pubDate>Sun, 13 Jan 2008 08:48:12 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Hmm.. that&#39;s good food for thought. I would have thought the allegro timers would use the underlying operating system ones (eg: windows highperformance timer). Granted.. none are &quot;real-time&quot; but they are pretty accurate nonetheless.</p><p>Allegro is in desperate need of threading tools and primitives. Not to be the devil here but SDL has a built-in pthread-like interface. Allegro5 better hurry up. DNF depends on it! I think DOS support is the real problem here holding a lot of this stuff back. Please correct me if i&#39;m wrong.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Goalie Ca)</author>
		<pubDate>Sun, 13 Jan 2008 09:51:38 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Allegro has an internal cross platform&#39;ish api.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Sun, 13 Jan 2008 11:09:03 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
I would have thought the allegro timers would use the underlying operating system ones (eg: windows highperformance timer). Granted.. none are &quot;real-time&quot; but they are pretty accurate nonetheless.
</p></div></div><p>
They do use the high-precision timing methods when possible, but the granularity of the sleep method is the problem. Whether it tries to sleep 1 nanosecond* or one millisecond, the thread will stay down until it gets a timeslice again, which would be in about 10ms. Having the system interrupt your process on time would be the only way to break that.</p><p>(*) Sometimes nanosleep will actually busy wait on really small rest values (a few nanoseconds) depending on the system configuration.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Kitty Cat)</author>
		<pubDate>Sun, 13 Jan 2008 22:55:57 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>So i&#39;ve gone ahead and wrote a windows/linux/mac timer file that doesn&#39;t use allegro. The *nix one uses real-time posix extensions and the windows one uses the multimedia timer set to 1ms accuracy. Both use a semaphore mechanism to wake/sleep. </p><p>I&#39;ve posted it here. <br /><a href="http://www.allegro.cc/forums/thread/594745">http://www.allegro.cc/forums/thread/594745</a></p><p>edit: no need for windows pthread anymore. THe windows version uses windows own locking mechanism.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Goalie Ca)</author>
		<pubDate>Mon, 14 Jan 2008 05:24:17 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
I think DOS support is the real problem here holding a lot of this stuff back. Please correct me if i&#39;m wrong.
</p></div></div><p>
At your service.<br />Allegro 5 doesn&#39;t have DOS support, unless someone comes along and wants to do the work to try to fit it in somehow.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Evert)</author>
		<pubDate>Tue, 15 Jan 2008 01:28:28 +0000</pubDate>
	</item>
</rss>
