<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;DEQGR3s_fCp7ImA9WhRUFEQ.&quot;"><id>tag:blogger.com,1999:blog-5159939380865750407</id><updated>2012-01-25T13:58:46.544+01:00</updated><category term="OpenAL Tutorials" /><category term="Billboard Techniken" /><category term="OpenGL Leitfaden" /><category term="Physik" /><category term="Kollisions- u. Überschneidungstests" /><category term="Featured Posts" /><category term="OpenGL Tutorials" /><category term="Animation" /><category term="Programmierung allg." /><category term="OpenCL Tutorials" /><category term="KI-Programmierung" /><category term="Mathematik der 3D-Programmierung" /><title type="text">Spieleprogrammierung - ausgesuchte Themen</title><subtitle type="html">Ausgesuchte Themen zur Spieleprogrammierung, Grafik, KI, Spielephysik, Mathematik, Thread Programmierung, usw.&#xD;
Tutorials, weiterführende Erklärungen teils mit Source Code&#xD;
&#xD;
&#xD;
</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://www.spieleprogrammierung.net/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://www.spieleprogrammierung.net/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/5159939380865750407/posts/default?start-index=6&amp;max-results=5&amp;redirect=false&amp;v=2" /><author><name>Alex</name><uri>http://www.blogger.com/profile/12911562805026944414</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>160</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>5</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/Spieleprogrammierung" /><feedburner:info uri="spieleprogrammierung" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;CkYNRX8-fCp7ImA9WhRUEkg.&quot;"><id>tag:blogger.com,1999:blog-5159939380865750407.post-5071159528635345188</id><published>2012-01-22T17:36:00.000+01:00</published><updated>2012-01-22T17:36:34.154+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-22T17:36:34.154+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Featured Posts" /><title>Update der OpenGL Programmbeispiele</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/8aWJh0oSTxo01Z9LQWrLwA8hlwc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8aWJh0oSTxo01Z9LQWrLwA8hlwc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/8aWJh0oSTxo01Z9LQWrLwA8hlwc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8aWJh0oSTxo01Z9LQWrLwA8hlwc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;Kurz Notiert – alle Programmbeispiele sind dahingehend überarbeitet worden, um mögliche Kompatibilitätsprobleme mit dem neuesten AMD Catalyst Treiber 12.1 zu beheben. Die überarbeiteten Demoprogramme stehen ab sofort zum Download bereit.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5159939380865750407-5071159528635345188?l=www.spieleprogrammierung.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Spieleprogrammierung/~4/50S7YgsMwac" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5159939380865750407/posts/default/5071159528635345188?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5159939380865750407/posts/default/5071159528635345188?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Spieleprogrammierung/~3/50S7YgsMwac/update-der-opengl-programmbeispiele.html" title="Update der OpenGL Programmbeispiele" /><author><name>Alex</name><uri>http://www.blogger.com/profile/12911562805026944414</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><feedburner:origLink>http://www.spieleprogrammierung.net/2012/01/update-der-opengl-programmbeispiele.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DE4DQX06cSp7ImA9WhRWF0Q.&quot;"><id>tag:blogger.com,1999:blog-5159939380865750407.post-6385845104076689834</id><published>2012-01-05T20:50:00.024+01:00</published><updated>2012-01-05T21:56:10.319+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-05T21:56:10.319+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="OpenCL Tutorials" /><title>OpenCL Tutorial – Offline Compilation (Download)</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/vHvE_CCAtADDll0ntEhIq3hb8kk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/vHvE_CCAtADDll0ntEhIq3hb8kk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/vHvE_CCAtADDll0ntEhIq3hb8kk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/vHvE_CCAtADDll0ntEhIq3hb8kk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://img694.imageshack.us/img694/8013/asteroids1.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://img694.imageshack.us/img694/8013/asteroids1.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;In der Regel werden OpenCL-Programme zur Laufzeit für ein zuvor ausgewähltes Gerät – beispielsweise für die in einem Rechner verbaute Grafikkarte – kompiliert. Alternativ zu diesem als Online Compilation bekannten Verfahren, lassen sich auch bereits im Vorfeld kompilierte Programme verwenden (Offline Compilation). Der Nachteil der Offline Compilation besteht jedoch darin, dass ein vorkompiliertes Programm immer nur auf einer einzigen Plattform und einem einzigen Gerät lauffähig ist.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Für das heutige Tutorial wurde die &lt;span style="color: blue; font-family: courier new; font-size: 10pt;"&gt;COpenCLProgram&lt;/span&gt;-Klasse aus dem letzten Programmbeispiel dahingehend erweitert,&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;dass sich OpenCL-Programme kompilieren und im Anschluss daran abspeichern lassen (Offline Compilation, &lt;span style="color: blue; font-family: courier new; font-size: 10pt;"&gt;Build_PrecompiledClBinary()&lt;/span&gt;) und&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;dass nunmehr auch vorkompilierte Programme verwendet werden können (&lt;span style="color: blue; font-family: courier new; font-size: 10pt;"&gt;Build_ProgramFromPrecompiledClBinary()&lt;/span&gt;).&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;ul&gt;&lt;/ul&gt;&lt;ul&gt;&lt;/ul&gt;&lt;div class="MsoNormal" style="margin: 0cm 0cm 0pt;"&gt;&lt;/div&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;b&gt;Hinweis:&lt;/b&gt;  &lt;br /&gt;
&lt;div class="MsoNormal"&gt;Für die Ausführung dieses Programmbeispiels muss der Treiber Ihrer Grafikkarte die OpenGL Version 3.3 unterstützen.&lt;/div&gt;&lt;br /&gt;
&lt;b&gt;Visual C++ 2010: &lt;a href="http://dl.dropbox.com/u/6748497/DemoWithOpenGL2010_Tut49.zip" target="_blank"&gt;DemoWithOpenGL2010_Tut49&lt;/a&gt;&lt;/b&gt; &lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&amp;nbsp;&lt;/b&gt;  &lt;br /&gt;
&lt;div class="MsoNormal"&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5159939380865750407-6385845104076689834?l=www.spieleprogrammierung.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Spieleprogrammierung/~4/s27Yu0-D-mI" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5159939380865750407/posts/default/6385845104076689834?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5159939380865750407/posts/default/6385845104076689834?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Spieleprogrammierung/~3/s27Yu0-D-mI/opencl-tutorial-offline-compilation.html" title="OpenCL Tutorial – Offline Compilation (Download)" /><author><name>Alex</name><uri>http://www.blogger.com/profile/12911562805026944414</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><feedburner:origLink>http://www.spieleprogrammierung.net/2012/01/opencl-tutorial-offline-compilation.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0MDRHYyfCp7ImA9WhRWF0Q.&quot;"><id>tag:blogger.com,1999:blog-5159939380865750407.post-1833946800836507825</id><published>2011-11-16T15:14:00.004+01:00</published><updated>2012-01-05T21:31:15.894+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-05T21:31:15.894+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Programmierung allg." /><title>Speicherverwaltung – Random Memory Allocation</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/BrvgUvsj00-m545i6HK3rzsFRY8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/BrvgUvsj00-m545i6HK3rzsFRY8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/BrvgUvsj00-m545i6HK3rzsFRY8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/BrvgUvsj00-m545i6HK3rzsFRY8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://vg01.met.vgwort.de/na/f0ef0f945b764ec39046bdabe5aca5b0" width="1" height="1" alt=""&gt;Gutes Ressourcenmanagement zählt zu den wichtigsten Herausforderungen bei der Entwicklung eines Computerspiels. Bei der Darstellung von detailreichen und weitläufigen Spielewelten müssen kontinuierlich die hierfür benötigten Geometrie- und Textur-Daten geladen und die nicht mehr benötigten Daten aus dem Speicher entfernt werden (Streaming). Betrachten wir als Beispiel das Spiel &lt;b style="mso-bidi-font-weight: normal;"&gt;Minecraft&lt;/b&gt;. Lediglich die Teile der Spielewelt, die sich im näheren Umfeld des Spielers befinden, werden auch wirklich in den Speicher geladen. Die Welt wird hierbei in sogenannte Chunks eingeteilt, wobei jeder Chunk aus 16 (Breite) mal 16 (Länge) mal 128 (Höhe) Blöcken besteht. Insgesamt werden 81 Chunks im Speicher gehalten, die in einem 9 mal 9 Quadrat um den Spieler herum gruppiert sind.&lt;br /&gt;
&lt;div class="MsoNormal"&gt;Betrachten wir als zweites Beispiel kurzlebige Spieleobjekte wie Waffenprojektile und Trümmerteile die noch dazu in großer Zahl auftreten. Der für diese Objekte benötigte Speicher muss sich möglichst schnell dynamisch allozieren (zuweisen) und wieder freigeben lassen. Kurzum, ohne eine vernünftige Speicherverwaltung sind wir völlig aufgeschmissen.&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;In C++ lassen sich dynamische Speicherbereiche mithilfe der Operatoren &lt;span style="color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;new&lt;/span&gt; und &lt;span style="color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;delete&lt;/span&gt; anfordern und wieder freigeben. Man hat jedoch keine Kontrolle darüber, welche Speicherbereiche man zugeteilt bekommt, was bei übermäßigem Gebrauch letzten Endes zu einer zunehmenden Fragmentierung des Speichers führt.&lt;/div&gt;&lt;div class="MsoNormal"&gt;Zweckmäßigerweise sollten &lt;span style="color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;new&lt;/span&gt; und &lt;span style="color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;delete&lt;/span&gt; lediglich bei Programmstart (Anfordern des maximal benötigten Speichers) und Programmende (Freigabe des bei Programmstarts angeforderten Speichers) verwendet werden. Zur Laufzeit sollte die dynamische Speicherzuteilung und -freigabe mittels eines eigenen Speichermanagers erfolgen.&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="MsoNormal"&gt;Betrachten wir als Beispiel die Klasse &lt;span style="color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;CSimpleObjectInstance&lt;/span&gt; als Prototypen für ein beliebiges Spieleobjekt. Bei Programmstart würden wir zunächst ein Array aus Klasseninstanzen anlegen, wobei die Anzahl der Arrayelemente der maximal möglichen Anzahl von Spieleobjekten entspricht. Zunächst sind die einzelnen Arrayelemente noch unbenutzt (&lt;span lang="EN-GB" style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;used == &lt;span style="color: blue;"&gt;true&lt;/span&gt;&lt;/span&gt;).&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="MsoNormal" style="mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span lang="EN-GB" style="color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;class&lt;/span&gt;&lt;span lang="EN-GB" style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt; CSimpleObjectInstance&lt;br /&gt;
{&lt;br /&gt;
&lt;span style="color: blue;"&gt;public&lt;/span&gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;bool&lt;/span&gt; used;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;long&lt;/span&gt; ID;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; CSimpleObjectInstance();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; ~CSimpleObjectInstance();&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Initialize(&lt;span style="color: blue;"&gt;long&lt;/span&gt; id);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;void&lt;/span&gt; TurnBack(&lt;span style="color: blue;"&gt;void&lt;/span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span lang="EN-GB" style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;};&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="MsoNormal" style="mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span lang="EN-GB" style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;CSimpleObjectInstance::CSimpleObjectInstance()&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; used = &lt;span style="color: blue;"&gt;false&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; ID&amp;nbsp;&amp;nbsp; = -1;&lt;br /&gt;
}&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="MsoNormal" style="mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span lang="EN-GB" style="color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;void&lt;/span&gt;&lt;span lang="EN-GB" style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt; CSimpleObjectInstance::Initialize(&lt;span style="color: blue;"&gt;long&lt;/span&gt; id)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; used = &lt;span style="color: blue;"&gt;true&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; ID&amp;nbsp;&amp;nbsp; = id;&lt;br /&gt;
}&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="MsoNormal" style="mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span lang="EN-GB" style="color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;void&lt;/span&gt;&lt;span lang="EN-GB" style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt; CSimpleObjectInstance::TurnBack(&lt;span style="color: blue;"&gt;void&lt;/span&gt;)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; used = &lt;span style="color: blue;"&gt;false&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; ID&amp;nbsp;&amp;nbsp; = -1;&lt;br /&gt;
}&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-GB"&gt;Die Klasse &lt;/span&gt;&lt;span lang="EN-GB" style="color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;CSimpleObjectInstancePool&lt;/span&gt;&lt;span lang="EN-GB"&gt; übernimmt die Aufgabe de&lt;/span&gt;s Speichermanagers und ist für die Verwaltung des &lt;span style="color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;CSimpleObjectInstance&lt;/span&gt;-Arrays verantwortlich.&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;ul style="margin-top: 0cm;" type="disc"&gt;&lt;li class="MsoNormal" style="mso-list: l0 level1 lfo1; tab-stops: list 36.0pt;"&gt;Die      Methode &lt;b style="mso-bidi-font-weight: normal;"&gt;&lt;span style="color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;Init_ObjectInstancePool()&lt;/span&gt;&lt;/b&gt;      erzeugt zunächst ein Array aus &lt;span style="color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;CSimpleObjectInstance&lt;/span&gt;-Klasseninstanzen.&lt;/li&gt;
&lt;li class="MsoNormal" style="mso-list: l0 level1 lfo1; tab-stops: list 36.0pt;"&gt;Die &lt;b style="mso-bidi-font-weight: normal;"&gt;&lt;span style="color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;Get_Unused_ObjectInstance()&lt;/span&gt;&lt;/b&gt;-Methode      sucht nach einem aktuell unbenutzten Arrayelement und liefert einen Zeiger      auf ein solches zurück. Die &lt;span style="color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;CSimpleObjectInstance&lt;/span&gt;-Membervariable &lt;span style="color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;used&lt;/span&gt;      wird zuvor auf &lt;span lang="EN-GB" style="color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;true&lt;/span&gt; gesetzt.&lt;/li&gt;
&lt;li class="MsoNormal" style="mso-list: l0 level1 lfo1; tab-stops: list 36.0pt;"&gt;Die      Methode &lt;b style="mso-bidi-font-weight: normal;"&gt;&lt;span style="color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;Release_ObjectInstance()&lt;/span&gt;&lt;/b&gt;      gibt ein momentan verwendetes Arrayobjekt wieder frei, indem die &lt;span style="color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;CSimpleObjectInstance&lt;/span&gt;-Membervariable      &lt;span style="color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;used&lt;/span&gt;      wieder auf &lt;span style="color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;false&lt;/span&gt; gesetzt wird.&lt;/li&gt;
&lt;/ul&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="MsoNormal" style="mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span lang="EN-GB" style="color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;class&lt;/span&gt;&lt;span lang="EN-GB" style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt; CSimpleObjectInstancePool&lt;br /&gt;
{&lt;br /&gt;
&lt;span style="color: blue;"&gt;public&lt;/span&gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;long&lt;/span&gt; NumObjectInstancesMax;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;long&lt;/span&gt; NumObjectInstancesUsed;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; CSimpleObjectInstance* ObjectInstance;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; CSimpleObjectInstancePool();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; ~CSimpleObjectInstancePool();&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Init_ObjectInstancePool(&lt;span style="color: blue;"&gt;long&lt;/span&gt; numObjectInstancesMax);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; CSimpleObjectInstance* Get_Unused_ObjectInstance(&lt;span style="color: blue;"&gt;void&lt;/span&gt;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Release_ObjectInstance(CSimpleObjectInstance** ppObjectInstance);&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span lang="EN-GB" style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;};&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="MsoNormal" style="mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span lang="EN-GB" style="color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;void&lt;/span&gt;&lt;span lang="EN-GB" style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt; CSimpleObjectInstancePool::Init_ObjectInstancePool(&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;long&lt;/span&gt; numObjectInstancesMax)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; NumObjectInstancesMax = numObjectInstancesMax;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; NumObjectInstancesUsed = 0;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; SAFE_DELETE_ARRAY(ObjectInstance)&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; ObjectInstance = &lt;span style="color: blue;"&gt;new&lt;/span&gt; CSimpleObjectInstance[NumObjectInstancesMax];&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;for&lt;/span&gt;(&lt;span style="color: blue;"&gt;long&lt;/span&gt; i = 0; i &amp;lt; NumObjectInstancesMax; i++)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ObjectInstance[i].ID = i;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span lang="EN-GB" style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="MsoNormal"&gt;Mehr noch als in konventionellen Anwendungen kommt es in Computerspielen darauf an, dass Speicher so schnell wie möglich zugewiesen und wieder freigegeben werden kann. Im konkreten Fall benötigen wir also für unsere &lt;b style="mso-bidi-font-weight: normal;"&gt;&lt;span style="color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;Get_Unused_ObjectInstance()&lt;/span&gt;&lt;/b&gt;-Methode ein Verfahren für die schnelle Suche eines momentan unbenutzten Arrayelements.&lt;/div&gt;&lt;div class="MsoNormal"&gt;Beim einfachsten aber auch langsamsten Verfahren würde man das komplette Array nach einem unbenutzten Element durchsuchen und die Suche bei Erfolg abbrechen. Die Suchzeit würde jedoch hierbei linear mit der Anzahl der bereits genutzten Elemente ansteigen.&lt;/div&gt;&lt;div class="MsoNormal"&gt;Im Unterschied dazu erfordert die sogenannte &lt;b style="mso-bidi-font-weight: normal;"&gt;Random Memory Allocation&lt;/b&gt; weitaus weniger Suchschritte. Hierbei wird nach dem Zufallsprinzip ein Arrayelement ausgesucht. Ist dieses Arrayelement unbenutzt, kann die weitere Suche eingestellt werden. Sind beispielsweise &lt;b style="mso-bidi-font-weight: normal;"&gt;50%&lt;/b&gt; der Arrayelemente in Benutzung, so sind im Durchschnitt &lt;b style="mso-bidi-font-weight: normal;"&gt;lediglich zwei Versuche&lt;/b&gt; notwendig (&lt;b style="mso-bidi-font-weight: normal;"&gt;Suchtiefe 2&lt;/b&gt;), um ein unbenutztes Element zu finden. &lt;span lang="EN-GB"&gt;Bei &lt;b style="mso-bidi-font-weight: normal;"&gt;75%&lt;/b&gt; benutzter Arrayelemente ist mit durchschnittlich &lt;b style="mso-bidi-font-weight: normal;"&gt;4 Suchschritten&lt;/b&gt; zu rechnen:&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="MsoNormal" style="mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span lang="EN-GB" style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;CSimpleObjectInstance* CSimpleObjectInstancePool::&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Get_Unused_ObjectInstance(&lt;span style="color: blue;"&gt;void&lt;/span&gt;)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt;(NumObjectInstancesMax == NumObjectInstancesUsed)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; NULL;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;long&lt;/span&gt; id;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;bool&lt;/span&gt; used = &lt;span style="color: blue;"&gt;false&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;long&lt;/span&gt; counter = 0;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// Maximale Anzahl von Suchschritten (Suchtiefe)&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;long&lt;/span&gt; counterMax = 100*NumObjectInstancesMax;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;do&lt;br /&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; id = RandomNumbers.Next_IntegerNumber(0, NumObjectInstancesMax);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; used = ObjectInstance[id].used;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt;(used == &lt;span style="color: blue;"&gt;false&lt;/span&gt;)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;break&lt;/span&gt;;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; counter++;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;while&lt;/span&gt;(counter &amp;lt; counterMax);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt;(used == &lt;span style="color: blue;"&gt;false&lt;/span&gt;)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NumObjectInstancesUsed++;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ObjectInstance[id].used = &lt;span style="color: blue;"&gt;true&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &amp;amp;ObjectInstance[id];&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;else&lt;br /&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; NULL;&lt;br /&gt;
}&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="MsoNormal" style="mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span lang="EN-GB" style="color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;void&lt;/span&gt;&lt;span lang="EN-GB" style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt; CSimpleObjectInstancePool::Release_ObjectInstance(&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CSimpleObjectInstance** ppObjectInstance)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;// Release unnötig / Zeiger enthält keine Adresse&lt;br /&gt;
&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt;(*ppObjectInstance == NULL)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt;;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt;((*ppObjectInstance)-&amp;gt;used == &lt;span style="color: blue;"&gt;true&lt;/span&gt;)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NumObjectInstancesUsed--;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (*ppObjectInstance)-&amp;gt;used = &lt;span style="color: blue;"&gt;false&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *ppObjectInstance = NULL;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span lang="EN-GB" style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5159939380865750407-1833946800836507825?l=www.spieleprogrammierung.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Spieleprogrammierung/~4/rQPU4-6T8wk" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5159939380865750407/posts/default/1833946800836507825?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5159939380865750407/posts/default/1833946800836507825?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Spieleprogrammierung/~3/rQPU4-6T8wk/speicherverwaltung-random-memory.html" title="Speicherverwaltung – Random Memory Allocation" /><author><name>Alex</name><uri>http://www.blogger.com/profile/12911562805026944414</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><feedburner:origLink>http://www.spieleprogrammierung.net/2011/11/speicherverwaltung-random-memory.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A04GQH84fSp7ImA9WhRWF0o.&quot;"><id>tag:blogger.com,1999:blog-5159939380865750407.post-2901625638669499024</id><published>2011-09-26T15:06:00.005+02:00</published><updated>2012-01-05T17:12:01.135+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-05T17:12:01.135+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="OpenCL Tutorials" /><title>OpenCL Tutorial – Masspoint Movement, Collision Hash Grids (Download)</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/rFRUsPSt1Z462ZD3bzjOZAQMdyk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/rFRUsPSt1Z462ZD3bzjOZAQMdyk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/rFRUsPSt1Z462ZD3bzjOZAQMdyk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/rFRUsPSt1Z462ZD3bzjOZAQMdyk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://img694.imageshack.us/img694/8013/asteroids1.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://img694.imageshack.us/img694/8013/asteroids1.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;Der Schwerpunkt des heutigen Tutorials liegt im Entwurf eines einfachen OpenCL-Frameworks sowie in der Implementierung einer einfachen OpenCL-basierten Bewegungssimulation für ein Asteroidenfeld:&lt;br /&gt;
&lt;div class="MsoNormal"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;ul style="margin-top: 0cm;" type="disc"&gt;&lt;li class="MsoNormal" style="mso-list: l0 level1 lfo1; tab-stops: list 36.0pt;"&gt;Simulation      der Asteroiden-Bewegung (jedem Asteroid ist eine einzelne Punktmasse      zugeordnet).&lt;/li&gt;
&lt;li class="MsoNormal" style="mso-list: l0 level1 lfo1; tab-stops: list 36.0pt;"&gt;Berechnung      der Gitter-Indices und -Positionen in einem Kollisionsgitter (Collision      Hash Grid) für eine effiziente Kollisionsprüfung.&lt;/li&gt;
&lt;/ul&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="MsoNormal"&gt;Für die Initialisierung einer OpenCL-Anwendung ist die &lt;span style="color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;COpenCLDevice&lt;/span&gt;-Klasse verantwortlich:&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="MsoNormal" style="mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;class&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt; COpenCLDevice&lt;br /&gt;
{&lt;br /&gt;
&lt;span style="color: blue;"&gt;public&lt;/span&gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; cl_platform_id&amp;nbsp;&amp;nbsp; Platform;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; cl_device_id&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Device;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; cl_context&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DeviceContext;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; cl_command_queue DeviceCommandQueue;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;bool&lt;/span&gt; use_GPU_Device;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; COpenCLDevice();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; ~COpenCLDevice();&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Init_Device(&lt;span style="color: blue;"&gt;bool&lt;/span&gt; useGPU);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Wait(&lt;span style="color: blue;"&gt;void&lt;/span&gt;);&lt;br /&gt;
};&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="MsoNormal"&gt;Zuständig für die Handhabung eines einzelnen OpenCL-Programms (Kernel) ist die &lt;span style="color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;COpenCLProgram&lt;/span&gt;-Klasse:&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="MsoNormal" style="mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;class&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt; COpenCLProgram&lt;br /&gt;
{&lt;br /&gt;
&lt;span style="color: blue;"&gt;public&lt;/span&gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; cl_program Program;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; cl_kernel&amp;nbsp; Kernel;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; cl_uint WorkGroupDim;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; size_t local_ws;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; size_t global_ws;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; size_t MaxBufferElements;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; COpenCLDevice* pUsedOpenCLDevice;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; COpenCLProgram();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; ~COpenCLProgram();&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Set_OpenCLDevice(COpenCLDevice* pOpenCLDevice);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: green; font-family: &amp;quot;Courier New&amp;quot;; font-size: 9.5pt;"&gt;// Laden und Kompilieren eines OpenCl-Programms&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Build_ProgramFromSourceFile(&lt;span style="color: blue;"&gt;char&lt;/span&gt; *pKernelName, &lt;span style="color: blue;"&gt;char&lt;/span&gt; *pFileName,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cl_uint workGroupDim, &lt;span style="color: blue;"&gt;bool&lt;/span&gt; fastMath, size_t maxBufferElements,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; size_t num_WorkItems_Per_WorkGroup = 0);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: green; font-family: &amp;quot;Courier New&amp;quot;; font-size: 9.5pt;"&gt;// Ausführen eines OpenCL-Programms:&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Execute_Program(&lt;span style="color: blue;"&gt;void&lt;/span&gt;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Execute_Program_With_UserDefined_Num_WorkItems_Per_WorkGroup(&lt;span style="color: blue;"&gt;void&lt;/span&gt;);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Execute_Program(cl_uint numEventsInWaitList, &lt;span style="color: blue;"&gt;const&lt;/span&gt; cl_event&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*pEventWaitList, cl_event *pEvent);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Execute_Program_With_UserDefined_Num_WorkItems_Per_WorkGroup(&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cl_uint numEventsInWaitList, &lt;span style="color: blue;"&gt;const&lt;/span&gt; cl_event *pEventWaitList,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;cl_event *pEvent);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: green; font-family: &amp;quot;Courier New&amp;quot;; font-size: 9.5pt;"&gt;// Methoden für die Parameter-Übergabe an ein OpenCL-Programm (Kernel):&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Set_KernelArg(cl_uint pos, cl_mem* pInput);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Set_KernelArg(cl_uint pos, &lt;span style="color: blue;"&gt;int&lt;/span&gt; input);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Set_KernelArg(cl_uint pos, &lt;span style="color: blue;"&gt;double&lt;/span&gt; input);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Set_KernelArg(cl_uint pos, &lt;span style="color: blue;"&gt;float&lt;/span&gt; input);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;void&lt;/span&gt; Set_KernelArg(cl_uint pos, size_t input);&lt;br /&gt;
};&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="MsoNormal"&gt;Die nachfolgenden Container-Klassen (Arrays von Vektoren und Skalaren) fungieren als Schittstelle zwischen einem OpenCL-Kernel und dem Hauptprogramm:&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="MsoNormal" style="mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span lang="EN-GB" style="color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;class&lt;/span&gt;&lt;span lang="EN-GB" style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt; COpenCL_FloatScalar_Container;&lt;br /&gt;
&lt;span style="color: blue;"&gt;class&lt;/span&gt; COpenCL_2DFloatVector_Container;&lt;br /&gt;
&lt;span style="color: blue;"&gt;class&lt;/span&gt; COpenCL_3DFloatVector_Container;&lt;br /&gt;
&lt;span style="color: blue;"&gt;class&lt;/span&gt; COpenCL_4DFloatVector_Container;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: blue;"&gt;class&lt;/span&gt; COpenCL_IntegerScalar_Container;&lt;br /&gt;
&lt;span style="color: blue;"&gt;class&lt;/span&gt; COpenCL_2DIntegerVector_Container;&lt;br /&gt;
&lt;span style="color: blue;"&gt;class&lt;/span&gt; COpenCL_3DIntegerVector_Container;&lt;br /&gt;
&lt;span style="color: blue;"&gt;class&lt;/span&gt; COpenCL_4DIntegerVector_Container;&lt;br /&gt;
&lt;span style="color: blue;"&gt;class&lt;/span&gt; COpenCL_NDIntegerVector_Container;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="MsoNormal"&gt;Die nachfolgenden Klassen ermöglichen den Zugriff auf einzelne Elemente der Container-Klassen aus dem Hauptprogramm heraus:&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="MsoNormal" style="mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="color: blue; font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;class&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt; COpenCL_FloatScalar;&lt;br /&gt;
&lt;span style="color: blue;"&gt;class&lt;/span&gt; COpenCL_2DFloatVector;&lt;br /&gt;
&lt;span style="color: blue;"&gt;class&lt;/span&gt; COpenCL_3DFloatVector;&lt;br /&gt;
&lt;span style="color: blue;"&gt;class&lt;/span&gt; COpenCL_4DFloatVector;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: blue;"&gt;class&lt;/span&gt; COpenCL_IntegerScalar;&lt;br /&gt;
&lt;span style="color: blue;"&gt;class&lt;/span&gt; COpenCL_2D IntegerVector;&lt;br /&gt;
&lt;span style="color: blue;"&gt;class&lt;/span&gt; COpenCL_3D IntegerVector;&lt;br /&gt;
&lt;span style="color: blue;"&gt;class&lt;/span&gt; COpenCL_4D IntegerVector;&lt;br /&gt;
&lt;span style="color: blue;"&gt;class&lt;/span&gt; COpenCL_NDIntegerVector;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="MsoNormal"&gt;Verantwortlich für die Durchführung der Bewegungssimulation ist der nachfolgende OpenCL-Kernel:&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="MsoNormal" style="mso-layout-grid-align: none; text-autospace: none;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;__kernel &lt;span style="color: blue;"&gt;void&lt;/span&gt; MasspointMovement_GPU(__global float4* Position,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; __global float4* Velocity,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; __global int4* GridPosition,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;__global int4* GridIndex,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;const&lt;/span&gt; &lt;span style="color: blue;"&gt;float&lt;/span&gt; TimeStep,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;const&lt;/span&gt; &lt;span style="color: blue;"&gt;float&lt;/span&gt; InvGridSize,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;const&lt;/span&gt; &lt;span style="color: blue;"&gt;float&lt;/span&gt; GridOffset,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;const&lt;/span&gt; &lt;span style="color: blue;"&gt;float&lt;/span&gt; GridCenterX,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;const&lt;/span&gt; &lt;span style="color: blue;"&gt;float&lt;/span&gt; GridCenterY,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;const&lt;/span&gt; &lt;span style="color: blue;"&gt;float&lt;/span&gt; GridCenterZ,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;const&lt;/span&gt; &lt;span style="color: blue;"&gt;int&lt;/span&gt; HalfNumCollisionGridElementsXDirPlus1,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;const&lt;/span&gt; &lt;span style="color: blue;"&gt;int&lt;/span&gt; HalfNumCollisionGridElementsYDirPlus1,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;const&lt;/span&gt; &lt;span style="color: blue;"&gt;int&lt;/span&gt; HalfNumCollisionGridElementsZDirPlus1,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;const&lt;/span&gt; &lt;span style="color: blue;"&gt;int&lt;/span&gt; HalfNumCollisionGridElementsXDirMinus1,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;const&lt;/span&gt; &lt;span style="color: blue;"&gt;int&lt;/span&gt; HalfNumCollisionGridElementsYDirMinus1,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;const&lt;/span&gt; &lt;span style="color: blue;"&gt;int&lt;/span&gt; HalfNumCollisionGridElementsZDirMinus1)&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; size_t id = get_global_id(0);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: green; font-family: &amp;quot;Courier New&amp;quot;; font-size: 9.5pt;"&gt;// Bewegungs-Simulation (kräftefrei):&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Position[id] += Velocity[id]*TimeStep;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: green; font-family: &amp;quot;Courier New&amp;quot;; font-size: 9.5pt;"&gt;// Gitterkoordinaten berechnen:&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; GridPosition[id].x = (&lt;span style="color: blue;"&gt;int&lt;/span&gt;)(GridOffset+&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (Position[id].x-GridCenterX)*InvGridSize);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; GridPosition[id].y = (&lt;span style="color: blue;"&gt;int&lt;/span&gt;)(GridOffset+&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (Position[id].y-GridCenterY)*InvGridSize);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; GridPosition[id].z = (&lt;span style="color: blue;"&gt;int&lt;/span&gt;)(GridOffset+&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(Position[id].z-GridCenterZ)*InvGridSize);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: green; font-family: &amp;quot;Courier New&amp;quot;; font-size: 9.5pt;"&gt;// Hash-Grid-Index berechnen:&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;; font-size: 10pt;"&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; GridIndex[id].x =&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;GridPosition[id].x % HalfNumCollisionGridElementsXDirPlus1 +&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;HalfNumCollisionGridElementsXDirMinus1;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; GridIndex[id].y =&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;GridPosition[id].y % HalfNumCollisionGridElementsYDirPlus1 +&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;HalfNumCollisionGridElementsYDirMinus1;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; GridIndex[id].z =&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;GridPosition[id].z % HalfNumCollisionGridElementsZDirPlus1 +&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;HalfNumCollisionGridElementsZDirMinus1;&lt;br /&gt;
}&lt;/span&gt;&lt;span style="color: green; font-family: &amp;quot;Courier New&amp;quot;; font-size: 9.5pt;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;b&gt;Hinweis:&lt;/b&gt;&lt;br /&gt;
&lt;div class="MsoNormal"&gt;Für die Ausführung dieses Programmbeispiels muss der Treiber Ihrer Grafikkarte die OpenGL Version 3.3 unterstützen. &lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;b&gt;Visual  C++ 2010: &lt;a href="http://dl.dropbox.com/u/6748497/DemoWithOpenGL2010_Tut48.zip" target="_blank"&gt;DemoWithOpenGL2010_Tut48&lt;/a&gt;&lt;/b&gt;&lt;a href="http://dl.dropbox.com/u/6748497/DemoWithOpenGL2010_Tut46.zip" target="_blank"&gt;  &lt;/a&gt;&lt;br /&gt;
&lt;div class="MsoNormal"&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5159939380865750407-2901625638669499024?l=www.spieleprogrammierung.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Spieleprogrammierung/~4/zXJTXBobbMA" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5159939380865750407/posts/default/2901625638669499024?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5159939380865750407/posts/default/2901625638669499024?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Spieleprogrammierung/~3/zXJTXBobbMA/opencl-tutorial-masspoint-movement.html" title="OpenCL Tutorial – Masspoint Movement, Collision Hash Grids (Download)" /><author><name>Alex</name><uri>http://www.blogger.com/profile/12911562805026944414</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><feedburner:origLink>http://www.spieleprogrammierung.net/2011/09/opencl-tutorial-masspoint-movement.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEQERnw6fCp7ImA9WhdVEUU.&quot;"><id>tag:blogger.com,1999:blog-5159939380865750407.post-3759053537143530959</id><published>2011-09-16T16:11:00.000+02:00</published><updated>2011-09-16T16:11:47.214+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-16T16:11:47.214+02:00</app:edited><title>Neufassung der Artikelserie zum Thema Wegfindung</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/2-d_FZ_xSpnze48mbFpKGADEUhM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/2-d_FZ_xSpnze48mbFpKGADEUhM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/2-d_FZ_xSpnze48mbFpKGADEUhM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/2-d_FZ_xSpnze48mbFpKGADEUhM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;Die Artikel zum Thema Wegfindung wurden komplett neu verfasst und orientieren sich nun direkt an den folgenden Programmbeispielen:&lt;br /&gt;
&lt;div class="MsoNormal"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;b style="mso-bidi-font-weight: normal;"&gt;OpenGL-Programmbeispiel:&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;a href="http://www.spieleprogrammierung.net/2010/04/opengl-3-wegpunkte-navigation-download.html" target="_blank"&gt;http://www.spieleprogrammierung.net/2010/04/opengl-3-wegpunkte-navigation-download.html&lt;/a&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;b style="mso-bidi-font-weight: normal;"&gt;OpenGL-Framework-Programmbeispiel:&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;a href="http://www.graphics-and-physics-framework.spieleprogrammierung.net/2011/05/tutorial-13-wegfindung-flocking.html" target="_blank"&gt;http://www.graphics-and-physics-framework.spieleprogrammierung.net/2011/05/tutorial-13-wegfindung-flocking.html&lt;/a&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;b style="mso-bidi-font-weight: normal;"&gt;Artikel 1: &lt;a href="http://www.spieleprogrammierung.net/2010/03/ki-programmierung-teil-7-wegfindung.html" target="_blank"&gt;Wegfindung – Einführung&lt;/a&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;b style="mso-bidi-font-weight: normal;"&gt;Artikel 2: &lt;a href="http://www.spieleprogrammierung.net/2010/03/ki-programmierung-teil-9-entwurf-eines.html" target="_blank"&gt;Entwurf eines Wegpunkte-Systems&lt;/a&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;b style="mso-bidi-font-weight: normal;"&gt;Artikel 3: &lt;a href="http://www.spieleprogrammierung.net/2010/03/ki-programmierung-teil-10-routinen-fur.html" target="_blank"&gt;Routinen für die Wegfindung&lt;/a&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5159939380865750407-3759053537143530959?l=www.spieleprogrammierung.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Spieleprogrammierung/~4/ATV1WxW4sKU" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5159939380865750407/posts/default/3759053537143530959?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5159939380865750407/posts/default/3759053537143530959?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Spieleprogrammierung/~3/ATV1WxW4sKU/neufassung-der-artikelserie-zum-thema.html" title="Neufassung der Artikelserie zum Thema Wegfindung" /><author><name>Alex</name><uri>http://www.blogger.com/profile/12911562805026944414</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><feedburner:origLink>http://www.spieleprogrammierung.net/2011/09/neufassung-der-artikelserie-zum-thema.html</feedburner:origLink></entry></feed>

