<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>SLow running program</title>
		<link>http://www.allegro.cc/forums/view/591374</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Tue, 15 May 2007 12:45:23 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Hi there.</p><p>I&#39;ve been experimenting with a program that plots a number of points on the screen, which causes the effect of a cloud rising from the bottom to the top of the screen.</p><p>The program is listed below.  The programming is nowhere near perfect, however i&#39;ve run into a problem.  As soon as I use the set_palette command to get the palette from a background scrren that i&#39;m loading, the program runs at a snails pace.  If I remove the command, the program runs nice and quick.</p><p>The background screen is an 8 bit 800x600 screen.</p><p>Any ideas as to what could be causing this.</p><p>Thanks in advance.</p><p>//<br />//   Particle Experiment Program<br />//</p><p>#include &lt;allegro.h&gt;</p><p>// Declare Bitmaps<br />BITMAP *buffer1;<br />BITMAP *mainscreen;</p><p>PALLETE startup;</p><p>// Init graphics<br />int init_graphics()<br />{<br />    buffer1=create_bitmap(800,600);<br />    mainscreen=load_bitmap(&quot;background.pcx&quot;,startup);<br />    set_palette(startup);<br />}</p><p>// define structure for holding star particle details<br />// x,y = xy position<br />// dx,dy = x,y velocity<br />// col = current colour<br />struct{<br />       int enabled, x,y,dx,dy,col;<br />} stars[1000];</p><p>// Initialise star starting positions<br />int init_stars()<br />{<br />    srand( time(NULL) );</p><p>    int n;<br />    for (n=0; n&lt;=500;n++){<br />        stars[n].x=400;<br />        stars[n].y=500;<br />        stars[n].dx=0;<br />        stars[n].dy=0;<br />        stars[n].col=(n/2);<br />        }<br />}   </p><p>// Display rising cloud<br />int stars_rising_cloud()<br />{<br />    int n;<br />    // Update star positions<br />    for (n=0; n&lt;=500;n++){<br />        stars[n].x+=(rand()%13)-6;<br />        stars[n].y-=(rand()%3);     <br />    } <br />    // Put background screen on buffer first<br />    blit(mainscreen, buffer1, 0, 0, 0, 0, 800, 600); <br />    // Draw stars on buffer and then blit to scren<br />    for (n=0; n&lt;=500;n++){<br />        putpixel(buffer1, stars[n].x,stars[n].y,stars[n].col);    <br />    }    <br />    blit(buffer1, screen, 0, 0, 0, 0, buffer1-&gt;w, buffer1-&gt;h); <br />}</p><p>int main(void)<br />{<br />    int n;<br />   /* you should always do this at the start of Allegro programs */<br />   if (allegro_init() != 0)<br />      return 1;</p><p>   /* set up the keyboard handler */<br />   install_keyboard(); </p><p>   /* set a graphics mode */<br />   set_gfx_mode(GFX_AUTODETECT, 800, 600, 0, 0) != 0;<br />   /* set colour depth to 16 bits */<br />   set_color_depth(16);</p><p>   // Initialsie stuff<br />   init_graphics();<br />   init_stars();<br />   <br />   // Do stars_rising_cloud loop 700 times<br />   for (n=0; n&lt;=50;n++){<br />      stars_rising_cloud();<br />   }<br />   </p><p>   /* you must always release bitmaps before calling any input functions */<br />   release_screen();<br />   /* wait for a keypress */<br />   readkey();</p><p>   return 0;<br />}</p><p>END_OF_MAIN()
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (gary_ramsgate)</author>
		<pubDate>Sun, 13 May 2007 18:32:34 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>
set_palette can cause the program to wait for a fresh vertical blank interrupt before changing the colours which can halve your frame rate. However, unless your palette changes you only need to call it once <i>outside</i> your main loop.</p><p>Do not call the function inside your main loop! <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Richard Phipps)</author>
		<pubDate>Sun, 13 May 2007 19:09:11 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Also set the color depth before setting the gfx mode.</p><p>On another note, you&#39;re allocating 1000 stars, but only using 501. 1002 rand() calls may not be that fast, and 501 putpixels may not be fast either.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Kitty Cat)</author>
		<pubDate>Sun, 13 May 2007 20:23:34 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Blit is your problem.  It is slow.</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="k1">int</span> stars_rising_cloud<span class="k2">(</span><span class="k2">)</span></td></tr><tr><td class="number">2</td><td><span class="k2">{</span></td></tr><tr><td class="number">3</td><td><span class="k1">int</span> n<span class="k2">;</span></td></tr><tr><td class="number">4</td><td><span class="c">// Update star positions</span></td></tr><tr><td class="number">5</td><td><span class="k1">for</span> <span class="k2">(</span>n<span class="k3">=</span><span class="n">0</span><span class="k2">;</span> n<span class="k3">&lt;</span><span class="k3">=</span><span class="n">500</span><span class="k2">;</span>n<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span><span class="k2">{</span></td></tr><tr><td class="number">6</td><td>stars<span class="k2">[</span>n<span class="k2">]</span>.x<span class="k3">+</span><span class="k3">=</span><span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_637.html" target="_blank">rand</a><span class="k2">(</span><span class="k2">)</span>%<span class="n">13</span><span class="k2">)</span><span class="k3">-</span><span class="n">6</span><span class="k2">;</span></td></tr><tr><td class="number">7</td><td>stars<span class="k2">[</span>n<span class="k2">]</span>.y-<span class="k3">=</span><span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_637.html" target="_blank">rand</a><span class="k2">(</span><span class="k2">)</span>%<span class="n">3</span><span class="k2">)</span><span class="k2">;</span> </td></tr><tr><td class="number">8</td><td><span class="k2">}</span> </td></tr><tr><td class="number">9</td><td><span class="c">// Put background screen on buffer first</span></td></tr><tr><td class="number">10</td><td><span class="c">//blit(mainscreen, buffer1, 0, 0, 0, 0, 800, 600); </span></td></tr><tr><td class="number">11</td><td><span class="c">// Draw stars on buffer and then blit to scren</span></td></tr><tr><td class="number">12</td><td><span class="k1">for</span> <span class="k2">(</span>n<span class="k3">=</span><span class="n">0</span><span class="k2">;</span> n<span class="k3">&lt;</span><span class="k3">=</span><span class="n">500</span><span class="k2">;</span>n<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span><span class="k2">{</span></td></tr><tr><td class="number">13</td><td><a href="http://www.allegro.cc/manual/putpixel" target="_blank"><span class="a">putpixel</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/screen" target="_blank"><span class="a">screen</span></a>, stars<span class="k2">[</span>n<span class="k2">]</span>.x,stars<span class="k2">[</span>n<span class="k2">]</span>.y,stars<span class="k2">[</span>n<span class="k2">]</span>.col<span class="k2">)</span><span class="k2">;</span> </td></tr><tr><td class="number">14</td><td><span class="k2">}</span> </td></tr><tr><td class="number">15</td><td><span class="c">//blit(buffer1, screen, 0, 0, 0, 0, buffer1-&gt;w, buffer1-&gt;h); </span></td></tr><tr><td class="number">16</td><td>&#160;</td></tr><tr><td class="number">17</td><td>&#160;</td></tr><tr><td class="number">18</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>
first off I don&#39;t have that background.pcx so I had to &quot;invent one&quot; and when I took out the first blit the program ran 2x faster.  and instead of blitting I just wrote to the screen.  Bad I know but I just wanted to see it faster.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (CIRCLE)</author>
		<pubDate>Mon, 14 May 2007 21:36:45 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Generally, when pasting source code its nice to encapsulate them in [code] tags.  Like so:
</p><pre>
&lt;code&gt;
void foobar(int);

int var = 5;

foobar(5 * 2);
&lt;/code&gt;
</pre><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (ImLeftFooted)</author>
		<pubDate>Tue, 15 May 2007 03:05:29 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Don&#39;t draw directly to the screen. Just don&#39;t.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (gnolam)</author>
		<pubDate>Tue, 15 May 2007 03:31:23 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Blit is your problem. It is slow.
</p></div></div><p>
Only because of how he&#39;s using it. The buffer is created as a 16-bit bitmap (since it&#39;s called after set_color_depth), but the screen is 8-bit (since set_gfx_mode is called before). Converting to paletted mode, especially without a lookup table, is excruciatingly slow.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Kitty Cat)</author>
		<pubDate>Tue, 15 May 2007 07:59:10 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>
More problems than you ever wanted to know about eh Gary?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Richard Phipps)</author>
		<pubDate>Tue, 15 May 2007 12:45:23 +0000</pubDate>
	</item>
</rss>
