<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Smooth animation when using fixed time step</title>
		<link>http://www.allegro.cc/forums/view/613038</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Tue, 30 Jul 2013 07:17:07 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Hello, I&#39;m trying to implement the <a href="http://gafferongames.com/game-physics/fix-your-timestep./">game loop</a> where the physics is independent from rendering but my animation isn&#39;t as smooth as I would like and seems to be jumpy. Here is my code:</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="c">// alpha is used for interpolation</span>
<span class="number">  2</span><span class="c">// counter_old_time is to do with displaying the fps</span>
<span class="number">  3</span><span class="k1">double</span> alpha <span class="k3">=</span> <span class="n">0</span>, counter_old_time <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  4</span><span class="k1">double</span> accumulator <span class="k3">=</span> <span class="n">0</span>, delta_time <span class="k3">=</span> <span class="n">0</span>, current_time <span class="k3">=</span> <span class="n">0</span>, previous_time <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  5</span><span class="k1">unsigned</span> frame_counter <span class="k3">=</span> <span class="n">0</span>, current_fps <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> <span class="c">// also used for displaying the fps</span>
<span class="number">  6</span><span class="k1">const</span> <span class="k1">unsigned</span> physics_rate <span class="k3">=</span> <span class="n">40</span>, max_step_count <span class="k3">=</span> <span class="n">5</span><span class="k2">;</span>
<span class="number">  7</span>
<span class="number">  8</span><span class="c">// information about the magic ball (position and velocity)</span>
<span class="number">  9</span><span class="k1">int</span> old_pos_x <span class="k3">=</span> <span class="n">100</span>, new_pos_x <span class="k3">=</span> <span class="n">100</span>, render_pos_x <span class="k3">=</span> <span class="n">100</span>, velocity_x <span class="k3">=</span> <span class="n">60</span><span class="k2">;</span>
<span class="number"> 10</span>
<span class="number"> 11</span><span class="k1">const</span> <span class="k1">double</span>
<span class="number"> 12</span>    step_duration       <span class="k3">=</span> <span class="n">1</span>.<span class="n">0</span> <span class="k3">/</span> <span class="n">40</span>.<span class="n">0</span>,
<span class="number"> 13</span>    accumulator_max     <span class="k3">=</span> step_duration <span class="k3">*</span> <span class="n">5</span><span class="k2">;</span>
<span class="number"> 14</span>
<span class="number"> 15</span>previous_time <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_get_time"><span class="a">al_get_time</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 16</span>
<span class="number"> 17</span><span class="k1">while</span><span class="k2">(</span><span class="k1">true</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 18</span>    current_time <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_get_time"><span class="a">al_get_time</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 19</span>    delta_time <span class="k3">=</span> current_time <span class="k3">-</span> previous_time<span class="k2">;</span>
<span class="number"> 20</span>    previous_time <span class="k3">=</span> current_time<span class="k2">;</span>
<span class="number"> 21</span>    accumulator <span class="k3">+</span><span class="k3">=</span> delta_time<span class="k2">;</span>
<span class="number"> 22</span>
<span class="number"> 23</span>    <span class="k1">if</span><span class="k2">(</span>accumulator <span class="k3">&gt;</span> accumulator_max<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 24</span>        accumulator <span class="k3">=</span> accumulator_max<span class="k2">;</span>
<span class="number"> 25</span>    <span class="k2">}</span>
<span class="number"> 26</span>
<span class="number"> 27</span>    <span class="k1">while</span><span class="k2">(</span>accumulator <span class="k3">&gt;</span><span class="k3">=</span> step_duration<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 28</span>        <span class="k1">if</span><span class="k2">(</span>new_pos_x <span class="k3">&gt;</span> <span class="n">1330</span><span class="k2">)</span> velocity_x <span class="k3">=</span> <span class="k3">-</span><span class="n">15</span><span class="k2">;</span>
<span class="number"> 29</span>        <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>new_pos_x <span class="k3">&lt;</span> <span class="n">70</span><span class="k2">)</span> velocity_x <span class="k3">=</span> <span class="n">15</span><span class="k2">;</span>
<span class="number"> 30</span>
<span class="number"> 31</span>        old_pos_x <span class="k3">=</span> new_pos_x<span class="k2">;</span>
<span class="number"> 32</span>        new_pos_x <span class="k3">+</span><span class="k3">=</span> velocity_x<span class="k2">;</span>
<span class="number"> 33</span>        accumulator <span class="k3">-</span><span class="k3">=</span> step_duration<span class="k2">;</span>
<span class="number"> 34</span>    <span class="k2">}</span>
<span class="number"> 35</span>
<span class="number"> 36</span>    alpha <span class="k3">=</span> accumulator <span class="k3">/</span> <span class="k1">static_cast</span><span class="k3">&lt;</span>double&gt;<span class="k2">(</span>step_duration<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 37</span>    render_pos_x <span class="k3">=</span> old_pos_x <span class="k3">+</span> <span class="k2">(</span>new_pos_x <span class="k3">-</span> old_pos_x<span class="k2">)</span> <span class="k3">*</span> alpha<span class="k2">;</span>
<span class="number"> 38</span>
<span class="number"> 39</span>    <a href="http://www.allegro.cc/manual/al_clear_to_color"><span class="a">al_clear_to_color</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_map_rgb"><span class="a">al_map_rgb</span></a><span class="k2">(</span><span class="n">20</span>, <span class="n">20</span>, <span class="n">40</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span> <span class="c">// clears the screen</span>
<span class="number"> 40</span>    <a href="http://www.allegro.cc/manual/al_draw_textf"><span class="a">al_draw_textf</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/font"><span class="a">font</span></a>, <a href="http://www.allegro.cc/manual/al_map_rgb"><span class="a">al_map_rgb</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="n">20</span>, <span class="n">20</span>, <span class="n">0</span>, <span class="s">"current_fps: %i"</span>, current_fps<span class="k2">)</span><span class="k2">;</span> <span class="c">// print fps</span>
<span class="number"> 41</span>    <a href="http://www.allegro.cc/manual/al_draw_filled_circle"><span class="a">al_draw_filled_circle</span></a><span class="k2">(</span>render_pos_x, <span class="n">400</span>, <span class="n">15</span>, <a href="http://www.allegro.cc/manual/al_map_rgb"><span class="a">al_map_rgb</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> <span class="c">// draw circle</span>
<span class="number"> 42</span>    <span class="c">// I've added this to test how the program will behave when rendering takes</span>
<span class="number"> 43</span>    <span class="c">// considerably longer than updating the game.</span>
<span class="number"> 44</span>    <a href="http://www.allegro.cc/manual/al_rest"><span class="a">al_rest</span></a><span class="k2">(</span><span class="n">0</span>.<span class="n">008</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 45</span>    <a href="http://www.allegro.cc/manual/al_flip_display"><span class="a">al_flip_display</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="c">// swaps the buffers</span>
<span class="number"> 46</span>
<span class="number"> 47</span>    frame_counter<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span>
<span class="number"> 48</span>
<span class="number"> 49</span>    <span class="k1">if</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_get_time"><span class="a">al_get_time</span></a><span class="k2">(</span><span class="k2">)</span> <span class="k3">-</span> counter_old_time <span class="k3">&gt;</span><span class="k3">=</span> <span class="n">1</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 50</span>        current_fps <span class="k3">=</span> frame_counter<span class="k2">;</span>
<span class="number"> 51</span>        frame_counter <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 52</span>        counter_old_time <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_get_time"><span class="a">al_get_time</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 53</span>    <span class="k2">}</span>
<span class="number"> 54</span><span class="k2">}</span>
</div></div><p>

On line 44, I&#39;ve added a rest because I want to see how the code behaves when a lot of rendering is involved. If I remove it, the animation is smooth but I&#39;m not happy with that since that&#39;s just hoping for the best. On my computer, the frame rate is around 125 and the animation is still jumpy. I&#39;ve been trying to fix this for a week and have had no luck so I&#39;d be very grateful if someone can help me. Thank you!</p><p>Edit: I added the following code to work out the actual velocity (pixels per second) of the ball each time the ball is rendered and surprisingly it&#39;s not constant so I&#39;m guessing that&#39;s the issue. I&#39;m not sure why it&#39;s not constant.</p><div class="source-code snippet"><div class="inner"><pre>alpha <span class="k3">=</span> accumulator <span class="k3">/</span> <span class="k1">static_cast</span><span class="k3">&lt;</span>double&gt;<span class="k2">(</span>step_duration<span class="k2">)</span><span class="k2">;</span>
render_pos_x <span class="k3">=</span> old_pos_x <span class="k3">+</span> <span class="k2">(</span>new_pos_x <span class="k3">-</span> old_pos_x<span class="k2">)</span> <span class="k3">*</span> alpha<span class="k2">;</span>
cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="k2">(</span>render_pos_x <span class="k3">-</span> old_render_pos<span class="k2">)</span> <span class="k3">/</span> delta_time <span class="k3">&lt;</span><span class="k3">&lt;</span> endl<span class="k2">;</span>
old_render_pos <span class="k3">=</span> render_pos_x<span class="k2">;</span>
</pre></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Sythical)</author>
		<pubDate>Sun, 28 Jul 2013 11:00:56 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I don&#39;t know the answer to your question... but instead I converted your example to the interpolation algorithm I tend to use. It <i>seems</i> to me that my way looks smoother, but that might be my brain lying to me. I didn&#39;t feel like setting up a double blind experiment to test <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" />.</p><p>Also... it looks a lot smoother if you use vsync, at least on my computer. If you&#39;re on Linux, uncomment the <span class="source-code"><a href="http://www.allegro.cc/manual/al_wait_for_vsync"><span class="a">al_wait_for_vsync</span></a></span> line. If you&#39;re on Windows, uncomment <span class="source-code"><a href="http://www.allegro.cc/manual/al_set_new_display_option"><span class="a">al_set_new_display_option</span></a><span class="k2">(</span>ALLEGRO_VSYNC...<span class="k2">)</span></span> line. The fact that&#39;s its different is probably an Allegro bug.</p><p>Here&#39;s your code (with added functions to make it run. I also slowed down the ball a bit.):
</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="p">#include &lt;allegro5/allegro.h&gt;</span>
<span class="number">  2</span><span class="p">#include &lt;allegro5/allegro_primitives.h&gt;</span>
<span class="number">  3</span><span class="p">#include &lt;allegro5/allegro_font.h&gt;</span>
<span class="number">  4</span>
<span class="number">  5</span><span class="k1">int</span> main<span class="k2">(</span><span class="k2">)</span>
<span class="number">  6</span><span class="k2">{</span>
<span class="number">  7</span>  <a href="http://www.allegro.cc/manual/al_init"><span class="a">al_init</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  8</span>  <a href="http://www.allegro.cc/manual/al_init_primitives_addon"><span class="a">al_init_primitives_addon</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  9</span>  <a href="http://www.allegro.cc/manual/al_init_font_addon"><span class="a">al_init_font_addon</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 10</span>  <span class="k1">auto</span> <a href="http://www.allegro.cc/manual/font"><span class="a">font</span></a> <span class="k3">=</span> al_create_builtin_font<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 11</span>  
<span class="number"> 12</span>  <span class="c">//al_set_new_display_option(ALLEGRO_VSYNC, ALLEGRO_REQUIRE, 1); // For Windows</span>
<span class="number"> 13</span>  <span class="k1">auto</span> d <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_display"><span class="a">al_create_display</span></a><span class="k2">(</span><span class="n">800</span>, <span class="n">600</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 14</span>  
<span class="number"> 15</span>  <span class="c">// alpha is used for interpolation</span>
<span class="number"> 16</span>  <span class="c">// counter_old_time is to do with displaying the fps</span>
<span class="number"> 17</span>  <span class="k1">double</span> alpha <span class="k3">=</span> <span class="n">0</span>, counter_old_time <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 18</span>  <span class="k1">double</span> accumulator <span class="k3">=</span> <span class="n">0</span>, delta_time <span class="k3">=</span> <span class="n">0</span>, current_time <span class="k3">=</span> <span class="n">0</span>, previous_time <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 19</span>  <span class="k1">unsigned</span> frame_counter <span class="k3">=</span> <span class="n">0</span>, current_fps <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> <span class="c">// also used for displaying the fps</span>
<span class="number"> 20</span>  <span class="k1">const</span> <span class="k1">unsigned</span> physics_rate <span class="k3">=</span> <span class="n">40</span>, max_step_count <span class="k3">=</span> <span class="n">5</span><span class="k2">;</span>
<span class="number"> 21</span>
<span class="number"> 22</span>  <span class="c">// information about the magic ball (position and velocity)</span>
<span class="number"> 23</span>  <span class="k1">int</span> old_pos_x <span class="k3">=</span> <span class="n">100</span>, new_pos_x <span class="k3">=</span> <span class="n">100</span>, render_pos_x <span class="k3">=</span> <span class="n">100</span>, velocity_x <span class="k3">=</span> <span class="n">10</span><span class="k2">;</span>
<span class="number"> 24</span>
<span class="number"> 25</span>  <span class="k1">const</span> <span class="k1">double</span>
<span class="number"> 26</span>    step_duration       <span class="k3">=</span> <span class="n">1</span>.<span class="n">0</span> <span class="k3">/</span> <span class="n">40</span>.<span class="n">0</span>,
<span class="number"> 27</span>    accumulator_max     <span class="k3">=</span> step_duration <span class="k3">*</span> <span class="n">5</span><span class="k2">;</span>
<span class="number"> 28</span>
<span class="number"> 29</span>  previous_time <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_get_time"><span class="a">al_get_time</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 30</span>
<span class="number"> 31</span>  <span class="k1">while</span><span class="k2">(</span><span class="k1">true</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 32</span>    current_time <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_get_time"><span class="a">al_get_time</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 33</span>    delta_time <span class="k3">=</span> current_time <span class="k3">-</span> previous_time<span class="k2">;</span>
<span class="number"> 34</span>    previous_time <span class="k3">=</span> current_time<span class="k2">;</span>
<span class="number"> 35</span>    accumulator <span class="k3">+</span><span class="k3">=</span> delta_time<span class="k2">;</span>
<span class="number"> 36</span>
<span class="number"> 37</span>    <span class="k1">if</span><span class="k2">(</span>accumulator <span class="k3">&gt;</span> accumulator_max<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 38</span>      accumulator <span class="k3">=</span> accumulator_max<span class="k2">;</span>
<span class="number"> 39</span>    <span class="k2">}</span>
<span class="number"> 40</span>
<span class="number"> 41</span>    <span class="k1">while</span><span class="k2">(</span>accumulator <span class="k3">&gt;</span><span class="k3">=</span> step_duration<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 42</span>      <span class="k1">if</span><span class="k2">(</span>new_pos_x <span class="k3">&gt;</span> <a href="http://www.allegro.cc/manual/al_get_display_width"><span class="a">al_get_display_width</span></a><span class="k2">(</span>d<span class="k2">)</span> <span class="k3">-</span> <span class="n">70</span><span class="k2">)</span> velocity_x <span class="k3">=</span> <span class="k3">-</span><span class="n">10</span><span class="k2">;</span>
<span class="number"> 43</span>      <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>new_pos_x <span class="k3">&lt;</span> <span class="n">70</span><span class="k2">)</span> velocity_x <span class="k3">=</span> <span class="n">10</span><span class="k2">;</span>
<span class="number"> 44</span>
<span class="number"> 45</span>      old_pos_x <span class="k3">=</span> new_pos_x<span class="k2">;</span>
<span class="number"> 46</span>      new_pos_x <span class="k3">+</span><span class="k3">=</span> velocity_x<span class="k2">;</span>
<span class="number"> 47</span>      accumulator <span class="k3">-</span><span class="k3">=</span> step_duration<span class="k2">;</span>
<span class="number"> 48</span>    <span class="k2">}</span>
<span class="number"> 49</span>
<span class="number"> 50</span>    alpha <span class="k3">=</span> accumulator <span class="k3">/</span> <span class="k1">static_cast</span><span class="k3">&lt;</span>double&gt;<span class="k2">(</span>step_duration<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 51</span>    render_pos_x <span class="k3">=</span> old_pos_x <span class="k3">+</span> <span class="k2">(</span>new_pos_x <span class="k3">-</span> old_pos_x<span class="k2">)</span> <span class="k3">*</span> alpha<span class="k2">;</span>
<span class="number"> 52</span>
<span class="number"> 53</span>    <a href="http://www.allegro.cc/manual/al_clear_to_color"><span class="a">al_clear_to_color</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_map_rgb"><span class="a">al_map_rgb</span></a><span class="k2">(</span><span class="n">20</span>, <span class="n">20</span>, <span class="n">40</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span> <span class="c">// clears the screen</span>
<span class="number"> 54</span>    <a href="http://www.allegro.cc/manual/al_draw_textf"><span class="a">al_draw_textf</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/font"><span class="a">font</span></a>, <a href="http://www.allegro.cc/manual/al_map_rgb"><span class="a">al_map_rgb</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="n">20</span>, <span class="n">20</span>, <span class="n">0</span>, <span class="s">"current_fps: %i"</span>, current_fps<span class="k2">)</span><span class="k2">;</span> <span class="c">// print fps</span>
<span class="number"> 55</span>    <a href="http://www.allegro.cc/manual/al_draw_filled_circle"><span class="a">al_draw_filled_circle</span></a><span class="k2">(</span>render_pos_x, <span class="n">400</span>, <span class="n">15</span>, <a href="http://www.allegro.cc/manual/al_map_rgb"><span class="a">al_map_rgb</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> <span class="c">// draw circle</span>
<span class="number"> 56</span>    <span class="c">// I've added this to test how the program will behave when rendering takes</span>
<span class="number"> 57</span>    <span class="c">// considerably longer than updating the game.</span>
<span class="number"> 58</span>    <span class="c">//al_wait_for_vsync(); // For Linux</span>
<span class="number"> 59</span>    <a href="http://www.allegro.cc/manual/al_rest"><span class="a">al_rest</span></a><span class="k2">(</span><span class="n">0</span>.<span class="n">008</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 60</span>    <a href="http://www.allegro.cc/manual/al_flip_display"><span class="a">al_flip_display</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="c">// swaps the buffers</span>
<span class="number"> 61</span>
<span class="number"> 62</span>    frame_counter<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span>
<span class="number"> 63</span>
<span class="number"> 64</span>    <span class="k1">if</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_get_time"><span class="a">al_get_time</span></a><span class="k2">(</span><span class="k2">)</span> <span class="k3">-</span> counter_old_time <span class="k3">&gt;</span><span class="k3">=</span> <span class="n">1</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 65</span>      current_fps <span class="k3">=</span> frame_counter<span class="k2">;</span>
<span class="number"> 66</span>      frame_counter <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 67</span>      counter_old_time <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_get_time"><span class="a">al_get_time</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 68</span>    <span class="k2">}</span>
<span class="number"> 69</span>  <span class="k2">}</span>
<span class="number"> 70</span><span class="k2">}</span>
</div></div><p>
And here&#39;s mine:
</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="p">#include &lt;allegro5/allegro.h&gt;</span>
<span class="number">  2</span><span class="p">#include &lt;allegro5/allegro_primitives.h&gt;</span>
<span class="number">  3</span><span class="p">#include &lt;allegro5/allegro_font.h&gt;</span>
<span class="number">  4</span>
<span class="number">  5</span><span class="k1">int</span> main<span class="k2">(</span><span class="k2">)</span>
<span class="number">  6</span><span class="k2">{</span>
<span class="number">  7</span>  <a href="http://www.allegro.cc/manual/al_init"><span class="a">al_init</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  8</span>  <a href="http://www.allegro.cc/manual/al_init_primitives_addon"><span class="a">al_init_primitives_addon</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  9</span>  <a href="http://www.allegro.cc/manual/al_init_font_addon"><span class="a">al_init_font_addon</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 10</span>  <span class="k1">auto</span> <a href="http://www.allegro.cc/manual/font"><span class="a">font</span></a> <span class="k3">=</span> al_create_builtin_font<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 11</span>  
<span class="number"> 12</span>  <span class="c">//al_set_new_display_option(ALLEGRO_VSYNC, ALLEGRO_REQUIRE, 1); // For Windows</span>
<span class="number"> 13</span>  <span class="k1">auto</span> d <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_display"><span class="a">al_create_display</span></a><span class="k2">(</span><span class="n">800</span>, <span class="n">600</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 14</span>  
<span class="number"> 15</span>  <span class="k1">double</span> counter_old_time <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 16</span>  <span class="k1">unsigned</span> frame_counter <span class="k3">=</span> <span class="n">0</span>, current_fps <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> <span class="c">// also used for displaying the fps</span>
<span class="number"> 17</span>  <span class="k1">const</span> <span class="k1">unsigned</span> physics_rate <span class="k3">=</span> <span class="n">40</span>, max_step_count <span class="k3">=</span> <span class="n">5</span><span class="k2">;</span>
<span class="number"> 18</span>  <span class="k1">auto</span> dt <span class="k3">=</span> <span class="n">1</span>.<span class="n">0</span> <span class="k3">/</span> physics_rate<span class="k2">;</span>
<span class="number"> 19</span>  
<span class="number"> 20</span>  <span class="k1">auto</span> q <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_event_queue"><span class="a">al_create_event_queue</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 21</span>  <span class="k1">auto</span> t <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_timer"><span class="a">al_create_timer</span></a><span class="k2">(</span>dt<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 22</span>  <a href="http://www.allegro.cc/manual/al_register_event_source"><span class="a">al_register_event_source</span></a><span class="k2">(</span>q, <a href="http://www.allegro.cc/manual/al_get_timer_event_source"><span class="a">al_get_timer_event_source</span></a><span class="k2">(</span>t<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 23</span>  <a href="http://www.allegro.cc/manual/al_start_timer"><span class="a">al_start_timer</span></a><span class="k2">(</span>t<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 24</span>
<span class="number"> 25</span>  <span class="c">// information about the magic ball (position and velocity)</span>
<span class="number"> 26</span>  <span class="k1">int</span> old_pos_x <span class="k3">=</span> <span class="n">100</span>, new_pos_x <span class="k3">=</span> <span class="n">100</span>, render_pos_x <span class="k3">=</span> <span class="n">100</span>, velocity_x <span class="k3">=</span> <span class="n">10</span><span class="k2">;</span>
<span class="number"> 27</span>
<span class="number"> 28</span>  <span class="k1">float</span> game_time <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 29</span>  <span class="k1">float</span> offset <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_get_time"><span class="a">al_get_time</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 30</span>
<span class="number"> 31</span>  <span class="k1">while</span><span class="k2">(</span><span class="k1">true</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 32</span>    <span class="k1">int</span> steps <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 33</span>    <a href="http://www.allegro.cc/manual/ALLEGRO_EVENT"><span class="a">ALLEGRO_EVENT</span></a> e<span class="k2">;</span>
<span class="number"> 34</span>    
<span class="number"> 35</span>    <span class="k1">while</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_get_next_event"><span class="a">al_get_next_event</span></a><span class="k2">(</span>q, <span class="k3">&amp;</span>e<span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 36</span>      <span class="k1">if</span><span class="k2">(</span>e.type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_TIMER<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 37</span>        game_time <span class="k3">=</span> e.timer.count <span class="k3">*</span> dt<span class="k2">;</span>
<span class="number"> 38</span>        
<span class="number"> 39</span>        <span class="k1">if</span><span class="k2">(</span>new_pos_x <span class="k3">&gt;</span> <a href="http://www.allegro.cc/manual/al_get_display_width"><span class="a">al_get_display_width</span></a><span class="k2">(</span>d<span class="k2">)</span> <span class="k3">-</span> <span class="n">70</span><span class="k2">)</span> velocity_x <span class="k3">=</span> <span class="k3">-</span><span class="n">10</span><span class="k2">;</span>
<span class="number"> 40</span>        <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>new_pos_x <span class="k3">&lt;</span> <span class="n">70</span><span class="k2">)</span> velocity_x <span class="k3">=</span> <span class="n">10</span><span class="k2">;</span>
<span class="number"> 41</span>
<span class="number"> 42</span>        old_pos_x <span class="k3">=</span> new_pos_x<span class="k2">;</span>
<span class="number"> 43</span>        new_pos_x <span class="k3">+</span><span class="k3">=</span> velocity_x<span class="k2">;</span>
<span class="number"> 44</span>        
<span class="number"> 45</span>        steps<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span>
<span class="number"> 46</span>
<span class="number"> 47</span>        <span class="k1">if</span><span class="k2">(</span>steps <span class="k3">&gt;</span><span class="k3">=</span> max_step_count<span class="k2">)</span>
<span class="number"> 48</span>          <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 49</span>      <span class="k2">}</span>
<span class="number"> 50</span>    <span class="k2">}</span>
<span class="number"> 51</span>
<span class="number"> 52</span>    <span class="k1">float</span> alpha <span class="k3">=</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/al_get_time"><span class="a">al_get_time</span></a><span class="k2">(</span><span class="k2">)</span> <span class="k3">-</span> offset <span class="k3">-</span> game_time<span class="k2">)</span> <span class="k3">/</span> dt<span class="k2">;</span>
<span class="number"> 53</span>    render_pos_x <span class="k3">=</span> old_pos_x <span class="k3">+</span> <span class="k2">(</span>new_pos_x <span class="k3">-</span> old_pos_x<span class="k2">)</span> <span class="k3">*</span> alpha<span class="k2">;</span>
<span class="number"> 54</span>
<span class="number"> 55</span>    <a href="http://www.allegro.cc/manual/al_clear_to_color"><span class="a">al_clear_to_color</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_map_rgb"><span class="a">al_map_rgb</span></a><span class="k2">(</span><span class="n">20</span>, <span class="n">20</span>, <span class="n">40</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span> <span class="c">// clears the screen</span>
<span class="number"> 56</span>    <a href="http://www.allegro.cc/manual/al_draw_textf"><span class="a">al_draw_textf</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/font"><span class="a">font</span></a>, <a href="http://www.allegro.cc/manual/al_map_rgb"><span class="a">al_map_rgb</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="n">20</span>, <span class="n">20</span>, <span class="n">0</span>, <span class="s">"current_fps: %i"</span>, current_fps<span class="k2">)</span><span class="k2">;</span> <span class="c">// print fps</span>
<span class="number"> 57</span>    <a href="http://www.allegro.cc/manual/al_draw_filled_circle"><span class="a">al_draw_filled_circle</span></a><span class="k2">(</span>render_pos_x, <span class="n">400</span>, <span class="n">15</span>, <a href="http://www.allegro.cc/manual/al_map_rgb"><span class="a">al_map_rgb</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> <span class="c">// draw circle</span>
<span class="number"> 58</span>    <span class="c">// I've added this to test how the program will behave when rendering takes</span>
<span class="number"> 59</span>    <span class="c">// considerably longer than updating the game.</span>
<span class="number"> 60</span>    <span class="c">//al_wait_for_vsync(); // For Linux</span>
<span class="number"> 61</span>    <a href="http://www.allegro.cc/manual/al_rest"><span class="a">al_rest</span></a><span class="k2">(</span><span class="n">0</span>.<span class="n">008</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 62</span>    <a href="http://www.allegro.cc/manual/al_flip_display"><span class="a">al_flip_display</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="c">// swaps the buffers</span>
<span class="number"> 63</span>
<span class="number"> 64</span>    frame_counter<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span>
<span class="number"> 65</span>
<span class="number"> 66</span>    <span class="k1">if</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_get_time"><span class="a">al_get_time</span></a><span class="k2">(</span><span class="k2">)</span> <span class="k3">-</span> counter_old_time <span class="k3">&gt;</span><span class="k3">=</span> <span class="n">1</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 67</span>      current_fps <span class="k3">=</span> frame_counter<span class="k2">;</span>
<span class="number"> 68</span>      frame_counter <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 69</span>      counter_old_time <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_get_time"><span class="a">al_get_time</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 70</span>    <span class="k2">}</span>
<span class="number"> 71</span>  <span class="k2">}</span>
<span class="number"> 72</span><span class="k2">}</span>
</div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (SiegeLord)</author>
		<pubDate>Mon, 29 Jul 2013 17:27:10 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Hey SiegeLord, thank you for response. I tried both programs and they seem to be more or less identical on my computer. Vsync does make the animation a lot smoother so I&#39;ll start using that. I&#39;ve read that vsync doesn&#39;t work in windowed mode because updates are managed by the OS and the game itself has no control over when the screen updates. I read this when I was trying to figure out how to enable vsync in SDL.</p><p>I&#39;ve been searching for an article which talks about frame rates and refresh rates with game development in mind. In the games I normally play (mainly WoW), the frame rate usually varies a lot but the gameplay is still butter smooth and if I lock the fps to something that doesn&#39;t match my monitor&#39;s refresh rate, so locked at 70 or 50, the gameplay is still smooth. In my game however, variable frame rate and not matching the refresh rate makes a huge difference. Can someone please briefly explain some of the things that I need to keep in mind?</p><p>Thank you again <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Sythical)</author>
		<pubDate>Tue, 30 Jul 2013 02:48:23 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I don&#39;t see the point in drawing more often than the monitor refresh rate. Interpolation allows you to decouple your logic rate from the monitor refresh rate, while keeping things smooth. I have no trouble in enabling vsync in windowed applications on Linux or Windows.</p><p>I don&#39;t know what technique WoW uses to handle things (it&#39;s almost certainly is not delta timing though, given that it works even when FPS drops to single digits).
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (SiegeLord)</author>
		<pubDate>Tue, 30 Jul 2013 07:17:07 +0000</pubDate>
	</item>
</rss>
