<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Vector size limit?</title>
		<link>http://www.allegro.cc/forums/view/613740</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Wed, 08 Jan 2014 04:32:25 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I am creating various objects and pushing them all in objects vector and iterating trough them to update,  render and destroy them easier.<br />Problem occurs when I want to create more then 250 or so objects.<br />Game starts lagging and eventually if I doesn&#39;t stop creating new objects it freezes until program in the back doesn&#39;t destroy few objects(in my case it does it automatically since objects are snowflakes for example)<br />Where is the problem: - Iterating trough 250 objects 60 times in a second 2 or eventually 3 times? or vector cant hold that much memory or something?<br />and how to fix this?<br /> 
</p><div class="source-code snippet"><div class="inner"><pre>std::vector<span class="k3">&lt;</span>GameObject <span class="k3">*</span><span class="k3">&gt;</span> objects<span class="k2">;</span>
std::vector<span class="k3">&lt;</span>GameObject <span class="k3">*</span><span class="k3">&gt;</span><span class="k2">:</span><span class="k2">:</span>iterator iter<span class="k2">;</span>
std::vector<span class="k3">&lt;</span>GameObject <span class="k3">*</span><span class="k3">&gt;</span><span class="k2">:</span><span class="k2">:</span>iterator iter2<span class="k2">;</span>

<span class="c">// example of creating a snowflake:</span>
Snow <span class="k3">*</span>snow <span class="k3">=</span> <span class="k1">new</span> Snow<span class="k2">(</span>player-&gt;GetX<span class="k2">(</span><span class="k2">)</span>, player-&gt;GetY<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
object.push_back<span class="k2">(</span>snow<span class="k2">)</span><span class="k2">;</span>

<span class="c">// example of render:</span>
<span class="k1">for</span><span class="k2">(</span>iter <span class="k3">=</span> objects.begin<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> iter <span class="k3">!</span><span class="k3">=</span> objects.end<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="k3">+</span><span class="k3">+</span>iter<span class="k2">)</span>
      <span class="k2">(</span><span class="k3">*</span>iter<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>Render<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (kebapmanager)</author>
		<pubDate>Sat, 04 Jan 2014 22:01:25 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>It&#39;s not the iteration at issue, it is what you are doing on each iteration, like rendering. You need to profile your code. But it may be that you&#39;re not drawing from the same source texture and using <span class="source-code"><a href="http://www.allegro.cc/manual/al_hold_bitmap_drawing"><span class="a">al_hold_bitmap_drawing</span></a></span> calls.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Sat, 04 Jan 2014 22:20:58 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Snow is actually al_draw_circle, so I think it has nothing to do with textures loading.<br />I have 4 iterations, render, destroy and this two down below, update and collisions.<br />Maybe vector just cant hold that much objects of this size?
</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">//Update</span>
<span class="number">  2</span>   <span class="k1">for</span><span class="k2">(</span>iter <span class="k3">=</span> objects.begin<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> iter <span class="k3">!</span><span class="k3">=</span> objects.end<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="k3">+</span><span class="k3">+</span>iter<span class="k2">)</span>
<span class="number">  3</span>       <span class="k2">(</span><span class="k3">*</span>iter<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>Update<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  4</span>
<span class="number">  5</span><span class="c">//collisions</span>
<span class="number">  6</span><span class="k1">int</span> sz <span class="k3">=</span> <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span>objects.size<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  7</span><span class="k1">for</span> <span class="k2">(</span><span class="k1">int</span> i <span class="k3">=</span> <span class="n">0</span> <span class="k2">;</span> i <span class="k3">&lt;</span> sz <span class="k2">;</span> <span class="k3">+</span><span class="k3">+</span>i<span class="k2">)</span> 
<span class="number">  8</span><span class="k2">{</span>
<span class="number">  9</span>   GameObject<span class="k3">*</span> iter <span class="k3">=</span> objects<span class="k2">[</span>i<span class="k2">]</span><span class="k2">;</span>
<span class="number"> 10</span>
<span class="number"> 11</span>  <span class="k1">if</span><span class="k2">(</span> <span class="k3">!</span> <span class="k2">(</span>iter<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>Collidable<span class="k2">(</span><span class="k2">)</span> <span class="k2">)</span> <span class="k1">continue</span><span class="k2">;</span>
<span class="number"> 12</span>
<span class="number"> 13</span>  <span class="k1">for</span> <span class="k2">(</span><span class="k1">int</span> i2 <span class="k3">=</span> i <span class="k3">+</span> <span class="n">1</span> <span class="k2">;</span> i2 <span class="k3">&lt;</span> sz <span class="k2">;</span> <span class="k3">+</span><span class="k3">+</span>i2<span class="k2">)</span> 
<span class="number"> 14</span>  <span class="k2">{</span>
<span class="number"> 15</span>          GameObject<span class="k3">*</span> iter2 <span class="k3">=</span> objects<span class="k2">[</span>i2<span class="k2">]</span><span class="k2">;</span>
<span class="number"> 16</span>
<span class="number"> 17</span>          <span class="k1">if</span><span class="k2">(</span> <span class="k3">!</span><span class="k2">(</span>iter2<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>Collidable<span class="k2">(</span><span class="k2">)</span> <span class="k2">)</span> <span class="k1">continue</span><span class="k2">;</span>
<span class="number"> 18</span>
<span class="number"> 19</span>          <span class="k1">if</span><span class="k2">(</span> <span class="k2">(</span>iter<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>CheckCollisions<span class="k2">(</span> <span class="k2">(</span>iter2<span class="k2">)</span><span class="k2">)</span><span class="k2">)</span> 
<span class="number"> 20</span>          <span class="k2">{</span>
<span class="number"> 21</span>          <span class="k2">(</span>iter<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>Collided<span class="k2">(</span> <span class="k2">(</span>iter2<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>GetID<span class="k2">(</span><span class="k2">)</span>, <span class="k2">(</span>iter2<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 22</span>          <span class="k2">(</span>iter2<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>Collided<span class="k2">(</span> <span class="k2">(</span>iter<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>GetID<span class="k2">(</span><span class="k2">)</span>, <span class="k2">(</span>iter<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 23</span>          <span class="k2">}</span>
<span class="number"> 24</span>        <span class="k2">}</span>
<span class="number"> 25</span>      <span class="k2">}</span>
</div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (kebapmanager)</author>
		<pubDate>Sat, 04 Jan 2014 22:27:03 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/613740/994765#target">kebapmanager</a> said:</div><div class="quote"><p>I have 4 iterations, render, destroy and this two down below, update and collisions.</p></div></div><p>
If by &quot;destroy&quot; you mean <a href="http://www.cplusplus.com/reference/vector/vector/erase/">erase</a> then don&#39;t, since it has linear time complexity. Instead you should swap the current element with the last element and <a href="http://www.cplusplus.com/reference/vector/vector/pop_back/">pop_back</a>, unless the order really matters.</p><p>There&#39;s also the fact that you check for collisions between all pairs of objects, so those are 250*250 = 62500 collision checks per frame, which could also be slowing you down.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Slartibartfast)</author>
		<pubDate>Sat, 04 Jan 2014 22:46:03 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>This has nothing to do with vectors. They are your best choice in this situation, since they have contiguous memory.</p><p>The problem is that you are doing (n^2 + n)/2 CheckCollisions calls where n is the number of objects in your vector.</p><p>I told you, profile your code. MinGW has gprof, MSVC probably has their own profiler.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Sat, 04 Jan 2014 22:47:33 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/613740/994768#target">Edgar Reynaldo</a> said:</div><div class="quote"><p> MSVC probably has their own profiler</p></div></div><p>The Express edition famously does not.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Arthur Kalliokoski)</author>
		<pubDate>Sat, 04 Jan 2014 22:49:44 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>This is how it looks like, I will try your suggestion ! <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" /></p><div class="source-code snippet"><div class="inner"><pre><span class="c">//delete dead</span>
    <span class="k1">for</span><span class="k2">(</span>iter <span class="k3">=</span> objects.begin<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> iter <span class="k3">!</span><span class="k3">=</span> objects.end<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="k2">)</span>
    <span class="k2">{</span>
      <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span> <span class="k2">(</span><span class="k3">*</span>iter<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>GetAlive<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span>
      <span class="k2">{</span>
        <span class="k1">delete</span> <span class="k2">(</span><span class="k3">*</span>iter<span class="k2">)</span><span class="k2">;</span>  
        iter <span class="k3">=</span> objects.erase<span class="k2">(</span>iter<span class="k2">)</span><span class="k2">;</span>
      <span class="k2">}</span>
      <span class="k1">else</span>
        iter<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span>
    <span class="k2">}</span>
</pre></div></div><p>

I tryed to comment out collision checking and as it turns out thats what makes my game lagg. I was able to creat 2k objects without it( didint try more <img src="http://www.allegro.cc/forums/smileys/cheesy.gif" alt=";D" border="0" />). Should I set collision chechks only if objects are close to player?</p><p>Conclusion, I disabled collision but left in main to still iterate trough 62500 checks, and I got lagg back again, so the problem is in iterating trough 62500 objects basicly.I need to shrink that down.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (kebapmanager)</author>
		<pubDate>Sat, 04 Jan 2014 23:00:58 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/613740/994770#target">kebapmanager</a> said:</div><div class="quote"><p>Should I set collision chechks only if objects are close to player</p></div></div><p>
Depends on what your collision code looks like. If it&#39;s just meant to check for collision between circles, checking distance and checking for circles collision is pretty much the same thing.<br />Anyway, you don&#39;t need to check everything for collision every frame, like 60 times per second, right? You could only check some objects. Here is an idea: set a maximum time collision code can take per frame, and if it takes more, then stop it, remember the position, and then start from this position when you return to collision checking next frame.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Aikei_c)</author>
		<pubDate>Sun, 05 Jan 2014 00:12:25 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Iterating through 62500 objects shouldn&#39;t be a problem.
</p><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/613740/994770#target">kebapmanager</a> said:</div><div class="quote"><p> Should I set collision chechks only if objects are close to player?</p></div></div><p>Only if you update objects close to the player, otherwise weird things might happen. Only check collisions with objects that are close to each other.<br />You could for example divide the board using an imaginary grid. Add objects to cells that they are inside of. Then while doing a collision check, only check collisions with objects in the same cell. Do keep your current vector as well, for keeping updating, rendering and deletion simple.</p><p>You can keep track of objects that can collide and objects that can&#39;t in 2 seperate vectors. You&#39;ll get rid of the if (foo-&gt;Collidable()) check completely or almost completely, which can improve performance a lot if your program is suffering from many branch mispredictions. </p><p>All those virtual calls and dereferencing pointers, pointing to objects made by new that might be located all over the place (causing cache misses), might be a problem.<br />Perhaps try a design like this, this is assuming snow is a very common object, expected to be on the screen in great quantities. If it isn&#39;t, don&#39;t bother with the following code, but do keep it in mind.</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="k1">struct</span> SnowParticle
<span class="number">  2</span><span class="k2">{</span>
<span class="number">  3</span>   <span class="k1">float</span> x, y<span class="k2">;</span>
<span class="number">  4</span><span class="k2">}</span><span class="k2">;</span>
<span class="number">  5</span>
<span class="number">  6</span><span class="k1">class</span> SnowParticleSystem <span class="k2">:</span> <span class="k1">public</span> GameObject
<span class="number">  7</span><span class="k2">{</span>
<span class="number">  8</span>   <span class="c">// std::array is C++11, if you're on an older compiler use an alternative</span>
<span class="number">  9</span>   std::array<span class="k3">&lt;</span>SnowParticle, <span class="n">255</span><span class="k3">&gt;</span> snowParticleArray<span class="k2">;</span> <span class="c">// 255 Snow particles max</span>
<span class="number"> 10</span>public:
<span class="number"> 11</span>   <span class="c">// On older compilers, omit the override keyword</span>
<span class="number"> 12</span>   <span class="k1">void</span> Update<span class="k2">(</span><span class="k2">)</span> override
<span class="number"> 13</span>   <span class="k2">{</span>
<span class="number"> 14</span>      <span class="k1">for</span> <span class="k2">(</span><span class="k1">auto</span> it <span class="k2">:</span> snowParticleArray<span class="k2">)</span>
<span class="number"> 15</span>      <span class="k2">{</span>
<span class="number"> 16</span>         <span class="c">// update snow</span>
<span class="number"> 17</span>      <span class="k2">}</span>
<span class="number"> 18</span>   <span class="k2">}</span>
<span class="number"> 19</span>   <span class="c">// Same for rendering</span>
<span class="number"> 20</span><span class="k2">}</span><span class="k2">;</span>
</div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (l j)</author>
		<pubDate>Sun, 05 Jan 2014 00:27:07 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>You know, collision checks shouldn&#39;t be all that time consuming... it&#39;s making me wonder if perhaps you&#39;re calling something like sqrt() for bounding circles, since sqrt() can cause huge performance hits if overused. (Typically, with bounding circles, you want to calculate based on the squared values of everything so you never have to call the square root function.)</p><p>It also helps to flag things appropriately. Not every kind of object needs to intersect every kind of object so you don&#39;t want to run collisions on two objects which will never interact with each other.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Kris Asick)</author>
		<pubDate>Sun, 05 Jan 2014 07:03:16 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Maybe the performance hit is due to 250 calls to <span class="source-code"><a href="http://www.allegro.cc/manual/al_draw_circle"><span class="a">al_draw_circle</span></a></span>?</p><p>I sort of remember that it winds up in <span class="source-code"><a href="http://www.allegro.cc/manual/al_draw_prim"><span class="a">al_draw_prim</span></a></span> and 250 calls per frame may hit performance?</p><p>Not sure but still...
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (pkrcel)</author>
		<pubDate>Tue, 07 Jan 2014 19:23:53 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://">pkrcel</a> said:</div><div class="quote"><p>Maybe the performance hit is due to 250 calls to al_draw_circle?</p><p>I sort of remember that it winds up in al_draw_prim and 250 calls per frame may hit performance?</p><p>Not sure but still...</p></div></div><p>
Definitly not, I removed collision betwen blocks and now I can have 3000 al_draw_circles at the same time without seeing any lagg</p><div class="quote_container"><div class="title"><a href="http://">Kris Asick</a> said:</div><div class="quote"><p>You know, collision checks shouldn&#39;t be all that time consuming... it&#39;s making me wonder if perhaps you&#39;re calling something like sqrt() for bounding circles, since sqrt() can cause huge performance hits if overused. (Typically, with bounding circles, you want to calculate based on the squared values of everything so you never have to call the square root function.)</p></div></div><p>

I dont use anything like that</p><div class="quote_container"><div class="title"><a href="http://">Kris Asick</a> said:</div><div class="quote"><p>It also helps to flag things appropriately. Not every kind of object needs to intersect every kind of object so you don&#39;t want to run collisions on two objects which will never interact with each other.</p></div></div><p>
This is what acctualy helped me, I was runnig collision chechk betwen cubes, even though cubes never move...
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (kebapmanager)</author>
		<pubDate>Wed, 08 Jan 2014 04:32:25 +0000</pubDate>
	</item>
</rss>
