<?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; Technik</title>
	<atom:link href="http://www.androidig.de/index.php/tag/technik/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>Aufschlüsselung des Stromverbrauchs beim Galaxy</title>
		<link>http://www.androidig.de/index.php/2009/08/05/aufschlusselung-des-stromverbrauchs-beim-galaxy/</link>
		<comments>http://www.androidig.de/index.php/2009/08/05/aufschlusselung-des-stromverbrauchs-beim-galaxy/#comments</comments>
		<pubDate>Wed, 05 Aug 2009 10:10:20 +0000</pubDate>
		<dc:creator>flo</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Samsung Galaxy]]></category>
		<category><![CDATA[Smartphones]]></category>
		<category><![CDATA[Akku]]></category>
		<category><![CDATA[Stromverbrauch]]></category>
		<category><![CDATA[Technik]]></category>

		<guid isPermaLink="false">http://www.androidig.de/?p=284</guid>
		<description><![CDATA[
Die Akkulaufzeit der aktuellen Android-Smartphones ist ja nach wie vor ein heiß diskutiertes Thema. Es kursieren die wildesten Gerüchte, welche Funktionen besonders viel Strom brauchen oder dass bestimmte Anwendungen gar eine Hauptschuld an der recht kurzen Akkulaufzeit haben.
Angeregt durch diesen Thread im Android-Hilfe.de-Forum habe ich mir vorgenommen, der Sache genauer auf den Grund zu gehen [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.androidig.de/wp-content/uploads/2009/08/strom_front.png" alt="" title="" width="570" height="141" class="alignnone size-full wp-image-283" /></p>
<p>Die Akkulaufzeit der aktuellen Android-Smartphones ist ja nach wie vor ein heiß diskutiertes Thema. Es kursieren die wildesten Gerüchte, welche Funktionen besonders viel Strom brauchen oder dass bestimmte Anwendungen gar eine Hauptschuld an der recht kurzen Akkulaufzeit haben.<br />
Angeregt durch <a href="http://www.android-hilfe.de/o2-samsung-galaxy-i7500-forum/4537-stromverbrauch-messen-nicht-fuehlen.html" target="_blank">diesen Thread</a> im <em>Android-Hilfe.de</em>-Forum habe ich mir vorgenommen, der Sache genauer auf den Grund zu gehen und die Vermutungen und Gerüchte durch eine fundierte Messung zu überprüfen.<br />
<span id="more-284"></span></p>
<h2>&#8220;Versuchsaufbau&#8221;</h2>
<p>Ich wollte dazu einen Spannungsmesser zwischen Akku und Galaxy einbauen um darüber den Stromverbrauch zu messen (via eingebautem Widerstand im Stromkreis). Das stellte sich als nicht ganz so einfach heraus, da das Galaxy extrem feinfühlig ist, was seine Stromversorgung angeht. Alleine durch die Verkabelung sank die angezeigte Akkuladung um 50%, sobald ein Widerstand (1Ohm) eingebaut war, wollte es gar nicht mehr starten oder schaltete sich bei der ersten Belastung aus. Meine Tests fielen deshalb leider nicht so ausführlich aus, da ich die Probleme mit meinem bescheidenen Equipment nicht vollständig beseitigen konnte. Aufgrund der Ungenauigkeit der Messungen sind die folgenden Werte relativ zueinander zu betrachten. Größenordnungsmäßig befinden sich fast alle Angaben im Bereich von 20-80mA.</p>
<p><div id="attachment_286" class="wp-caption alignright" style="width: 351px"><img src="http://www.androidig.de/wp-content/uploads/2009/08/strom_modi.png" alt="Stromverbrauch der versch. Modi" title="Stromverbrauch der versch. Modi" width="341" height="302" class="size-full wp-image-286" /><p class="wp-caption-text">Stromverbrauch der versch. Modi</p></div><br />
<h2>Die verschiedenen Betriebsmodi</h2>
<p>Nun aber zu den nicht ganz uninteressanten Ergebnissen. Zuerst einmal habe ich den Stromverbrauch beim Starten, auf dem Homescreen direkt nach dem Start und mit eingeschaltetem Airplane-Modus (keinerlei Funkverbindung) gemessen. Wie man im Schaubild rechts sieht, benötigt der Bootvorgang mit Abstand am meisten Strom (~60mA), bereits etwa eine Minute fällt er um etwa 20% ab. Deaktiviert man alle Funkverbindungen, senkt sich der Stromverbrauch um weitere 30% &#8211; was eigentlich nicht viel ist, wenn man bedenkt, dass das Handy nun praktisch unbrauchbar ist.</p>
<p><div id="attachment_288" class="wp-caption alignleft" style="width: 349px"><img src="http://www.androidig.de/wp-content/uploads/2009/08/strom_display.png" alt="Verschiedene Displayhelligkeiten" title="Verschiedene Displayhelligkeiten" width="339" height="302" class="size-full wp-image-288" /><p class="wp-caption-text">Verschiedene Displayhelligkeiten</p></div><br />
<h2>Displayhelligkeit</h2>
<p>Doch was verbraucht dann so viel Strom? Um dieser Frage nachzugehen, habe ich als nächstes die Auswirkung der Displayhelligkeit getestet. Die Ergebnisse sind erstmal nicht überraschend: Je heller der Bildschirm, um so höher der Stromverbrauch. Der Unterschied zwischen dunkelster und hellster Einstellung beträgt jedoch nur 25%. Die mittlere Helligkeitsstufe kostet gar nur 10% mehr Strom.<br />
Offenbar sind AMOLED-Bildschirme also tatsächlich recht sparsam (wenngleich ich das Display nicht komplett deaktivieren konnte für eine echte Messung).<br />
Man kann also in Zukunft das Display ruhigen Gewissens etwas heller einstellen, der Akku wird es verzeihen.</p>
<h2>Weitere Ergebnisse</h2>
<p>Am Schluss nun noch drei interessante Werte, danach schaltete sich das Galaxy beim Aktivieren der internen Kamera leider ab und wollte auch nicht mehr wirklich weiterarbeiten. Die Tests von WLAN, GPS, aktivem Internet etc. fehlen daher leider erstmal. Falls jemand mit besserer Elektronikausrüstung diesbezüglich selbst Versuche durchführen möchte, würde ich mich natürlich sehr freuen <img src='http://www.androidig.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
<img src="http://www.androidig.de/wp-content/uploads/2009/08/strom_sonstiges.png" alt="Sonstige Angaben" title="Sonstige Angaben" width="325" height="301" class="alignright size-full wp-image-289" />Den höchsten Stromverbrauch habe ich beim Login in&#8217;s Handynetz gemessen (nach Eingabe der PIN). Der Wert ist dabei auf das Dreifache des Normalverbrauchs (Homescreen) gestiegen. Der niedrigste Stromverbrauch ergab sich erwartungsgemäß im Airplane-Modus bei aktivierter Tastensperre. Hier war keinerlei Verbrauch mehr messbar, was sich auch mit bekannten Beobachtungen deckt (hiermit könnten wohl die von der Werbung versprochenen 450 Stunden Standby-Zeit erreicht werden).<br />
Ganz beachtlich ist hingegen der enorme Anstieg des Verbrauchs von über 40% bei voller CPU-Last (die beiden Säulen ganz rechts). Dieser Wert hängt natürlich sicher auch immer von der Art der Auslastung bzw. den Randbedingungen ab, doch wer Akkulaufzeit sparen will, sollte hier wohl am ehesten ansetzen (jedoch <a href="http://www.androidig.de/index.php/2009/07/23/hintergrund-arbeitsspeicher-verwaltung-unter-android/" target="_blank">nicht unbedingt durch wahlloses Abschießen von Prozessen</a>).</p>
<h2>Fazit</h2>
<p>Alles in allem finde ich die Ergebnisse wirklich interessant und bin natürlich umso enttäuschter, dass ich nicht noch mehr Sachen überprüfen konnte. Vielleicht ergibt sich da ja noch was, dann folgt natürlich ein Teil 2.</p>
<p class="update"><b>Teil 2 gibts <a href="http://www.androidig.de/index.php/2009/08/07/aufschlusselung-des-stromverbrauchs-beim-galaxy-ii/">hier</a>!</b></p>
]]></content:encoded>
			<wfw:commentRss>http://www.androidig.de/index.php/2009/08/05/aufschlusselung-des-stromverbrauchs-beim-galaxy/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>
