<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Flashroom dev &#187; Grupowanie obiektów</title>
	<atom:link href="http://www.flashroom.pl/szymon/tag/grupowanie-obiektow/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.flashroom.pl/szymon</link>
	<description></description>
	<lastBuildDate>Mon, 19 Jul 2010 19:11:59 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Spatial Hashing &#8211; grupowanie obiektów</title>
		<link>http://www.flashroom.pl/szymon/2009/09/spatial-hashing/</link>
		<comments>http://www.flashroom.pl/szymon/2009/09/spatial-hashing/#comments</comments>
		<pubDate>Fri, 04 Sep 2009 11:36:10 +0000</pubDate>
		<dc:creator>Szymon Adamczyk</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Collision Detection]]></category>
		<category><![CDATA[actionscript]]></category>
		<category><![CDATA[actionscript3]]></category>
		<category><![CDATA[as3]]></category>
		<category><![CDATA[brute force]]></category>
		<category><![CDATA[Grupowanie obiektów]]></category>
		<category><![CDATA[kolizje]]></category>
		<category><![CDATA[optymalizaja]]></category>
		<category><![CDATA[silnik]]></category>
		<category><![CDATA[Spatial Hashing]]></category>

		<guid isPermaLink="false">http://www.flashroom.pl/szymon/?p=65</guid>
		<description><![CDATA[Kolizje w grach to ważna sprawa. Często są to dość żrące CPU algorytmy i w co większych grach trzeba zastosować mechanizm ograniczenia ilości badany obiektów. Zanim zaczniemy jednak sortować czy grupować obiekty – trzeba się zastanowić czy warto… Dla małej ilość elementów algorytm „brute force” jest bardzo efektywny. Nieskomplikowany, polegający na tym że bada się [...]]]></description>
			<content:encoded><![CDATA[<p>Kolizje w grach to ważna sprawa.  Często są to dość żrące CPU algorytmy i w co większych grach trzeba zastosować mechanizm ograniczenia ilości badany obiektów. Zanim zaczniemy jednak sortować czy grupować obiekty – trzeba się zastanowić czy warto… </p>
<p>Dla małej ilość elementów algorytm „brute force” jest bardzo efektywny. Nieskomplikowany, polegający na tym że bada się kolizje każdego z każdym.</p>
<div class="codecolorer-container actionscript3 default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="actionscript3 codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #0033ff; font-weight: bold;">for</span> <span style="color: #000000;">&#40;</span>i = <span style="color: #000000; font-weight:bold;">0</span><span style="color: #000066; font-weight: bold;">;</span> i <span style="color: #000066; font-weight: bold;">&lt;</span> &nbsp;n<span style="color: #000066; font-weight: bold;">;</span> i<span style="color: #000066; font-weight: bold;">++</span><span style="color: #000000;">&#41;</span><br />
<span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; a = obj<span style="color: #000000;">&#91;</span>i<span style="color: #000000;">&#93;</span><span style="color: #000066; font-weight: bold;">;</span><br />
&nbsp; &nbsp; <span style="color: #0033ff; font-weight: bold;">for</span> <span style="color: #000000;">&#40;</span>j = i <span style="color: #000066; font-weight: bold;">+</span> <span style="color: #000000; font-weight:bold;">1</span><span style="color: #000066; font-weight: bold;">;</span> j <span style="color: #000066; font-weight: bold;">&lt;</span> &nbsp;n<span style="color: #000066; font-weight: bold;">;</span> j<span style="color: #000066; font-weight: bold;">++</span><span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #004993;">b</span> = obj<span style="color: #000000;">&#91;</span>j<span style="color: #000000;">&#93;</span><span style="color: #000066; font-weight: bold;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; checkCollision<span style="color: #000000;">&#40;</span>a<span style="color: #000066; font-weight: bold;">,</span> <span style="color: #004993;">b</span><span style="color: #000000;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #000000;">&#125;</span><br />
<span style="color: #000000;">&#125;</span></div></div>
<p>Problem jednak powstaje przy większej ilości obiektów dla których kolizje musimy sprawdzić. Ilość wywołań metody checkCollision() dla n liczby obiektów rośnie dość szybko  O((n2-n)/2). Brute force zaczyna tak obciążać procesor że fps odczuwalnie spada.  Trzeba poszukać rozwiązania… a tych wcale nie jest mało…</p>
<p><strong>Spatial Hashing</strong></p>
<p>Chyba najprostsza metoda grupowania obiektów.  Na obszar gry „nakładamy” siatkę i zapamiętujemy referencję do obiektu w każdej komórce siatki nad którą obiekt się znajduje.  </p>
<p><img src="http://www.flashroom.pl/szymon/wp-content/uploads/2009/09/spatialhashing.gif" alt="spatialhashing" title="spatialhashing" width="289" height="232" class="alignnone size-full wp-image-68" /></p>
<p>Jest trochę problemów z optymalnym dopasowaniem wielkości komórki, ale zysk i tak będzie spory. Badamy kolizje tylko tych obiektów które znajdują się w tych samych komórkach. </p>
<p>Test dla 500 obiektów i porównanie z algorytmem brute force:</p>

    <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="swfobj_0" width="481" height="481">
      <param name="movie" value="http://www.flashroom.pl/szymon/wp-content/uploads/2009/09/test.swf" />
      <!--[if !IE]>-->
      <object type="application/x-shockwave-flash" data="http://www.flashroom.pl/szymon/wp-content/uploads/2009/09/test.swf" width="481" height="481">
      <!--<![endif]-->
        <p>The Flash plugin is required to view this object.</p>
      <!--[if !IE]>-->
      </object>
      <!--<![endif]-->
    </object>

<p>Dobra – źle nie jest…  ale i tak nie czułem pełni satysfakcji po napisaniu… otóż Michaela Baczynski na potrzeby silnika motor2 napisał quadtree – też algorytm do grupowania obiektów.  I cholera… jego jest szybszy… i to dużo. </p>
<p>Nie jestem tak dobry jak myślałem…  Tylko że do zwykłych gier quadtree średnio się nadaje.  Ma tą wadę iż dla obiektu będącego na środku i tak musimy zbadać kolizje z wszystkimi innymi obiektami – a gry robię tak że postać (dla której badam kolizje) przeważnie jest na środku. Czyli tak średnio&#8230;</p>
<p>No nić pozostaje mi tylko zoptymalizowanie silnika „spatial hashing”… bo przecież szybszy być musi… </p>
<p>Skorzystałem do budowy struktury danych udostępnione przez Michaela Baczynskiego. Zresztą test też jest jego pomysłu.</p>
<p>Źródła:<br />
<a href="http://lab.polygonal.de/ds/">Struktury danych</a><br />
<a href="http://www.ddj.com/184409694;jsessionid=I0GV0X3T3UA2KQSNDLPCKH0CJUNN2JVN?pgno=3">Collision Detection</a><br />
<a href="http://conkerjo.wordpress.com/2009/06/13/spatial-hashing-implementation-for-fast-2d-collisions/">Spatial hashing implementation</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.flashroom.pl/szymon/2009/09/spatial-hashing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

