<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>timers</title>
		<link>http://www.allegro.cc/forums/view/557182</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Thu, 05 Jan 2006 12:33:57 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>can somone point me to a tutorial on timers..and how to use them?</p><p>thanks
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Money)</author>
		<pubDate>Tue, 03 Jan 2006 07:43:21 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Have a look at <a href="http://loomsoft.net/resources/alltut/alltut_lesson6.htm">Loomsoft&#39;s tutorial</a>. There are others at the <a href="http://loomsoft.net/resources/alltut/alltut_index.htm">site root</a>.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (CGamesPlay)</author>
		<pubDate>Tue, 03 Jan 2006 07:46:04 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>thanks <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Money)</author>
		<pubDate>Tue, 03 Jan 2006 07:53:51 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>And just so you know: For smooth animation, you&#39;re probably better off <i>not</i> using allegro timers; the best method is QueryPerformanceCounter for windows and gettimeofday for linux. Google should give you enough information about how to use them. Both work similarly and can be wrapped into a uniform timer api which is as simple as it can be. Strong points of both:<br />+ extremely high accuracy (down to a single cpu clock tick, IIRC, while allegro timers have a ~10 ms granularity on windows)<br />+ virtually no performance penalty (since the timers you poll are running anyway, while allegro timers need a dedicated timer thread which they switch into and out of)<br />Only con is that they are platform specific; this can be solved by adding allegro timer support to the wrapper as well (as a fallback), or just limiting the program to windows &amp; linux (there is probably a similar solution for other platforms though).
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Tobias Dammers)</author>
		<pubDate>Tue, 03 Jan 2006 15:50:05 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
gettimeofday for linux
</p></div></div><p>
Actually,
</p><div class="quote_container"><div class="title">man gettimeofday said:</div><div class="quote"><p>
CONFORMING TO<br />       SVr4,  BSD 4.3. POSIX 1003.1-2001 describes gettimeofday() but not set-<br />       timeofday().
</p></div></div><p>
That basically means that it&#39;s portable to any UNIX system, including MacOS X (so basically, everything except Windows). Hmm... it might even be portable to MinGW, which makes it sortof portable to Windows too.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Evert)</author>
		<pubDate>Tue, 03 Jan 2006 17:31:51 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Hmm... it might even be portable to MinGW, which makes it sortof portable to Windows too.
</p></div></div><p>A quick google search makes me think migw doesn&#39;t support it</p><p>[edit]</p><p>Perhaps I was too hasty. <a href="http://lists.gnu.org/archive/html/bug-gnu-chess/2004-01/msg00020.html">Here</a> is a way to give mingw gettimeofday function. Of cource it involves creating custom mingw build so if it is not in official mingw distribution by now* it is of little use</p><p>*)The original &quot;fix&quot; was pruposed around mid-2001 and in late 2004 it wasn&#39;t in official release. I doubt it is there today,
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (HoHo)</author>
		<pubDate>Tue, 03 Jan 2006 17:36:35 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
while allegro timers have a ~10 ms granularity on windows
</p></div></div><p>

This can be easily remedied by using timeBeginPeriod and timeEndPeriod from the WinMM, probably coupled with some querying with timeGetDevCaps to see what is the minimal granularity possible (it&#39;ll likely be 10ms under Win98, but newer systems tend to support at least 1ms).</p><p>Setting 1ms scheduler granularity will probably allow Allegro timers (they&#39;re implemented as threads, right?) to run more accurately, up to 1000 BPS.</p><p>I use the more complicated delta time method myself, and it&#39;s better in many ways than what I described above, but the timer approach has the advantage of being very simple, and with beefed up granularity it&#39;s even quite smooth.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Jakub Wasilewski)</author>
		<pubDate>Tue, 03 Jan 2006 17:54:27 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Setting 1ms scheduler granularity will probably allow Allegro timers (they&#39;re implemented as threads, right?) to run more accurately, up to 1000 BPS.
</p></div></div><p>
It may and it may not.<br />This was tested about a year ago (I think) and it was found that the result was unreliable across different Windows versions (no surprise there) and different hardware running the same version of Windows, so no change was made to Allegro to implement this.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Evert)</author>
		<pubDate>Tue, 03 Jan 2006 17:59:43 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Can someone clarify this? I mean what would the error graph would look like on for example my 200 bps timer? Does it ever do &quot;5-10-9-14-19&quot; or &quot;5-10-10-20&quot; ? If we know what goes wrong then it would be easier to counter it, right? Just &quot;knowing that it is bad&quot; doesn&#39;t help much!
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Murat AYIK)</author>
		<pubDate>Tue, 03 Jan 2006 18:13:59 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
And just so you know: For smooth animation, you&#39;re probably better off not using allegro timers; the best method is QueryPerformanceCounter for windows and gettimeofday for linux.
</p></div></div><p>

While I agree with that for complex 3D scenes, the vast majority of 2D games (and simple 3D ones, I imagine) can be handled in a smooth and reliable fashion with a few well crafted timers. I&#39;ve never had a reason to use a timer of greater frequency than 140 BPS, and even that could have been pared down to 70 if I had felt a little more inspired.</p><p>Certainly for 3D games I&#39;d go for delta time, but all my games run nicely using Allegro timers.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Sirocco)</author>
		<pubDate>Tue, 03 Jan 2006 20:24:08 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
For smooth animation, you&#39;re probably better off not using allegro timers
</p></div></div><p>
i don&#39;t believe so.<br />for animation they work pretty good!
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Frank Drebin)</author>
		<pubDate>Tue, 03 Jan 2006 22:53:03 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
the best method is QueryPerformanceCounter for windows
</p></div></div><p>

Just curious, how would you use that?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (scriptX)</author>
		<pubDate>Thu, 05 Jan 2006 10:23:09 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Heres how i do it:
</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="p">#ifdef WIN32</span></td></tr><tr><td class="number">2</td><td><span class="p">#include &lt;windows.h&gt;</span></td></tr><tr><td class="number">3</td><td><span class="p">#else</span></td></tr><tr><td class="number">4</td><td><span class="p">#include &lt;sys/time.h&gt;</span></td></tr><tr><td class="number">5</td><td><span class="p">#endif</span></td></tr><tr><td class="number">6</td><td>&#160;</td></tr><tr><td class="number">7</td><td>Timer timer<span class="k2">;</span></td></tr><tr><td class="number">8</td><td>&#160;</td></tr><tr><td class="number">9</td><td>Timer::Timer<span class="k2">(</span><span class="k2">)</span></td></tr><tr><td class="number">10</td><td><span class="k2">{</span></td></tr><tr><td class="number">11</td><td><span class="p">#ifdef WIN32</span></td></tr><tr><td class="number">12</td><td>    startTime <span class="k3">=</span> GetTickCount<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">13</td><td><span class="p">#else</span></td></tr><tr><td class="number">14</td><td>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_421.html" target="_blank">gettimeofday</a><span class="k2">(</span><span class="k3">&amp;</span>startTime, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">15</td><td><span class="p">#endif</span></td></tr><tr><td class="number">16</td><td><span class="k2">}</span></td></tr><tr><td class="number">17</td><td>&#160;</td></tr><tr><td class="number">18</td><td>Timer::time_t Timer::usecs<span class="k2">(</span><span class="k2">)</span></td></tr><tr><td class="number">19</td><td><span class="k2">{</span></td></tr><tr><td class="number">20</td><td><span class="p">#ifdef WIN32</span></td></tr><tr><td class="number">21</td><td>    <span class="k1">static</span> <span class="k1">bool</span> onetime <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">22</td><td>    <span class="k1">static</span> <span class="k1">unsigned</span> <span class="k1">long</span> <span class="k1">long</span> freq <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></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><span class="k3">!</span>onetime<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">25</td><td>        </td></tr><tr><td class="number">26</td><td>        onetime <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span></td></tr><tr><td class="number">27</td><td>        QueryPerformanceFrequency<span class="k2">(</span><span class="k2">(</span>LARGE_INTEGER<span class="k3">*</span><span class="k2">)</span><span class="k3">&amp;</span>freq<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">28</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">29</td><td>    </td></tr><tr><td class="number">30</td><td>    QueryPerformanceCounter<span class="k2">(</span><span class="k2">(</span>LARGE_INTEGER<span class="k3">*</span><span class="k2">)</span><span class="k3">&amp;</span>currentTime<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">31</td><td>    </td></tr><tr><td class="number">32</td><td>    currentTime <span class="k3">*</span><span class="k3">=</span> <span class="n">1000000</span><span class="k2">;</span></td></tr><tr><td class="number">33</td><td>    currentTime <span class="k3">/</span><span class="k3">=</span> freq<span class="k2">;</span></td></tr><tr><td class="number">34</td><td>    </td></tr><tr><td class="number">35</td><td>    <span class="k1">return</span> currentTime <span class="k3">-</span> startTime <span class="k3">*</span> <span class="n">1000</span><span class="k2">;</span></td></tr><tr><td class="number">36</td><td><span class="p">#else</span></td></tr><tr><td class="number">37</td><td>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_421.html" target="_blank">gettimeofday</a><span class="k2">(</span><span class="k3">&amp;</span>currentTime, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">38</td><td>    </td></tr><tr><td class="number">39</td><td>    <span class="k1">return</span> <span class="k2">(</span><span class="k1">unsigned</span> <span class="k1">long</span><span class="k2">)</span><span class="k2">(</span><span class="k2">(</span>currentTime.tv_sec <span class="k3">-</span> startTime.tv_sec<span class="k2">)</span> <span class="k3">/</span> <span class="n">1000</span><span class="k2">)</span></td></tr><tr><td class="number">40</td><td>            <span class="k3">+</span> <span class="k2">(</span><span class="k1">unsigned</span> <span class="k1">long</span><span class="k2">)</span><span class="k2">(</span><span class="k2">(</span>currentTime.tv_usec <span class="k3">-</span> startTime.tv_usec<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">41</td><td><span class="p">#endif</span></td></tr><tr><td class="number">42</td><td><span class="k2">}</span></td></tr><tr><td class="number">43</td><td>&#160;</td></tr><tr><td class="number">44</td><td>Timer::time_t Timer::msecs<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><span class="p">#ifdef WIN32</span></td></tr><tr><td class="number">47</td><td>    currentTime <span class="k3">=</span> GetTickCount<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">48</td><td>    </td></tr><tr><td class="number">49</td><td>    <span class="k1">return</span> currentTime <span class="k3">-</span> startTime<span class="k2">;</span></td></tr><tr><td class="number">50</td><td><span class="p">#else</span></td></tr><tr><td class="number">51</td><td>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_421.html" target="_blank">gettimeofday</a><span class="k2">(</span><span class="k3">&amp;</span>currentTime, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">52</td><td>    </td></tr><tr><td class="number">53</td><td>    <span class="k1">return</span> <span class="k2">(</span><span class="k1">unsigned</span> <span class="k1">long</span><span class="k2">)</span><span class="k2">(</span><span class="k2">(</span>currentTime.tv_sec <span class="k3">-</span> startTime.tv_sec<span class="k2">)</span> <span class="k3">*</span> <span class="n">1000</span><span class="k2">)</span></td></tr><tr><td class="number">54</td><td>            <span class="k3">+</span> <span class="k2">(</span><span class="k1">unsigned</span> <span class="k1">long</span><span class="k2">)</span><span class="k2">(</span><span class="k2">(</span>currentTime.tv_usec <span class="k3">-</span> startTime.tv_usec<span class="k2">)</span> <span class="k3">/</span> <span class="n">1000</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">55</td><td><span class="p">#endif</span></td></tr><tr><td class="number">56</td><td><span class="k2">}</span></td></tr><tr><td class="number">57</td><td>&#160;</td></tr><tr><td class="number">58</td><td>Timer::time_t Timer::secs<span class="k2">(</span><span class="k2">)</span></td></tr><tr><td class="number">59</td><td><span class="k2">{</span></td></tr><tr><td class="number">60</td><td><span class="p">#ifdef WIN32</span></td></tr><tr><td class="number">61</td><td>    currentTime <span class="k3">=</span> GetTickCount<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">62</td><td>    </td></tr><tr><td class="number">63</td><td>    <span class="k1">return</span> <span class="k2">(</span>currentTime <span class="k3">-</span> startTime<span class="k2">)</span> <span class="k3">/</span> <span class="n">1000</span><span class="k2">;</span></td></tr><tr><td class="number">64</td><td><span class="p">#else</span></td></tr><tr><td class="number">65</td><td>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_421.html" target="_blank">gettimeofday</a><span class="k2">(</span><span class="k3">&amp;</span>currentTime, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">66</td><td>    </td></tr><tr><td class="number">67</td><td>    <span class="k1">return</span> <span class="k2">(</span><span class="k1">unsigned</span> <span class="k1">long</span><span class="k2">)</span><span class="k2">(</span>currentTime.tv_sec <span class="k3">-</span> startTime.tv_sec<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">68</td><td><span class="p">#endif</span></td></tr><tr><td class="number">69</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>
GetTickCount is easier if all you need is millisecond precision.</p><p>Where you need more accurate timers (in a typical game project) is with FPS counters.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (ImLeftFooted)</author>
		<pubDate>Thu, 05 Jan 2006 12:33:57 +0000</pubDate>
	</item>
</rss>
