<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>[A5] Need help with loading screens and multithreading </title>
		<link>http://www.allegro.cc/forums/view/611383</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Thu, 08 Nov 2012 05:00:44 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Hello all, I have questions regarding multithreading. I’ve tried for quite a while now to get a loading screen set-up. I think I’m really close to getting it to work but I can’t figure out what’s going wrong. </p><p>My idea for how it should work conceptually is like so:</p><p>Make a thread that will:<br />	sit idle till i need it<br />	deletes the old map <br />	loads the new one<br />	changes the player&#39;s stats as needed (loacation, etc...)<br />	repeat<br />	<br />while my main simply takes care of all the normal stuff: updating animations, drawing, input, etc...</p><p>My code mostly works. When my character enters a new area for the first time, the loading screen is displayed and the animation runs smoothly. When it’s done loading the new map is displayed but my game becomes extremely laggy and jumpy. My FPS counter stays at around 90, when I have it set to run at 60. When i attempt to move my character back through the door he came in the screen goes black and no animation is displayed. But the map does load and I can walk around but the game is still extremely laggy. When I attempt to go back through the door the loading screen shows, and plays smoothly.  </p><p>I’ve tried a lot of different things but I cannot figure this one out. Here’s the thread related code I have currently:</p><p>NOTE: I am using mappy to handle all the map loading stuff.<br />NOTE: The lines of &quot;.......&quot; in my code are simply areas of code that I deleted.</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="number">   2</span>
<span class="number">   3</span><span class="k1">void</span> <span class="k3">*</span>Load<span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_THREAD"><span class="a">ALLEGRO_THREAD</span></a> <span class="k3">*</span>thr, <span class="k1">void</span> <span class="k3">*</span>arg<span class="k2">)</span><span class="k2">;</span>
<span class="number">   4</span>
<span class="number">   5</span><span class="k1">int</span> main<span class="k2">(</span><span class="k1">int</span> argc, <span class="k1">char</span> <span class="k3">*</span><span class="k3">*</span>argv<span class="k2">)</span>
<span class="number">   6</span><span class="k2">{</span>
<span class="number">   7</span>  <span class="c">//==============================================</span>
<span class="number">   8</span>  <span class="c">//SHELL VARIABLES</span>
<span class="number">   9</span>  <span class="c">//==============================================</span>
<span class="number">  10</span>  <span class="k1">bool</span> done <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number">  11</span>  <span class="k1">bool</span> render <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number">  12</span>
<span class="number">  13</span>  <span class="k1">float</span> gameTime <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  14</span>  <span class="k1">int</span> frames <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  15</span>  <span class="k1">int</span> gameFPS <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  16</span>
<span class="number">  17</span>  <span class="c">//==============================================</span>
<span class="number">  18</span>  <span class="c">//PROJECT VARIABLES</span>
<span class="number">  19</span>  <span class="c">//==============================================</span>
<span class="number">  20</span>  SystemState Temp_State<span class="k2">;</span>
<span class="number">  21</span>    
<span class="number">  22</span>  SystemState Sys_State<span class="k2">;</span>
<span class="number">  23</span>  MapState Map_State<span class="k2">;</span>
<span class="number">  24</span>  
<span class="number">  25</span>  StateMachine State<span class="k2">(</span><span class="k3">&amp;</span>Map_State, <span class="k3">&amp;</span>Sys_State<span class="k2">)</span><span class="k2">;</span>
<span class="number">  26</span>
<span class="number">  27</span>  .................................................
<span class="number">  28</span>  
<span class="number">  29</span>  <span class="k1">char</span> MapName<span class="k2">[</span><span class="k2">]</span> <span class="k3">=</span> <span class="s">"10000.fmp"</span><span class="k2">;</span>
<span class="number">  30</span>
<span class="number">  31</span>  <span class="c">//==============================================</span>
<span class="number">  32</span>  <span class="c">//ALLEGRO VARIABLES</span>
<span class="number">  33</span>  <span class="c">//==============================================</span>
<span class="number">  34</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> NULL<span class="k2">;</span>
<span class="number">  35</span>  
<span class="number">  36</span>  .................................................
<span class="number">  37</span>  
<span class="number">  38</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_BITMAP"><span class="a">ALLEGRO_BITMAP</span></a> <span class="k3">*</span>LoadingImage<span class="k2">;</span>
<span class="number">  39</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_THREAD"><span class="a">ALLEGRO_THREAD</span></a> <span class="k3">*</span>Thread1<span class="k2">;</span>
<span class="number">  40</span>
<span class="number">  41</span>  <span class="c">//==============================================</span>
<span class="number">  42</span>  <span class="c">//ALLEGRO INIT FUNCTIONS</span>
<span class="number">  43</span>  <span class="c">//==============================================</span>
<span class="number">  44</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="c">//initialize Allegro</span>
<span class="number">  45</span>    <span class="k1">return</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number">  46</span>
<span class="number">  47</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>WIDTH, HEIGHT<span class="k2">)</span><span class="k2">;</span>      <span class="c">//create display object</span>
<span class="number">  48</span>
<span class="number">  49</span>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>display<span class="k2">)</span>                    <span class="c">//test display object</span>
<span class="number">  50</span>    <span class="k1">return</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number">  51</span>
<span class="number">  52</span>  <span class="c">//==============================================</span>
<span class="number">  53</span>  <span class="c">//ADDON INSTALL</span>
<span class="number">  54</span>  <span class="c">//==============================================</span>
<span class="number">  55</span>  .................................................
<span class="number">  56</span>
<span class="number">  57</span>
<span class="number">  58</span>  <span class="c">//==============================================</span>
<span class="number">  59</span>  <span class="c">//PROJECT INIT</span>
<span class="number">  60</span>  <span class="c">//==============================================</span>
<span class="number">  61</span>  .................................................
<span class="number">  62</span>  
<span class="number">  63</span>  <span class="k1">if</span><span class="k2">(</span>MapLoad<span class="k2">(</span>MapName, <span class="n">1</span><span class="k2">)</span><span class="k2">)</span>
<span class="number">  64</span>    <span class="k1">return</span> <span class="k3">-</span><span class="n">5</span><span class="k2">;</span>
<span class="number">  65</span>
<span class="number">  66</span>  Sys_State.Set_CurState<span class="k2">(</span>PLAYING<span class="k2">)</span><span class="k2">;</span>
<span class="number">  67</span>  Map_State.Set_MapState<span class="k2">(</span>EXPLORE<span class="k2">)</span><span class="k2">;</span>
<span class="number">  68</span>
<span class="number">  69</span>  LoadingImage <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_load_bitmap"><span class="a">al_load_bitmap</span></a><span class="k2">(</span><span class="s">"Loading_Screen.png"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  70</span>
<span class="number">  71</span>  .................................................
<span class="number">  72</span>
<span class="number">  73</span>  <span class="c">//==============================================</span>
<span class="number">  74</span>  <span class="c">//LOADING SCREEN INIT</span>
<span class="number">  75</span>  <span class="c">//==============================================</span>
<span class="number">  76</span>  Loading_bg Load_BG<span class="k2">(</span>LoadingInit<span class="k2">(</span>LoadingImage<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  77</span>
<span class="number">  78</span>  <span class="c">//==============================================</span>
<span class="number">  79</span>  <span class="c">//Thread data INIT</span>
<span class="number">  80</span>  <span class="c">//==============================================</span>
<span class="number">  81</span>  ThreadInfo Info<span class="k2">(</span><span class="k3">&amp;</span>State, <span class="k3">&amp;</span>Character<span class="k2">)</span><span class="k2">;</span>  
<span class="number">  82</span>
<span class="number">  83</span>  <span class="c">//==============================================</span>
<span class="number">  84</span>  <span class="c">//TIMER INIT AND STARTUP</span>
<span class="number">  85</span>  <span class="c">//==============================================</span>
<span class="number">  86</span>  .................................................
<span class="number">  87</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> <span class="n">60</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  88</span>
<span class="number">  89</span>  .................................................
<span class="number">  90</span>
<span class="number">  91</span>  Thread1 <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_thread"><span class="a">al_create_thread</span></a><span class="k2">(</span>Load, <span class="k3">&amp;</span>Info<span class="k2">)</span><span class="k2">;</span>
<span class="number">  92</span>  <a href="http://www.allegro.cc/manual/al_start_thread"><span class="a">al_start_thread</span></a><span class="k2">(</span>Thread1<span class="k2">)</span><span class="k2">;</span>
<span class="number">  93</span>
<span class="number">  94</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">  95</span>  gameTime <span class="k3">=</span> al_current_time<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  96</span>
<span class="number">  97</span>  <span class="k1">while</span><span class="k2">(</span><span class="k3">!</span>done<span class="k2">)</span>
<span class="number">  98</span>  <span class="k2">{</span>
<span class="number">  99</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"> 100</span>    
<span class="number"> 101</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>event_queue, <span class="k3">&amp;</span>ev<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 102</span>    <span class="c">//==============================================</span>
<span class="number"> 103</span>    <span class="c">//INPUT</span>
<span class="number"> 104</span>    <span class="c">//==============================================</span>
<span class="number"> 105</span>    <span class="k1">if</span><span class="k2">(</span>ev.type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_KEY_DOWN<span class="k2">)</span> 
<span class="number"> 106</span>    <span class="k2">{</span>
<span class="number"> 107</span>      .................................................  
<span class="number"> 108</span>    <span class="k2">}</span>
<span class="number"> 109</span>    <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>ev.type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_KEY_UP<span class="k2">)</span>
<span class="number"> 110</span>    <span class="k2">{</span>
<span class="number"> 111</span>      .................................................
<span class="number"> 112</span>    <span class="k2">}</span>
<span class="number"> 113</span>    <span class="c">//==============================================</span>
<span class="number"> 114</span>    <span class="c">//GAME UPDATE</span>
<span class="number"> 115</span>    <span class="c">//==============================================</span>
<span class="number"> 116</span>    <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>ev.type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_TIMER<span class="k2">)</span>
<span class="number"> 117</span>    <span class="k2">{</span>
<span class="number"> 118</span>      render <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 119</span>
<span class="number"> 120</span>      Temp_State.Set_CurState<span class="k2">(</span>Sys_State.Get_CurState<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 121</span>      
<span class="number"> 122</span>      <span class="k1">if</span><span class="k2">(</span>Temp_State.Get_CurState<span class="k2">(</span><span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> PLAYING<span class="k2">)</span>
<span class="number"> 123</span>      <span class="k2">{</span>
<span class="number"> 124</span>        .................................................
<span class="number"> 125</span>  
<span class="number"> 126</span>        <span class="k1">if</span><span class="k2">(</span>CheckForCollision<span class="k2">(</span>Character<span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> <span class="n">1</span><span class="k2">)</span>
<span class="number"> 127</span>        <span class="k2">{</span>
<span class="number"> 128</span>          <a href="http://www.allegro.cc/manual/al_lock_mutex"><span class="a">al_lock_mutex</span></a><span class="k2">(</span>Info.Get_Mutex<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 129</span>
<span class="number"> 130</span>          Sys_State.Set_CurState<span class="k2">(</span>LOADING<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 131</span>          <a href="http://www.allegro.cc/manual/al_broadcast_cond"><span class="a">al_broadcast_cond</span></a><span class="k2">(</span>Info.Get_Cond<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 132</span>
<span class="number"> 133</span>          <a href="http://www.allegro.cc/manual/al_unlock_mutex"><span class="a">al_unlock_mutex</span></a><span class="k2">(</span>Info.Get_Mutex<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 134</span>        <span class="k2">}</span>
<span class="number"> 135</span>
<span class="number"> 136</span>        <span class="c">//==============================================</span>
<span class="number"> 137</span>        <span class="c">//Update camera</span>
<span class="number"> 138</span>        <span class="c">//==============================================</span>
<span class="number"> 139</span>        .................................................
<span class="number"> 140</span>      <span class="k2">}</span>
<span class="number"> 141</span>      <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>Temp_State.Get_CurState<span class="k2">(</span><span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> LOADING<span class="k2">)</span>
<span class="number"> 142</span>      <span class="k2">{</span>
<span class="number"> 143</span>        <span class="c">//==============================================</span>
<span class="number"> 144</span>        <span class="c">//Update loading background animation</span>
<span class="number"> 145</span>        <span class="c">//==============================================</span>
<span class="number"> 146</span>        .................................................
<span class="number"> 147</span>      <span class="k2">}</span>
<span class="number"> 148</span>
<span class="number"> 149</span>      <span class="c">//UPDATE FPS===========</span>
<span class="number"> 150</span>      frames<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span>
<span class="number"> 151</span>      <span class="k1">if</span><span class="k2">(</span>al_current_time<span class="k2">(</span><span class="k2">)</span> <span class="k3">-</span> gameTime <span class="k3">&gt;</span><span class="k3">=</span> <span class="n">1</span><span class="k2">)</span>
<span class="number"> 152</span>      <span class="k2">{</span>
<span class="number"> 153</span>        gameTime <span class="k3">=</span> al_current_time<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 154</span>        gameFPS <span class="k3">=</span> frames<span class="k2">;</span>
<span class="number"> 155</span>        frames <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 156</span>      <span class="k2">}</span>
<span class="number"> 157</span>      <span class="c">//=====================</span>
<span class="number"> 158</span>    <span class="k2">}</span>
<span class="number"> 159</span>
<span class="number"> 160</span>    <span class="c">//==============================================</span>
<span class="number"> 161</span>    <span class="c">//RENDER</span>
<span class="number"> 162</span>    <span class="c">//==============================================</span>
<span class="number"> 163</span>    <span class="k1">if</span><span class="k2">(</span>render <span class="k3">&amp;</span><span class="k3">&amp;</span> <a href="http://www.allegro.cc/manual/al_is_event_queue_empty"><span class="a">al_is_event_queue_empty</span></a><span class="k2">(</span>event_queue<span class="k2">)</span><span class="k2">)</span>
<span class="number"> 164</span>    <span class="k2">{</span>
<span class="number"> 165</span>      render <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 166</span>
<span class="number"> 167</span>      <a href="http://www.allegro.cc/manual/al_lock_mutex"><span class="a">al_lock_mutex</span></a><span class="k2">(</span>Info.Get_Mutex<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 168</span>      Temp_State.Set_CurState<span class="k2">(</span>Sys_State.Get_CurState<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 169</span>      <a href="http://www.allegro.cc/manual/al_unlock_mutex"><span class="a">al_unlock_mutex</span></a><span class="k2">(</span>Info.Get_Mutex<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 170</span>
<span class="number"> 171</span>      <span class="k1">if</span><span class="k2">(</span>Temp_State.Get_CurState<span class="k2">(</span><span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> PLAYING<span class="k2">)</span>
<span class="number"> 172</span>      <span class="k2">{</span>
<span class="number"> 173</span>        <span class="c">//==============================================</span>
<span class="number"> 174</span>        <span class="c">//Draw the map etc..</span>
<span class="number"> 175</span>        <span class="c">//==============================================</span>
<span class="number"> 176</span>        .................................................
<span class="number"> 177</span>      <span class="k2">}</span>
<span class="number"> 178</span>      <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>Temp_State.Get_CurState<span class="k2">(</span><span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> LOADING<span class="k2">)</span>
<span class="number"> 179</span>      <span class="k2">{</span>
<span class="number"> 180</span>        <span class="c">//==============================================</span>
<span class="number"> 181</span>        <span class="c">//Draw the loading screen</span>
<span class="number"> 182</span>        <span class="c">//==============================================</span>
<span class="number"> 183</span>        .................................................
<span class="number"> 184</span>      <span class="k2">}</span>
<span class="number"> 185</span>      
<span class="number"> 186</span>      .................................................
<span class="number"> 187</span>        
<span class="number"> 188</span>      <span class="c">//FLIP BUFFERS========================</span>
<span class="number"> 189</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"> 190</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">0</span>,<span class="n">0</span>,<span class="n">0</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 191</span>    <span class="k2">}</span>
<span class="number"> 192</span>  <span class="k2">}</span>
<span class="number"> 193</span>  
<span class="number"> 194</span>  <a href="http://www.allegro.cc/manual/al_set_thread_should_stop"><span class="a">al_set_thread_should_stop</span></a><span class="k2">(</span>Thread1<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 195</span>  
<span class="number"> 196</span>  <span class="c">//==============================================</span>
<span class="number"> 197</span>  <span class="c">//DESTROY PROJECT OBJECTS</span>
<span class="number"> 198</span>  <span class="c">//==============================================</span>
<span class="number"> 199</span>  .................................................
<span class="number"> 200</span>  
<span class="number"> 201</span>  <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 202</span><span class="k2">}</span>
<span class="number"> 203</span>
<span class="number"> 204</span><span class="k1">void</span> <span class="k3">*</span>Load<span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_THREAD"><span class="a">ALLEGRO_THREAD</span></a> <span class="k3">*</span>thr,  <span class="k1">void</span> <span class="k3">*</span>arg<span class="k2">)</span>
<span class="number"> 205</span><span class="k2">{</span>
<span class="number"> 206</span>  ThreadInfo <span class="k3">*</span>Info <span class="k3">=</span> <span class="k2">(</span>ThreadInfo<span class="k3">*</span><span class="k2">)</span> arg<span class="k2">;</span>
<span class="number"> 207</span>
<span class="number"> 208</span>  <span class="k1">while</span><span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/al_get_thread_should_stop"><span class="a">al_get_thread_should_stop</span></a><span class="k2">(</span>thr<span class="k2">)</span><span class="k2">)</span>
<span class="number"> 209</span>  <span class="k2">{</span>
<span class="number"> 210</span>    <span class="k1">if</span><span class="k2">(</span>Info-&gt;Get_State<span class="k2">(</span><span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>Get_SysState<span class="k2">(</span><span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>Get_CurState<span class="k2">(</span><span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> LOADING<span class="k2">)</span>
<span class="number"> 211</span>    <span class="k2">{</span>
<span class="number"> 212</span>      <a href="http://www.allegro.cc/manual/al_lock_mutex"><span class="a">al_lock_mutex</span></a><span class="k2">(</span>Info-&gt;Get_Mutex<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 213</span>  
<span class="number"> 214</span>      Sprite <span class="k3">*</span>sprite <span class="k3">=</span> Info-&gt;Get_Player<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 215</span>      StateMachine <span class="k3">*</span>State <span class="k3">=</span> Info-&gt;Get_State<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 216</span>      BLKSTR <span class="k3">*</span>MapData <span class="k3">=</span> Info-&gt;Get_State<span class="k2">(</span><span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>Get_MapState<span class="k2">(</span><span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>Get_CurrBlock<span class="k2">(</span>sprite<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 217</span>  
<span class="number"> 218</span>      <a href="http://www.allegro.cc/manual/al_unlock_mutex"><span class="a">al_unlock_mutex</span></a><span class="k2">(</span>Info-&gt;Get_Mutex<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 219</span>
<span class="number"> 220</span>      LoadNewMap<span class="k2">(</span>sprite, MapData<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 221</span>
<span class="number"> 222</span>      <a href="http://www.allegro.cc/manual/al_lock_mutex"><span class="a">al_lock_mutex</span></a><span class="k2">(</span>Info-&gt;Get_Mutex<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 223</span>      State-&gt;Get_SysState<span class="k2">(</span><span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>Set_CurState<span class="k2">(</span>PLAYING<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 224</span>      <a href="http://www.allegro.cc/manual/al_unlock_mutex"><span class="a">al_unlock_mutex</span></a><span class="k2">(</span>Info-&gt;Get_Mutex<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 225</span>    <span class="k2">}</span>
<span class="number"> 226</span>  <span class="k2">}</span>
<span class="number"> 227</span>  <span class="k1">return</span> NULL<span class="k2">;</span>  
<span class="number"> 228</span><span class="k2">}</span>
</div></div><p>

If anyone would like to see any other parts of my code, ask. I hope there&#39;s just a stupid thing that missed in there. If anyone see&#39;s any potential logic errors in my code please tell me.</p><p>also, I&#39;m new to this multithreading stuff, so any pointers/tips with using them are welcomed. </p><p>Thanks for any and all help,<br />-Ryan
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (ryancoboy)</author>
		<pubDate>Tue, 06 Nov 2012 06:20:25 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>You can&#39;t access graphics stuff from two threads at the same time, or without releasing the display from one thread and claiming it in the other. I&#39;ve never tried this with Direct3D so I don&#39;t know if it works there, but you can do something like:</p><p>thread 1
</p><div class="source-code snippet"><div class="inner"><pre><a href="http://www.allegro.cc/manual/al_set_target_bitmap"><span class="a">al_set_target_bitmap</span></a><span class="k2">(</span>NULL<span class="k2">)</span><span class="k2">;</span> <span class="c">// release context</span>
<span class="c">// signal other thread it's ok to grab context</span>
</pre></div></div><p>

thread 2
</p><div class="source-code snippet"><div class="inner"><pre><span class="c">// receive signal from thread 1</span>
<a href="http://www.allegro.cc/manual/al_set_target_bitmap"><span class="a">al_set_target_bitmap</span></a><span class="k2">(</span>some_bitmap_or_backbuffer<span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>

Then when you&#39;re done do it in reverse.</p><p>But the problem here is, it may be pointless. If thread 1 can&#39;t do anything (drawing) while thread 2 is loading the level, it&#39;s not going to give you a speed boost and will just complicate your code. That may not be the case for you though, I don&#39;t know... threading is just pointless when both threads can&#39;t execute at the same time.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Trent Gamblin)</author>
		<pubDate>Tue, 06 Nov 2012 06:52:43 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>If LoadMap is creating ALLEGRO_BITMAP&#39;s and passing them to the main thread then that will cause the game to slow down a lot during rendering. Make sure you convert memory bitmaps to video on the main thread where you render stuff.</p><p>You can use al_convert_bitmap as long as the new bitmap flags are set up properly (the default is ok).
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">if</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/al_get_bitmap_flags"><span class="a">al_get_bitmap_flags</span></a><span class="k2">(</span>b<span class="k2">)</span> <span class="k3">&amp;</span> ALLEGRO_MEMORY_BITMAP<span class="k2">)</span><span class="k2">{</span>
  al_convert_bitmap<span class="k2">(</span>b<span class="k2">)</span><span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>

Converting to memory to video bitmap is relatively fast and only needs to be done once.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (kazzmir)</author>
		<pubDate>Tue, 06 Nov 2012 12:51:39 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>@kazzmir: Seems like that might be what&#39;s causing me problems. I&#39;ll check it out when i get home tonight. Thank you for pointing that out to me.</p><p>-Ryan
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (ryancoboy)</author>
		<pubDate>Wed, 07 Nov 2012 04:55:29 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I see now that my post doesn&#39;t have enough context, so for anyone else reading if you create an ALLEGRO_BITMAP in a thread that doesn&#39;t have a context set (because the target bitmap is NULL) then Allegro will create a memory bitmap by default.</p><p>Bitmaps created in threads that have a target bitmap set with a display will generally create a video bitmap (although you can change this by setting the new bitmap flags).
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (kazzmir)</author>
		<pubDate>Wed, 07 Nov 2012 04:58:53 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Sorry for the late reply (got caught up with family stuff last night). I just did some checks in my code and it turns out that the bitmaps that it is drawing after the first loading sequence are indeed memory bitmaps.   </p><p>Now my problem is how do I convert them to video bitmaps? I&#39;m using Allegro 5.0.5 at the moment. And it looks like the <span class="source-code">al_convert_bitmap<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></span> feature is only in version 5.1. Any advice? Should I just switch to using 5.1? I&#39;m not too deep into this project so switching now would be the best time, I think.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (ryancoboy)</author>
		<pubDate>Thu, 08 Nov 2012 03:51:03 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I think you can just call al_clone_bitmap then and destroy the old one.</p><div class="source-code snippet"><div class="inner"><pre><a href="http://www.allegro.cc/manual/ALLEGRO_BITMAP"><span class="a">ALLEGRO_BITMAP</span></a><span class="k3">*</span> video <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_clone_bitmap"><span class="a">al_clone_bitmap</span></a><span class="k2">(</span>b<span class="k2">)</span><span class="k2">;</span>
<a href="http://www.allegro.cc/manual/al_destroy_bitmap"><span class="a">al_destroy_bitmap</span></a><span class="k2">(</span>b<span class="k2">)</span><span class="k2">;</span>
b <span class="k3">=</span> video<span class="k2">;</span>
</pre></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (kazzmir)</author>
		<pubDate>Thu, 08 Nov 2012 04:04:05 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>@kazzmir: THANK YOU SO MUCH! That completely took away the lag/unresponsive problem. I&#39;ve never needed to convert bitmaps before so that was new to me. Thank you for explaining the converting process.</p><p>I&#39;ve got a new problem now but I&#39;ll try to hammer that out on my own.</p><p>Thanks again,<br />-Ryan
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (ryancoboy)</author>
		<pubDate>Thu, 08 Nov 2012 04:23:03 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Yes the difference between video and memory bitmaps was the most painful thing I had to get accustomed to when using A5.</p><p>You can read more about my experience here: <a href="http://www.allegro.cc/forums/thread/607477">http://www.allegro.cc/forums/thread/607477</a>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (kazzmir)</author>
		<pubDate>Thu, 08 Nov 2012 04:39:52 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>@kazzmir: That was a good read, thanks. I feel I&#39;m starting to understand this converting stuff a lot better now.</p><p>-Ryan
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (ryancoboy)</author>
		<pubDate>Thu, 08 Nov 2012 05:00:44 +0000</pubDate>
	</item>
</rss>
