<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>High CPU usage when flipping backbuffers on OpenGL display</title>
		<link>http://www.allegro.cc/forums/view/609631</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Sun, 26 Feb 2012 00:09:46 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Hey guys... I noticed some weird CPU usage while developing a project using an opengl window in allegro 5.0.5</p><p>Basically, the program was using ~15% cpu time (a core on some 60% usage since both machines I tested were quad-cores)</p><p>I removed all calls to the rest of my program and compiled this source 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="p">#include &lt;iostream&gt;</span>
<span class="number">   2</span><span class="p">#include &lt;allegro5/allegro.h&gt;</span>
<span class="number">   3</span><span class="p">#include &lt;memory&gt;</span>
<span class="number">   4</span><span class="c">//#include "Game.h"</span>
<span class="number">   5</span><span class="p">#include &lt;allegro5/allegro_primitives.h&gt;</span>
<span class="number">   6</span><span class="p">#include &lt;allegro5/allegro_font.h&gt;</span>
<span class="number">   7</span><span class="p">#include &lt;allegro5/allegro_ttf.h&gt;</span>
<span class="number">   8</span><span class="p">#include &lt;allegro5/allegro_image.h&gt;</span>
<span class="number">   9</span>
<span class="number">  10</span><span class="k1">const</span> <span class="k1">int</span> FPS <span class="k3">=</span> <span class="n">60</span><span class="k2">;</span>
<span class="number">  11</span>
<span class="number">  12</span><span class="k1">bool</span> initializeAllegro<span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_DISPLAY"><span class="a">ALLEGRO_DISPLAY</span></a><span class="k3">*</span><span class="k3">&amp;</span> display, <a href="http://www.allegro.cc/manual/ALLEGRO_EVENT_QUEUE"><span class="a">ALLEGRO_EVENT_QUEUE</span></a><span class="k3">*</span><span class="k3">&amp;</span> queue, <a href="http://www.allegro.cc/manual/ALLEGRO_TIMER"><span class="a">ALLEGRO_TIMER</span></a><span class="k3">*</span><span class="k3">&amp;</span> timer<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  13</span>  <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</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="k1">return</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number">  14</span>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/al_init_image_addon"><span class="a">al_init_image_addon</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  15</span>    std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"Error initializing image addon!\n"</span><span class="k2">;</span>
<span class="number">  16</span>    <span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number">  17</span>  <span class="k2">}</span>
<span class="number">  18</span>  <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/al_install_keyboard"><span class="a">al_install_keyboard</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">{</span>
<span class="number">  19</span>    std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"Error installing keyboard!\n"</span><span class="k2">;</span>
<span class="number">  20</span>    <span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number">  21</span>  <span class="k2">}</span>
<span class="number">  22</span>  <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/al_install_mouse"><span class="a">al_install_mouse</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">{</span>
<span class="number">  23</span>    std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"Error installing mouse!\n"</span><span class="k2">;</span>
<span class="number">  24</span>    <span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number">  25</span>  <span class="k2">}</span> 
<span class="number">  26</span>  <a href="http://www.allegro.cc/manual/al_set_new_display_flags"><span class="a">al_set_new_display_flags</span></a><span class="k2">(</span>ALLEGRO_OPENGL<span class="k2">)</span><span class="k2">;</span>
<span class="number">  27</span>  <span class="c">//display = al_create_display(Game::WIDTH, Game::HEIGHT);</span>
<span class="number">  28</span>  display <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">800</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  29</span>  <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>display<span class="k2">)</span><span class="k2">{</span>
<span class="number">  30</span>    std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"Error creating display!\n"</span><span class="k2">;</span>
<span class="number">  31</span>    <span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number">  32</span>  <span class="k2">}</span>
<span class="number">  33</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">  34</span>  <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/al_init_ttf_addon"><span class="a">al_init_ttf_addon</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">{</span>
<span class="number">  35</span>    std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"Error initializing TTF!\n"</span><span class="k2">;</span>
<span class="number">  36</span>    <span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number">  37</span>  <span class="k2">}</span>
<span class="number">  38</span>  <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</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="k2">{</span>
<span class="number">  39</span>    std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"Error initializing primitives!\n"</span><span class="k2">;</span>
<span class="number">  40</span>    <span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number">  41</span>  <span class="k2">}</span>
<span class="number">  42</span>  queue <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">  43</span>  <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>queue<span class="k2">)</span><span class="k2">{</span>
<span class="number">  44</span>    std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"Error creating queue!\n"</span><span class="k2">;</span>
<span class="number">  45</span>    <span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number">  46</span>  <span class="k2">}</span>
<span class="number">  47</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>queue, <a href="http://www.allegro.cc/manual/al_get_display_event_source"><span class="a">al_get_display_event_source</span></a><span class="k2">(</span>display<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  48</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>queue, <a href="http://www.allegro.cc/manual/al_get_keyboard_event_source"><span class="a">al_get_keyboard_event_source</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  49</span><span class="c">//  if (al_hide_mouse_cursor(display) &amp;&amp; al_grab_mouse(display)) {</span>
<span class="number">  50</span><span class="c">//    al_register_event_source(queue, al_get_mouse_event_source());</span>
<span class="number">  51</span><span class="c">//  } else al_show_mouse_cursor(display);</span>
<span class="number">  52</span>  timer <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><span class="n">1</span>.<span class="n">0</span><span class="k3">/</span>FPS<span class="k2">)</span><span class="k2">;</span>
<span class="number">  53</span>  <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>timer<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  54</span>    std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"Error creating timer!\n"</span><span class="k2">;</span>
<span class="number">  55</span>    <span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number">  56</span>  <span class="k2">}</span>
<span class="number">  57</span>  <a href="http://www.allegro.cc/manual/al_start_timer"><span class="a">al_start_timer</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">;</span>
<span class="number">  58</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>queue, <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>timer<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  59</span>  <span class="k2">{</span>
<span class="number">  60</span>    ALLEGRO_PATH<span class="k3">*</span> p <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_get_standard_path"><span class="a">al_get_standard_path</span></a><span class="k2">(</span>ALLEGRO_RESOURCES_PATH<span class="k2">)</span><span class="k2">;</span>
<span class="number">  61</span>    <a href="http://www.allegro.cc/manual/al_set_path_filename"><span class="a">al_set_path_filename</span></a><span class="k2">(</span>p, <span class="s">""</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  62</span>    <a href="http://www.allegro.cc/manual/al_append_path_component"><span class="a">al_append_path_component</span></a><span class="k2">(</span>p, <span class="s">"data"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  63</span>    <a href="http://www.allegro.cc/manual/al_make_path_canonical"><span class="a">al_make_path_canonical</span></a><span class="k2">(</span>p<span class="k2">)</span><span class="k2">;</span>
<span class="number">  64</span><span class="c">//    std::cout &lt;&lt; al_path_cstr(p, '/');</span>
<span class="number">  65</span>    <a href="http://www.allegro.cc/manual/al_change_directory"><span class="a">al_change_directory</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_path_cstr"><span class="a">al_path_cstr</span></a><span class="k2">(</span>p, <span class="s">'/'</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  66</span>    <a href="http://www.allegro.cc/manual/al_destroy_path"><span class="a">al_destroy_path</span></a><span class="k2">(</span>p<span class="k2">)</span><span class="k2">;</span>
<span class="number">  67</span>  <span class="k2">}</span>
<span class="number">  68</span>  <span class="k1">return</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number">  69</span><span class="k2">}</span>
<span class="number">  70</span>
<span class="number">  71</span><span class="k1">int</span> main<span class="k2">(</span><span class="k2">)</span><span class="k2">{</span>
<span class="number">  72</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_DISPLAY"><span class="a">ALLEGRO_DISPLAY</span></a><span class="k3">*</span> display <span class="k3">=</span> nullptr<span class="k2">;</span>
<span class="number">  73</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_EVENT_QUEUE"><span class="a">ALLEGRO_EVENT_QUEUE</span></a><span class="k3">*</span> queue <span class="k3">=</span> nullptr<span class="k2">;</span>
<span class="number">  74</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_TIMER"><span class="a">ALLEGRO_TIMER</span></a><span class="k3">*</span> timer <span class="k3">=</span> nullptr<span class="k2">;</span>
<span class="number">  75</span>  <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>initializeAllegro<span class="k2">(</span>display, queue, timer<span class="k2">)</span><span class="k2">)</span><span class="k2">{</span>
<span class="number">  76</span>    std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"Error during allegro initialization!\n"</span><span class="k2">;</span>
<span class="number">  77</span>    <a href="http://www.allegro.cc/manual/al_rest"><span class="a">al_rest</span></a><span class="k2">(</span><span class="n">10</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  78</span>    <span class="k1">return</span> <span class="n">1</span><span class="k2">;</span>
<span class="number">  79</span>  <span class="k2">}</span>
<span class="number">  80</span><span class="c">//  auto game = std::make_shared&lt;Game&gt;();</span>
<span class="number">  81</span>  <span class="k1">bool</span> cont <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number">  82</span>  <span class="k1">bool</span> redraw <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number">  83</span>  <span class="k1">while</span> <span class="k2">(</span>cont
<span class="number">  84</span>    <span class="c">//&amp;&amp; !game-&gt;isOver()</span>
<span class="number">  85</span>    <span class="k2">)</span><span class="k2">{</span>
<span class="number">  86</span>    <a href="http://www.allegro.cc/manual/ALLEGRO_EVENT"><span class="a">ALLEGRO_EVENT</span></a> ev<span class="k2">;</span>
<span class="number">  87</span>    <a href="http://www.allegro.cc/manual/al_wait_for_event"><span class="a">al_wait_for_event</span></a><span class="k2">(</span>queue, <span class="k3">&amp;</span>ev<span class="k2">)</span><span class="k2">;</span>
<span class="number">  88</span>    <span class="k1">const</span> <a href="http://www.allegro.cc/manual/ALLEGRO_EVENT_TYPE"><span class="a">ALLEGRO_EVENT_TYPE</span></a> type <span class="k3">=</span> ev.type<span class="k2">;</span>
<span class="number">  89</span>    <span class="k1">switch</span><span class="k2">(</span>type<span class="k2">)</span><span class="k2">{</span>
<span class="number">  90</span>    <span class="k1">case</span> ALLEGRO_EVENT_DISPLAY_CLOSE:
<span class="number">  91</span>      cont <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number">  92</span>      <span class="k1">break</span><span class="k2">;</span>
<span class="number">  93</span>    <span class="k1">case</span> ALLEGRO_EVENT_TIMER:
<span class="number">  94</span>      <span class="c">//game-&gt;step();</span>
<span class="number">  95</span>      redraw <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number">  96</span>      <span class="k1">break</span><span class="k2">;</span>
<span class="number">  97</span>    <span class="k1">case</span> ALLEGRO_EVENT_MOUSE_AXES:
<span class="number">  98</span><span class="c">//      al_set_mouse_xy(display, Game::WIDTH/2.0f, Game::HEIGHT/2.0f);</span>
<span class="number">  99</span>    default:
<span class="number"> 100</span>      <span class="c">//game-&gt;onEvent(ev);</span>
<span class="number"> 101</span>      <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 102</span>    <span class="k2">}</span>
<span class="number"> 103</span>    <span class="k1">if</span> <span class="k2">(</span>redraw <span class="k3">&amp;</span><span class="k3">&amp;</span> al_event_queue_is_empty<span class="k2">(</span>queue<span class="k2">)</span><span class="k2">)</span><span class="k2">{</span>
<span class="number"> 104</span>      redraw <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 105</span>      <span class="c">//game-&gt;draw();</span>
<span class="number"> 106</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="number"> 107</span>    <span class="k2">}</span>
<span class="number"> 108</span>  <span class="k2">}</span>
<span class="number"> 109</span>
<span class="number"> 110</span>  <a href="http://www.allegro.cc/manual/al_destroy_event_queue"><span class="a">al_destroy_event_queue</span></a><span class="k2">(</span>queue<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 111</span>  <a href="http://www.allegro.cc/manual/al_destroy_timer"><span class="a">al_destroy_timer</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 112</span>  <a href="http://www.allegro.cc/manual/al_uninstall_keyboard"><span class="a">al_uninstall_keyboard</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 113</span>  <a href="http://www.allegro.cc/manual/al_uninstall_mouse"><span class="a">al_uninstall_mouse</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 114</span>  <a href="http://www.allegro.cc/manual/al_destroy_display"><span class="a">al_destroy_display</span></a><span class="k2">(</span>display<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 115</span>  <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 116</span><span class="k2">}</span>
</div></div><p>

windows binary: <a href="http://www.allegro.cc/files/attachment/605652">http://www.allegro.cc/files/attachment/605652</a><br />allegro dll for convenience: <a href="http://www.allegro.cc/files/attachment/605653">http://www.allegro.cc/files/attachment/605653</a></p><p>Still uses ~15% cpu on both machines I tested (both quad-cores, one with a GeForce 9800 GTX and one with a 430). Tried updating the graphics drivers on the 430 and running the program for about 20 minutes, but nothing changed.</p><p>Either commenting out al_flip_display(); (line 106) or al_set_new_display_flags(ALLEGRO_OPENGL); (line 26) made cpu usage plummet down to 0%
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (titonbrujah)</author>
		<pubDate>Sat, 25 Feb 2012 22:53:54 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I have always had this problem on my laptop for some reason. Have you tried toggling vsync on / off? That&#39;s what solved it on my laptop. Well, I still do not get nearly as low a cpu usage as with D3D, but it helped.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (jmasterx)</author>
		<pubDate>Sat, 25 Feb 2012 23:16:50 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://">jmasterx</a> said:</div><div class="quote"><p>I have always had this problem on my laptop for some reason. Have you tried toggling vsync on / off? That&#39;s what solved it on my laptop. Well, I still do not get nearly as low a cpu usage as with D3D, but it helped.</p></div></div><p>

Indeed, adding al_set_new_display_option(ALLEGRO_VSYNC, 2, ALLEGRO_REQUIRE) (force vsync off) right before creating the display made cpu usage oscillate between 0% and 1% <img src="http://www.allegro.cc/forums/smileys/cheesy.gif" alt=":D" /></p><p>Still, I think this is something worth looking into... It&#39;s probably just some code not yielding the cpu while waiting for the vsync, but the game was running a bit choppy before this and it&#39;s much better now
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (titonbrujah)</author>
		<pubDate>Sat, 25 Feb 2012 23:25:36 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Allegro itself doesn&#39;t wait for vsync. It lets the video driver (or hardware) do it. So if there&#39;s a problem, its not something we can really fix.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Sat, 25 Feb 2012 23:40:38 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I had that problem a while ago with GeForce 560 Ti on Windows 7. Had to disable VSync by default and implement frame-limit. No tearing (that I can see), and performance is great.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Max Savenkov)</author>
		<pubDate>Sun, 26 Feb 2012 00:09:46 +0000</pubDate>
	</item>
</rss>
