<?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>Androidig.de &#187; Entwicklung</title>
	<atom:link href="http://www.androidig.de/index.php/tag/entwicklung/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.androidig.de</link>
	<description>Das Neueste aus der Android-Welt</description>
	<lastBuildDate>Fri, 26 Mar 2010 18:44:44 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=abc</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Spieleentwicklung mit Android: Sorgenkind &#8220;Performance&#8221;</title>
		<link>http://www.androidig.de/index.php/2009/08/31/spieleentwicklung-mit-android-sorgenkind-performance/</link>
		<comments>http://www.androidig.de/index.php/2009/08/31/spieleentwicklung-mit-android-sorgenkind-performance/#comments</comments>
		<pubDate>Mon, 31 Aug 2009 12:29:27 +0000</pubDate>
		<dc:creator>flo</dc:creator>
				<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Games]]></category>
		<category><![CDATA[Graviturn]]></category>
		<category><![CDATA[Technik]]></category>

		<guid isPermaLink="false">http://www.androidig.de/?p=375</guid>
		<description><![CDATA[Die Entwicklung von (kleineren) Spielen für die Android-Plattform ist selbst für Android-Neulinge (mit etwas Java-Erfahrung) kein großes Problem: Dank ausführlicher Beispiele und umfangreicher Dokumentation im SDK lassen sich schnell erste, ansehliche Ergebnisse erzielen. Vor allem, wenn man sich auf zwei Dimensionen beschränkt, genügen schon wenige Zeilen Code, um ein paar bewegte Grafiken auf das Display [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.androidig.de/wp-content/uploads/2009/08/opt_front.jpg" alt="opt_front" title="opt_front" width="300" height="241" class="alignright size-full wp-image-389" />Die Entwicklung von (kleineren) Spielen für die Android-Plattform ist selbst für Android-Neulinge (mit etwas Java-Erfahrung) kein großes Problem: Dank ausführlicher <a href="http://developer.android.com/intl/de/guide/samples/LunarLander/index.html" target="_blank">Beispiele</a> und umfangreicher <a href="http://developer.android.com/intl/de/guide/topics/graphics/index.html" target="_blank">Dokumentation</a> im SDK lassen sich schnell erste, ansehliche Ergebnisse erzielen. Vor allem, wenn man sich auf zwei Dimensionen beschränkt, genügen schon wenige Zeilen Code, um ein paar bewegte Grafiken auf das Display zu zaubern.<br />
So konnte auch ich meine Idee zum Spiel <a href="http://www.androidig.de/index.php/2009/08/22/graviturn-1-0-veroffentlicht/">Graviturn</a> recht schnell in eine spielbare Anwendung umsetzen, die meine Vorstellungen von Bedienbarkeit und grafischer Ausgestaltung weitestgehend erfüllte. Allerdings tat sich mit steigender Komplexität ein recht unerwartetes Problem auf: Die Performance des Spiels wurde mit jeder zusätzlichen Zeile Code mieser und die Framerate erreichte irgendwann den inakzeptablen Bereich von 15-25 Frames pro Sekunde (man konnte also ein gewisses Ruckeln bei schnellen Bewegungen feststellen).<br />
Über meine Erfahrungen auf dem Weg zu einem flüssigen, gut laufenden Spiel soll es daher nun im Folgenden gehen. <span id="more-375"></span></p>
<p><div id="attachment_380" class="wp-caption alignright" style="width: 260px"><a href="http://www.youtube.com/watch?v=U4Bk5rmIpic"><img src="http://www.androidig.de/wp-content/uploads/2009/08/googleiorealtimegames.jpg" alt="Google I/O 2009, Chris Pruett" title="googleiorealtimegames" width="250" height="200" class="size-full wp-image-380" /></a><p class="wp-caption-text">Google I/O 2009, Chris Pruett</p></div>Die meisten wichtigen Hinweise und Tipps habe ich dabei aus dem wirklich sehr empfehlenswerten, englischen Video <a href="http://www.youtube.com/watch?v=U4Bk5rmIpic" target="_blank">Google I/O 2009 &#8211; Writing Real-Time Games for Android</a> von Chris Pruett (Lafzeit: 1 Stunde).</p>
<h2>Threads + sauberer Code</h2>
<p>Zwei wichtige Punkte habe ich &#8220;glücklicherweise&#8221; von Anfang an richtig gemacht: der gesamte für das Spiel relevante Code (Physik-Berechnungen, Zeichnen, Spiel-Logik) war in einem gesonderten Thread (sodass ein langsames Spiel nicht die Anwendung selbst bremst und unbedienbar macht), und mein Code war recht sauber gegliedert: getrennte Methoden für Physik/Zeichnen/Benutzereingabe/&#8230; sowie eine vernünftige Unterteilung der Spielelemente (Spielfeld, Spielelemente) in entsprechende Klassen. Vor allem letzteres erleichtert jeglichen Umgang mit dem Code natürlich ungemein &#8211; sollte aber ja auch bei jedem Programmierer Standard sein <img src='http://www.androidig.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
Die weiteren Ausführungen beziehen sich jetzt stets auf den Teil des Spiels, der in erwähntem Thread läuft, sprich zigmal pro Sekunde abgearbeitet wird. Im Einzelnen also die Berechnung der Position der Objekte auf dem Spielfeld/des Spielers, Kollisionsberechnungen, das Zeichnen von Spielfeld/Spieler/Objekten usw.</p>
<h2>Messbarer Erfolg?</h2>
<p>Als ersten Schritt habe ich einen Zähler eingebaut, der die Zeit misst, die pro Frame zum Berechnen und Zeichnen benötigt wird, und diese Info alle paar Sekunden über die Debug-Konsole ausgibt ( <code>Log.d(&lt;String tag&gt;, &lt;String message&gt;);</code> ). Mit diesem Zähler war nun das Messinstrument für den Erfolg oder Misserfolg aller kommenden Optimierungen geschaffen.<br />
Eine Ausgabe innerhalb des Spiels selbst (etwa als Text, der auf die Zeichenoberfläche geschrieben wird) ist übrigens nicht empfehlenswert, da man sonst mit dieser Messung das Ergebnis ja bereits verfälschen würde.</p>
<h2>Speicherallokation und der Garbage Collector (GC)</h2>
<p><div id="attachment_387" class="wp-caption alignleft" style="width: 310px"><img src="http://www.androidig.de/wp-content/uploads/2009/08/garbage-collector.png" alt="Der GC ist ein echter Zeitfresser" title="Der GC ist ein echter Zeitfresser" width="300" height="183" class="size-full wp-image-387" /><p class="wp-caption-text">Der GC ist ein echter Zeitfresser</p></div>So ziemlich das schlimmste, was man innerhalb der Spielroutine überhaupt machen kann, ist das allokieren von Speicher, sprich das Erzeugen neuer Variablen/Objektinstanzen.<br />
Denn jedes Objekt wird irgendwann wieder durch den Garbage Collector freigegeben, sofern es nicht mehr benötigt wird. Üblicherweise wird der GC spätestens bei etwa 10.000-20.000 Objekte aktiv und gibt diese dann in einem Rutsch frei. Dies dauert jedesmal etwa <strong>200-400ms</strong>! In dieser Zeit wird das Spiel (bzw. das ganze System!) deutlich ausgebremst und die Framerate bricht für einen Moment komplett ein.<br />
Lösung: Eine Anwendung ohne Objektinstanzen? Natürlich nicht, schließlich müssen die Daten irgendwo verarbeitet und (zwischen-)gespeichert werden. Allerdings sollte man sämtliche Objekte, die man öfters benötigt, bereits <strong>zu Beginn des Spiels instanziieren</strong> und dann immer wieder darauf zugreifen. Das heißt konsequenterweise auch: </p>
<div class="tipp"><strong>Verzicht auf lokale Objekte</strong> zugunsten von globalen Objekten. </div>
<p>Das widerspricht grundsätzlich erstmal jedem guten Programmierstil, schließlich büßt man dadurch Übersichtlichkeit und Flexibilität ein. Doch das Opfer lohnt sich, denn der Garbage Collector ist häufig die größte Performancebremse.<br />
Bei Graviturn habe ich beispielsweise bei der Kollisionsberechnung (Ball -> Wand) sehr häufig mit Point-Objekten gearbeitet (zur Verarbeitung von x/y-Koordinaten), die in jedem Durchlauf bei Bedarf lokal erzeugt wurden. Das hat dazu geführt, dass etwa alle 1-2 Sekunden der Garbage Collector aktiv wurde, und diese Objekte freigegeben hat. Durch Nutzung von globalen Variablen oder simplen Datentypen (etwa zwei int für x und y) konnte dies drastisch reduziert werden. </p>
<div class="tipp">Ein sehr nützliches Hilfsmittel ist dabei <a href="http://developer.android.com/intl/de/guide/developing/tools/ddms.html" target="_blank">DDMS</a> (&#8221;Dalvik Debug Monitor&#8221;) aus den Android-Tools. Der DDMS bietet einen sogenannten &#8220;<strong>Allocation Tracker</strong>&#8220;, der sämtliche Allokationen protokolliert und inklusive der Position im Quellcode ausgibt. Damit lassen sich auf einfache Weise alle unnötigen Allokationen ausmachen und beseitigen.</div>
<p><div id="attachment_384" class="wp-caption alignnone" style="width: 485px"><img src="http://www.androidig.de/wp-content/uploads/2009/08/graviturn_alloc1.png" alt="Allokationstracker bei Graviturn" title="Allokationstracker bei Graviturn" width="475" height="160" class="size-full wp-image-384" /><p class="wp-caption-text">Allokationstracker bei Graviturn</p></div><br />
In meinem Fall konnte ich damit die Allokation auf ca. 100 Objekte alle 30 Sekunden beschränken. Da ein Level in meinem Spiel selten länger als ein bis zwei Minuten dauert, konnte ich den GC bequem zwischen den Leveln manuell auslösen ( <code>System.gc();</code> ), wo dies nicht weiter störend ist.</p>
<h2>Traceview verwenden (Android Profiler)!</h2>
<p><div id="attachment_385" class="wp-caption alignnone" style="width: 485px"><img src="http://www.androidig.de/wp-content/uploads/2009/08/graviturn_trace.png" alt="Traceview der Zeichenroutine von Graviturn" title="Traceview der Zeichenroutine von Graviturn" width="475" height="177" class="size-full wp-image-385" /><p class="wp-caption-text">Traceview der Zeichenroutine von Graviturn</p></div><br />
Allen Performancebremsen, die sich mit den allgemeinen Tipps nicht beseitigen lassen, kommt man spätestens mit &#8220;Traceview&#8221;, einem sehr mächtigen Werkzeug aus der Android-Tool-Sammlung, auf die Schliche. Es handelt sich dabei um einen sehr übersichtlichen <strong>Profiler</strong>, welcher rekursiv für jede (!) Methode, die innerhalb des Messzeitraumes aufgerufen wurde, anzeigt, wieviel Zeit diese benötigt hat (absolsut und relativ, inklusive und exklusive deren Untermethoden).<br />
Egal ob es eine langsame Kollisionserkennung, eine schlecht optimierte Zeichenroutine oder auch nur eine zu häufig durchlaufene Schleife ist: mit Traceview lässt sich<strong> jeder Flaschenhals aufspüren</strong>.<br />
Die Verwendung ist allerdings nicht unbedingt trivial und würde den Rahmen dieses Artikels sprengen, einen guten Einstieg vermittelt der entsprechende Artikel im <a href="http://developer.android.com/intl/de/guide/developing/tools/traceview.html" target="_blank"><strong>Dev Guide</strong></a>.</p>
<h2>Noch ein paar allgemeine Tipps</h2>
<ul>
<li><strong>Methodenaufrufe wenn möglich vermeiden</strong><br />
Da Methodenaufrufe immer zusätzlich Zeit kosten, sollte man beispielsweise Variablen einer Klasse lieber <code>public</code> machen, anstatt <code>get</code>- und <code>set</code>-Methoden zu verwenden. Zwar &#8220;unsauber&#8221;, aber schneller.</li>
<li><strong>Gleitkommazahlen (<code>float</code>) vermeiden. </strong><br />
Je nach benötigter Genauigkeit könnten skalierte <code>integer</code> den entscheidenden Geschwindigkeitsvorteil bringen. Allerdings setze ich zugunsten der Flexibilität weiterhin Gleitkommazahlen ein.</li>
<li>statische Methoden verwenden so oft es geht</li>
<li><strong>Keine Iteratoren verwenden</strong><br />
So praktisch und hübsch sie auch sein mögen, für die Performance sind sie leider schlecht. Mit einer simplen Schleife oder dergleichen lässt sich dasselbe sparsamer erreichen.</li>
</ul>
<p>Die Liste lässt sich schier beliebig erweitern (hier sei nochmal auf das Video verwiesen), genannt habe ich nur die Punkte, die ich selbst erfolgreich angewandt habe.</p>
<h2>Fazit</h2>
<p>Es macht Sinn, sich schon frühzeitig Gedanken über die Performance eines Spiels zu machen, um sich zeitraubende Nachbesserungen und Korrekturen am Ende der Entwicklung zu sparen. Gerade weil Android auf einer Vielzahl von unterschiedlichen Endgeräten laufen kann, ist es bei der Spieleentwicklung wichtig, stets ein Maximum an Optimierung herauszuholen, um auch auf schwächerer Hardware ein flüssiges und angenehmes Spielgefühl zu wahren.<br />
Im Fall von Graviturn konnte ich mit den hier aufgezählten Tipps die Framerate von ca. 20 Frames pro Sekunde auf über 50 steigern, was genug Puffer darstellt, um auf allen gängigen Geräten befriedigend zu laufen.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.androidig.de/index.php/2009/08/31/spieleentwicklung-mit-android-sorgenkind-performance/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>Graviturn 1.0 veröffentlicht</title>
		<link>http://www.androidig.de/index.php/2009/08/22/graviturn-1-0-veroffentlicht/</link>
		<comments>http://www.androidig.de/index.php/2009/08/22/graviturn-1-0-veroffentlicht/#comments</comments>
		<pubDate>Sat, 22 Aug 2009 11:43:32 +0000</pubDate>
		<dc:creator>flo</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[Games]]></category>
		<category><![CDATA[Graviturn]]></category>

		<guid isPermaLink="false">http://www.androidig.de/?p=345</guid>
		<description><![CDATA[Dank der Hilfe etlicher Betatester aus dem Blog und von android-hilfe.de  (Danke nochmal!) konnte ich gestern nach einigen korrigierten Fehlern und Änderungen mein erstes Spiel Graviturn im Android-Market veröffentlichen.

Google gibt sich auch dabei alle Mühe, das ganze möglichst einfach und verständlich zu gestalten, und dank dem ausführlichen DevGuide war das eigentliche Publizieren eine Sache von [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.androidig.de/wp-content/uploads/2009/08/screen1.png" alt="Graviturn" title="Graviturn" width="190" height="127" class="alignleft size-full wp-image-348" />Dank der Hilfe etlicher Betatester aus dem Blog und von android-hilfe.de  (Danke nochmal!) konnte ich gestern nach einigen korrigierten Fehlern und Änderungen mein erstes Spiel <em>Graviturn</em> im Android-Market veröffentlichen.<br />
<span id="more-345"></span><br />
Google gibt sich auch dabei alle Mühe, das ganze möglichst einfach und verständlich zu gestalten, und dank dem ausführlichen <a href="http://developer.android.com/intl/de/guide/publishing/publishing.html" target="_blank">DevGuide</a> war das eigentliche Publizieren eine Sache von wenigen Minuten (inklusive der Bezahlung von 25$ &#8220;Anmeldegebühr&#8221;).</p>
<p>Von dem Moment an habe ich natürlich gespannt auf die ersten Downloads beziehungsweise die ersten Bewertungen oder gar Kommentare gewartet – und schon nach wenigen Minuten gab&#8217;s die ersten fünf Sterne. Der schönste Lohn für all die Stunden Arbeit! <img src='http://www.androidig.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><img src="http://www.androidig.de/wp-content/uploads/2009/08/screen3.png" alt="Graviturn" title="Graviturn" width="190" height="127" class="alignright size-full wp-image-349" />Inzwischen (nach 16h) wurde das Spiel fast 2000 mal heruntergeladen und hat eine für mich sehr erfreuliche Bewertung von 4,65 Sternen <img src='http://www.androidig.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
Leider gab es &#8220;natürlich&#8221; auch wieder unerwartete Probleme, scheinbar stüzt bei manchen Benutzern das Spiel im 109. Level ab und auf dem HTC Hero stürzt sogar TouchFLO ab, sobald man das Telefon locked. Das sind leider Szenarien, die sich im Vorraus nur schwer testen lassen, nun wird&#8217;s wohl bald das erste Update geben. Dafür muss ich es allerdings erstmal schaffen, die Fehler (zumindest den ersten) zu reproduzieren&#8230;</p>
<p>Den versprochenen Blogeintrag zur Entwicklung des Spiels gibt&#8217;s übrigens auch noch irgendwann, allerdings stehen jetzt erstmal Klausuren an und die Zeit für anderes ist naturgemäß eher knapp&#8230;</p>
<div class="tipp"><img src="http://www.androidig.de/wp-content/uploads/2009/08/graviturn_qr.png" alt="graviturn_qr" title="graviturn_qr" width="69" height="68" class="alignright size-full wp-image-347" />Graviturn gibt es kostenlos im <a href="market://search?q=pname:com.fheft.graviturn">Android Market</a> (bzw. <a href="http://www.cyrket.com/package/com.fheft.graviturn">Cyrket</a>).</div>
]]></content:encoded>
			<wfw:commentRss>http://www.androidig.de/index.php/2009/08/22/graviturn-1-0-veroffentlicht/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Graviturn &#8211; (m)ein erster Versuch der Spiele-Entwicklung</title>
		<link>http://www.androidig.de/index.php/2009/07/30/graviturn-mein-erster-versuch-der-spiele-entwicklung/</link>
		<comments>http://www.androidig.de/index.php/2009/07/30/graviturn-mein-erster-versuch-der-spiele-entwicklung/#comments</comments>
		<pubDate>Thu, 30 Jul 2009 19:40:55 +0000</pubDate>
		<dc:creator>flo</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[Games]]></category>

		<guid isPermaLink="false">http://www.androidig.de/?p=251</guid>
		<description><![CDATA[ls leidenschaftlicher Programmierer war die freie und gute Erweiterbarkeit für mich natürlich ein wichtiges Kaufargument für ein Android-Phone, und so habe ich mich bereits vor dem Erwerb des Galaxys eine Weile mit dem Android-SDK auseinandergesetzt und ein wenig herumgespielt.
Neben unzähligen sinn- und funktionslosen Tests habe ich mich dann an etwas größeres gewagt: ein kleines, aber [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_253" class="wp-caption alignleft" style="width: 310px"><img src="http://www.androidig.de/wp-content/uploads/2009/07/play-300x200.png" alt="Graviturn" title="Graviturn" width="300" height="200" class="size-medium wp-image-253" /><p class="wp-caption-text">Graviturn</p></div>Als leidenschaftlicher Programmierer war die freie und gute Erweiterbarkeit für mich natürlich ein wichtiges Kaufargument für ein Android-Phone, und so habe ich mich bereits vor dem Erwerb des Galaxys eine Weile mit dem Android-SDK auseinandergesetzt und ein wenig herumgespielt.<br />
Neben unzähligen sinn- und funktionslosen Tests habe ich mich dann an etwas größeres gewagt: ein kleines, aber feines Spiel namens <i>Graviturn</i>.</p>
<p>Ziel des Spiels ist es, kleine rote Bälle vom Spielfeld zu rollen, indem man das Smartphone in die entsprechende Richtung neigt. Gleichzeitig dürfen aber ebenfalls vorhandene grüne Bälle genau dies nicht tun, man muss die einen also irgendwie loswerden und die anderen behalten. Glücklicherweise gibt es ein paar blaue Blöcke, an denen Bälle mit ein wenig Geschick und Knobelei abprallen oder blockiert werden, sodass man sich auf die anderen konzentrieren kann. Diese Blöcke kann man im weiteren Verlauf des Spiels auch teilweise selbst platzieren und entfernen, um bestimmte Wege zu blockieren oder zu öffnen.<br />
<div id="attachment_254" class="wp-caption alignright" style="width: 310px"><img src="http://www.androidig.de/wp-content/uploads/2009/07/win-300x200.png" alt="Gewonnen!" title="Gewonnen!" width="300" height="200" class="size-medium wp-image-254" /><p class="wp-caption-text">Gewonnen!</p></div>Erzeugt werden die Level zufällig, das Spiel ist damit praktisch unendlich lange spielbar. Allerdings steigt der Schwierigkeitsgrad (Anzahl Bälle, Anzahl Blöcke) natürlich mit jedem Level an.<br />
Als zusätzliche Motivation wird nach jedem absolvierten Level eine Mini-Statistik angezeigt, die das Ergebnis mit dem anderer Spieler vergleicht (über einen Online-Abgleich).</p>
<p>Veröffentlichen werde ich das Spiel wohl erst in einigen Tagen/Wochen, jetzt gilt es ersteinmal, mögliche Fehler zu finden und auszumerzen. Wer Lust hat, <strong>Beta-Tester</strong> zu spielen, darf sich natürlich gerne unter graviturn@androidig.de melden <img src='http://www.androidig.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><div id="attachment_255" class="wp-caption alignnone" style="width: 310px"><img src="http://www.androidig.de/wp-content/uploads/2009/07/hint-300x200.png" alt="Spielerkl&auml;rung" title="Spielerkl&auml;rung" width="300" height="200" class="size-medium wp-image-255" /><p class="wp-caption-text">Spielerkl&auml;rung</p></div>
]]></content:encoded>
			<wfw:commentRss>http://www.androidig.de/index.php/2009/07/30/graviturn-mein-erster-versuch-der-spiele-entwicklung/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>
