# 2 Androidspezifische Fragen..



## Robokopp (5. Apr 2012)

Hallo

ich bin dabei ein Spiel für Android zu Entwickeln.

Die Darstellung der Spielelemente erfolgt über Canvas(Derzeit nur Rechtecke).Meine Bilddateien liegen im drawable Ordner.

Wie kann ich nun diese Bilder als Bitmap auf das Canvas zeichnen?
Ich würde gerne in meiner GameActivityklasse, welche von View erbt, die Bilddaten einlesen und dann an die jeweiligen Objektinstanzen übermitteln, wo sie in der onDraw Methode gezeichnet werden sollen.
Die Bilder sollen skalierbar und logischerweise auch frei positionierbar sein.
Bis auf Crashes hab ich hier noch nichts erreicht.Offenbar hab ich falsch konvertiert von Drawable zu Bitmap.
2. Frage:

Ich habe eine onPause Methode in der Klasse, die meinen View aufruft.Hier pausiere ich per boolean sowohl alle Canvasoperationen, als auch die Logik.Das funktioniert perfekt.
Jedoch bekomme ich trotz pausiertem Spiel eine CPU Auslastung von 47-49% angezeigt.Das einzige, was währen dem pausieren weiterläuft, ist die Whileschleife(ohne Methodenaufrufe) in der GameLoop, die eigentlich nicht für die Auslastung verantwortlich sein kann.

Kleiner Zusatz:

Ich habe mich noch nicht mit Handlern befasst.Folglich verwende ich auch keine(nur falls es damit zusammenhängen könnte)


----------



## nillehammer (5. Apr 2012)

> Jedoch bekomme ich trotz pausiertem Spiel eine CPU Auslastung von 47-49% angezeigt.Das einzige, was währen dem pausieren weiterläuft, ist die Whileschleife(ohne Methodenaufrufe) in der GameLoop, die eigentlich nicht für die Auslastung verantwortlich sein kann.


Doch, es ist erstaunlich (eigentlich nicht, wenn man drüber nachdenkt), aber eine Endlosschleife ohne Kommandos belastet die CPU erheblich. Da helfen nur Thread.sleeps. Vergleiche mal die CPU-Auslastung bei folgenden Codeabschnitten, in dem Du jeweils einen auskommentierst und dann per top/Taskmanager/o.ä. die CPU-Last des java-Prozesses anschaust:

```
/**
	 * @param args
	 */
	public static void main(String[] args) throws Throwable {

		while(true) {
			// do nothing		
                          }

		while(true) {
			Thread.sleep(10);
		}

	}
```


----------



## Network (5. Apr 2012)

Was bereits nillehammer sagte, die hohe CPU-Auslastung kommt daher, da das Programm ja trotzdem ununterbrochen eine Schleife ausführt. Also Code. Zwar berechnet es keine großen Rechenoperationen, dafür aber winzige so oft, dass diese Berechnungen wiederum an große Rechenoperationen herankommen 

Wegen fehlendem Code und der berühmten Glaskugel die in der Reparatur ist, kann ich auch nicht sagen, was genau du an deinem Code falsch machst. Weil wir ihn nicht sehen können 

Ich vermute aber mal du machst sowas ähnliches wie (Pseudocode)

```
while(true) {
     if( !pause ) {
     }
     else {
          Thread.sleep(100);
     }
}
```

Das wäre die falsche Herangehensweise! Bzw. falsch ist so ein böses Wort, es ist aber nicht gerade sinnbehaftet. 

Hier solltest du Events nutzen, im Sinne von:

```
Thread.wait();
Thread.notify();
```
Oder eben (und das ist die standartisierte Herangehensweise):
Beim Verlassen, den Thread komplett beenden, und bei onResume einen neuen Thread starten. Ist ja nicht so schwer 

Gruß
Network


----------



## Robokopp (5. Apr 2012)

Deine glaskugel hat recht obwohl sie in Reparatur ist 

Wenn ich allerdings den Thread terminiere, und einen neuen starte,fängt das Spiel normalerweise von vorne an. hmm..
Aber gut danke. Das mit den events werde ich mal versuchen
Gesendet von meinem GT-I9100 mit Tapatalk


----------



## Robokopp (5. Apr 2012)

Ah vlt noch eine frage ^^ ich hab den spielebereich auf fullscreen gesetzt. Leider sieht man oben am Rand ganz schwach die Android leiste. Ist das normal?
Ich hoffe das sieht man auf dem Bild.






Gesendet von meinem GT-I9100 mit Tapatalk


----------

