<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>60Hz with Allegro?</title>
		<link>http://www.allegro.cc/forums/view/591808</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Sun, 10 Jun 2007 04:21:44 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>- You know that 1000/60 = 16.67, and 16x60 = 960 miliseconds. In other words, Allegro doesn&#39;t keep my program running at exactly 60Hz - it keeps around 62~63 frames-per-second (62.5 is the result). The function to request a 60Hz refresh (request_refresh_rate(60)) doesn&#39;t work, even if the Windows monitor is set to 60Hz, Allegro keeps displaying 70Hz of refreshing.</p><p>- There&#39;s only the milisecond as precision? No turn arounds? Yes, my system is Windows XP, using MinGW + Dev-Cpp.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Zepper)</author>
		<pubDate>Sat, 09 Jun 2007 02:05:22 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>1) Show us your initialization code.<br />2) Are you using vsync?<br />3) What&#39;s the result of <span class="source-code"><a href="http://www.allegro.cc/manual/get_refresh_rate" target="_blank"><span class="a">get_refresh_rate</span></a><span class="k2">(</span><span class="k2">)</span></span>?<br />4) You won&#39;t ever get <i>exactly</i> the logic or refresh rate you requested. The timers only have so much precision, and in any non-real-time system you will have interference from other processes.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (gnolam)</author>
		<pubDate>Sat, 09 Jun 2007 02:54:39 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Might be helpful to see the main loop, too.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Kibiz0r)</author>
		<pubDate>Sat, 09 Jun 2007 02:56:35 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>- I use exactly what extimer.c does. Anyway, I get 62~63 FPS, but the get_refresh_rate() still returns 60, the retrace count returns 71~72 at every sync. No, I don&#39;t use vsync(), but this...</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">//TIMER CONTROL</span></td></tr><tr><td class="number">2</td><td><span class="c">//=============</span></td></tr><tr><td class="number">3</td><td><span class="k1">volatile</span> <span class="k1">int</span> update_count <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">volatile</span> <span class="k1">int</span> frame_count <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">5</td><td><span class="k1">volatile</span> <span class="k1">int</span> fps <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">6</td><td>&#160;</td></tr><tr><td class="number">7</td><td><span class="k1">void</span> gfx_timer_proc<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span></td></tr><tr><td class="number">8</td><td><span class="k2">{</span></td></tr><tr><td class="number">9</td><td>   update_count <span class="k3">=</span> <span class="n">1</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>&#160;</td></tr><tr><td class="number">12</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>gfx_timer_proc<span class="k2">)</span></td></tr><tr><td class="number">13</td><td>&#160;</td></tr><tr><td class="number">14</td><td><span class="k1">static</span> <span class="k1">void</span> gfx_fps_proc<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span></td></tr><tr><td class="number">15</td><td><span class="k2">{</span></td></tr><tr><td class="number">16</td><td>   fps <span class="k3">=</span> frame_count<span class="k2">;</span></td></tr><tr><td class="number">17</td><td>   frame_count <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">18</td><td><span class="k2">}</span></td></tr><tr><td class="number">19</td><td>&#160;</td></tr><tr><td class="number">20</td><td>&#160;</td></tr><tr><td class="number">21</td><td><span class="c">/* inits timer</span></td></tr><tr><td class="number">22</td><td><span class="c"> */</span></td></tr><tr><td class="number">23</td><td><span class="k1">void</span> gfx_init_timer<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>   <a href="http://www.allegro.cc/manual/LOCK_VARIABLE" target="_blank"><span class="a">LOCK_VARIABLE</span></a><span class="k2">(</span>update_count<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">26</td><td>   <a href="http://www.allegro.cc/manual/LOCK_VARIABLE" target="_blank"><span class="a">LOCK_VARIABLE</span></a><span class="k2">(</span>frame_count<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">27</td><td>   <a href="http://www.allegro.cc/manual/LOCK_VARIABLE" target="_blank"><span class="a">LOCK_VARIABLE</span></a><span class="k2">(</span>fps<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">28</td><td>   <a href="http://www.allegro.cc/manual/LOCK_FUNCTION" target="_blank"><span class="a">LOCK_FUNCTION</span></a><span class="k2">(</span>gfx_timer_proc<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">29</td><td>   <a href="http://www.allegro.cc/manual/LOCK_FUNCTION" target="_blank"><span class="a">LOCK_FUNCTION</span></a><span class="k2">(</span>gfx_fps_proc<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>   <a href="http://www.allegro.cc/manual/install_int_ex" target="_blank"><span class="a">install_int_ex</span></a><span class="k2">(</span>gfx_timer_proc, 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">32</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>gfx_fps_proc, 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">33</td><td><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> refresh_screen<span class="k2">(</span><span class="k2">)</span></td></tr><tr><td class="number">36</td><td><span class="k2">{</span>    </td></tr><tr><td class="number">37</td><td>   <span class="k1">while</span><span class="k2">(</span><span class="n">0</span> <span class="k3">=</span><span class="k3">=</span> update_count<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">38</td><td>      <a href="http://www.allegro.cc/manual/rest" target="_blank"><span class="a">rest</span></a><span class="k2">(</span><span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">39</td><td>   <span class="k2">}</span></td></tr><tr><td class="number">40</td><td>   update_count <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">41</td><td>   frame_count<span class="k3">+</span><span class="k3">+</span><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">//blit the current image buffer</span></td></tr><tr><td class="number">44</td><td>   <span class="c">// source, destiny, sx, sy, dx, dy, sizex, sizey</span></td></tr><tr><td class="number">45</td><td>   <a href="http://www.allegro.cc/manual/blit" target="_blank"><span class="a">blit</span></a><span class="k2">(</span>video-&gt;Bmp_eagle,<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>,video-&gt;x,video-&gt;y,video-&gt;xmax,video-&gt;ymax<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">46</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>

- The refresh_screen() is called when an entire PPU frame is done. Things run around 110 FPS with no control, of course. Anything more?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Zepper)</author>
		<pubDate>Sat, 09 Jun 2007 04:00:59 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Three things.</p><p>1. request_refresh_rate() needs some work. I&#39;ve never seen it work properly on Windows.</p><p>2. Even if you successfully request the refresh rate you want, it will never be exactly the same every time. No matter what, your Allegro timer will slowly drift away from the monitor&#39;s refresh. The <u>only</u> ways you can time perfectly to the monitor is to use vsync(), page flipping (which also uses vsync()) or learn triple buffering.</p><p>3. Timing only to the monitor is a very bad idea since not every user will have the same refresh rate and since request_refresh_rate() isn&#39;t reliable. If you want your game to be timed accurately you will need to resort to a timer. Thus, unless you&#39;re doing real-time logic, monitor synchronization plus accurate game timing are impossible to combine without frame loss.</p><p>--- Kris Asick (Gemini)<br />--- <a href="http://www.pixelships.com">http://www.pixelships.com</a>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Kris Asick)</author>
		<pubDate>Sat, 09 Jun 2007 23:14:08 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>1) You&#39;re not showing us how you set up your graphics mode.<br />2) That&#39;s now how you synchronize updates to the refresh rate. Use vsync().
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (gnolam)</author>
		<pubDate>Sat, 09 Jun 2007 23:52:40 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Fair enough, here...
</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">/* install gfx</span></td></tr><tr><td class="number">2</td><td><span class="c"> */</span></td></tr><tr><td class="number">3</td><td><span class="k1">int</span> init_gfx<span class="k2">(</span><span class="k2">)</span></td></tr><tr><td class="number">4</td><td><span class="k2">{</span></td></tr><tr><td class="number">5</td><td>   <span class="k1">int</span> directx_vmode<span class="k2">[</span><span class="n">10</span><span class="k2">]</span> <span class="k3">=</span> <span class="k2">{</span></td></tr><tr><td class="number">6</td><td><span class="c">/*00*/</span>      GFX_AUTODETECT,</td></tr><tr><td class="number">7</td><td><span class="c">/*01*/</span>      GFX_AUTODETECT_FULLSCREEN,</td></tr><tr><td class="number">8</td><td><span class="c">/*02*/</span>      GFX_AUTODETECT_WINDOWED,</td></tr><tr><td class="number">9</td><td><span class="c">/*03*/</span>      GFX_SAFE,</td></tr><tr><td class="number">10</td><td><span class="c">/*04*/</span>      GFX_DIRECTX_ACCEL,</td></tr><tr><td class="number">11</td><td><span class="c">/*05*/</span>      GFX_DIRECTX_SOFT,</td></tr><tr><td class="number">12</td><td><span class="c">/*06*/</span>      GFX_DIRECTX_SAFE,</td></tr><tr><td class="number">13</td><td><span class="c">/*07*/</span>      GFX_DIRECTX_WIN,</td></tr><tr><td class="number">14</td><td><span class="c">/*08*/</span>      GFX_DIRECTX_OVL,</td></tr><tr><td class="number">15</td><td><span class="c">/*09*/</span>      GFX_GDI</td></tr><tr><td class="number">16</td><td>   <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">/* Allows to run in background, sweet!</span></td></tr><tr><td class="number">19</td><td><span class="c">    */</span></td></tr><tr><td class="number">20</td><td>   <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">21</td><td>&#160;</td></tr><tr><td class="number">22</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">23</td><td>   <a href="http://www.allegro.cc/manual/request_refresh_rate" target="_blank"><span class="a">request_refresh_rate</span></a><span class="k2">(</span><span class="n">60</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">24</td><td>   <span class="k1">if</span><span class="k2">(</span><span class="n">0</span> <span class="k3">!</span><span class="k3">=</span> <a href="http://www.allegro.cc/manual/set_gfx_mode" target="_blank"><span class="a">set_gfx_mode</span></a><span class="k2">(</span>directx_vmode<span class="k2">[</span>video-&gt;gfx_card<span class="k2">]</span>,video-&gt;vx,video-&gt;vy,<span class="n">0</span>,<span class="n">0</span><span class="k2">)</span><span class="k2">)</span></td></tr><tr><td class="number">25</td><td>   <span class="k2">{</span></td></tr><tr><td class="number">26</td><td>      <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">"Graphics error: %s.\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">27</td><td>      <span class="k1">return</span> <span class="k3">-</span><span class="n">1</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>   <span class="k1">if</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/get_refresh_rate" target="_blank"><span class="a">get_refresh_rate</span></a><span class="k2">(</span><span class="k2">)</span> <span class="k3">!</span><span class="k3">=</span> <span class="n">60</span><span class="k2">)</span></td></tr><tr><td class="number">30</td><td>     <a href="http://www.allegro.cc/manual/allegro_message" target="_blank"><span class="a">allegro_message</span></a><span class="k2">(</span><span class="s">"Couldn't set refresh rate to 60Hz!"</span><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>   <span class="c">/* gfx interpolation requires 640x480</span></td></tr><tr><td class="number">33</td><td><span class="c">    */</span></td></tr><tr><td class="number">34</td><td>   video-&gt;Bmp_eagle <span class="k3">=</span> <a href="http://www.allegro.cc/manual/create_bitmap_ex" target="_blank"><span class="a">create_bitmap_ex</span></a><span class="k2">(</span><span class="n">16</span>,<span class="n">640</span>,<span class="n">480</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">35</td><td>   surface_lim <span class="k3">=</span> <span class="k2">(</span><span class="k1">short</span> <span class="k3">*</span><span class="k2">)</span>video-&gt;Bmp_eagle-&gt;line<span class="k2">[</span><span class="n">0</span><span class="k2">]</span><span class="k2">;</span></td></tr><tr><td class="number">36</td><td>   </td></tr><tr><td class="number">37</td><td>   <span class="c">/* reset video context</span></td></tr><tr><td class="number">38</td><td><span class="c">    */</span></td></tr><tr><td class="number">39</td><td>   fps_display <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span></td></tr><tr><td class="number">40</td><td>   reset_xyblit<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">41</td><td>   ppu_select_palette<span class="k2">(</span><span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">42</td><td>   <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">43</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>

- I use a config file, where the user can specify a gfx mode and a resolution. I gathered all those variables into a structure. </p><p><i>video-&gt;gfx_card</i> selects a video mode, even with the poor &quot;card&quot; label though, since it&#39;s not a card anyway.<br /><i>video-&gt;vx,video-&gt;vy</i> defines the size of the screen, like 640 480.</p><p>- The other stuff does not affect the gfx, except for the 16-bit mode indexed by a palette array.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Zepper)</author>
		<pubDate>Sun, 10 Jun 2007 04:21:44 +0000</pubDate>
	</item>
</rss>
