Probleme mit App auf Galaxy S3?

bruce85

Bekanntes Mitglied
Hallo,
ich habe in java-Android ein Spiel geschrieben und es läuft auf mein Galaxy Ace problemlos.
Jetzt habe ich das Spiel mal auf Galaxy S3 getestet und es wird beim Starten des Spiels angehalten.

Eclipse meldet folgendes:
Java:
01-06 18:44:26.950: E/AndroidRuntime(26755): FATAL EXCEPTION: main
01-06 18:44:26.950: E/AndroidRuntime(26755): java.lang.OutOfMemoryError
01-06 18:44:26.950: E/AndroidRuntime(26755): 	at android.graphics.Bitmap.nativeCreate(Native Method)
01-06 18:44:26.950: E/AndroidRuntime(26755): 	at android.graphics.Bitmap.createBitmap(Bitmap.java:640)
01-06 18:44:26.950: E/AndroidRuntime(26755): 	at android.graphics.Bitmap.createBitmap(Bitmap.java:586)
01-06 18:44:26.950: E/AndroidRuntime(26755): 	at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:466)
01-06 18:44:26.950: E/AndroidRuntime(26755): 	at eu.falko.blocks3d.MenuActivity.onCreate(MenuActivity.java:198)
01-06 18:44:26.950: E/AndroidRuntime(26755): 	at android.app.Activity.performCreate(Activity.java:5184)
01-06 18:44:26.950: E/AndroidRuntime(26755): 	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1083)
01-06 18:44:26.950: E/AndroidRuntime(26755): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2064)
01-06 18:44:26.950: E/AndroidRuntime(26755): 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2125)
01-06 18:44:26.950: E/AndroidRuntime(26755): 	at android.app.ActivityThread.access$600(ActivityThread.java:140)
01-06 18:44:26.950: E/AndroidRuntime(26755): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1227)
01-06 18:44:26.950: E/AndroidRuntime(26755): 	at android.os.Handler.dispatchMessage(Handler.java:99)
01-06 18:44:26.950: E/AndroidRuntime(26755): 	at android.os.Looper.loop(Looper.java:137)
01-06 18:44:26.950: E/AndroidRuntime(26755): 	at android.app.ActivityThread.main(ActivityThread.java:4898)
01-06 18:44:26.950: E/AndroidRuntime(26755): 	at java.lang.reflect.Method.invokeNative(Native Method)
01-06 18:44:26.950: E/AndroidRuntime(26755): 	at java.lang.reflect.Method.invoke(Method.java:511)
01-06 18:44:26.950: E/AndroidRuntime(26755): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006)
01-06 18:44:26.950: E/AndroidRuntime(26755): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773)
01-06 18:44:26.950: E/AndroidRuntime(26755): 	at dalvik.system.NativeStart.main(Native Method)

Es liegt an dieser Zeile:
Java:
try {
			String str=null;

			InputStream is = getResources().openRawResource(R.drawable.maps);
			
	        BufferedReader r = new BufferedReader(new InputStreamReader(is,"ISO-8859-1"));
	        String zeile;
	        while ((zeile = r.readLine()) != null) {
..............................................................

Die Datei Map kann wahrscheinlich nicht geladen werden, aber auf mein Galaxy Ace funktioniert es ohne probleme.

Die Bilder lade ich ja auch aus dem res Ordner und es funtioniert:
background = BitmapFactory.decodeResource(getResources(),R.drawable.background);

Nur bei Galaxy S3 meckert er, wenn ich ein InputStream lade, woran könnte das Problem denn liegen?
Gibt es Vielleicht eine andere möglichkeit, das es auch bei Galaxy S3 funktioniert?

Ich bedanke mich schonmal im Voraus.

MfG
 
Eclipse meldet folgendes:
Java:
01-06 18:44:26.950: E/AndroidRuntime(26755): FATAL EXCEPTION: main
01-06 18:44:26.950: E/AndroidRuntime(26755): java.lang.[COLOR="Red"]OutOfMemoryError[/COLOR]
01-06 18:44:26.950: E/AndroidRuntime(26755): 	at android.graphics.Bitmap.nativeCreate(Native Method)
[/QUOTE]

Wenn du OpenGL ES verwendest kannst du nach dem Laden der Bitmap in OpenGL bitmap.recycle() aufrufen. Das sollte den Arbeitsspeicher wieder entlasten.
Aber ich denke es sollte klar sein, dass wenn du zuviele Daten in den Arbeitsspeicher legst diese irgendwann kein Platz mehr hat. Da helfen keine kleinen Tricks im Code sondern nur effizientes Ressourcenmanagement.

Gruß
Net
 
Danke Dir.

Ich benutze kein OpenGL ES.

Wieso funktioniert das Spiel dann auf Galaxy Ace?

Die Bilder können ja alle geladen werden, nur wenn ich die Map.txt lade, dann wird die App einfach angehalten.

Gibt es keine andere möglichkeit eine Textdatei erfolgreich zu laden?

MfG
 
Ein einziger Tropfen Wasser kann ein Fass auch zum Überlaufen bringen, so ist es jetzt auch bei dir.

Kann es sein, dass du zufälligerweise an hdpi oder xhdpi angepasste Grafiken verwendest? Wenn die zu groß sind bzw. so groß das dann das Text-File zusätzlich, zu viel Speicher verbrauchen stürzt das ganze mit einem OutOfMemory Error ab.

Am besten ist, wenn du mit einem Memory Tracer mal reinschaust woran es wirklich liegt. Ich hab zu dem Thema mal einen Artikel geschrieben, vielleicht hilft er dir.
 
Ich danke Dir.

Ich hab nebenbei noch mal gegoogelt und habe gelesen, das Skalieren der Bitmaps viel speicher brauchen, stimmt das?

In meinem Spiel Skalieren ich einige Bitmaps, die ich auf die gewünschte Bildschirmgröße anpasse.
Jetzt weiss ich nicht, ob es daran liegen könnte.

Was meint Ihr?

MfG
 
Ja das stimmt. Zu dem Thema wurde bei der Google IO 2009 etwas gesagt.

Zusammengefasst läuft es darauf hinaus, dass du ein Grafikset verwendest, dies auf eine Bitmap zeichnest und dann dieses Bitmap an die jeweilige Screen-Größe angepasst skaliert zeichnest.

Das hat gleich 3 Vorteile:
1. Nur ein statt 4 Grafik-Sets
2. Nur eine Skalierung
3. Du kommst auch mit obskuren bzw. unüblichen Auflösungen zurecht.
 
Vielen Dank.

Noch eine Frage:
Könnte es auch Vielleicht daran liegen, das ich die Bilder und Dateien nur im Ordner drawable-ldpi habe?
Oder muss ich in den anderen 3 Ordners die Bilder auch einfügen?

Ich dachte mir das so, wenn er die Bilder für die bestimmte größe nicht findet, das er die dann aus diesen Ordner drawable-ldpi nimmt.

Danke schonmal.

MfG
 
Danke Dir.

Ich werde die ganzen Bilder jetzt dementsprechend mit Photoshop verkleinern bzw. vergrößern für die jeweilige Bildschirmgröße, um mehr Speicher zu sparen.

MfG
 
Hä? Du sollst genau nicht für jede Screen-Auflösung eigene Bilder erstellen sondern das im Code machen.

Du zeichnest dann in ein Bitmap-Canvas, das resultierende Bitmap skalierst du auf den tatsächlichen Bildschirm und zeichnest das dann. Hast du dir das Video angeschaut?
 
Hä?
Hatte ich doch erst gehabt und es hatte auf mein Galaxy S5363 und Galaxy S5830i problemlos funktioniert, bis ich es auf Galaxy S3 getestet hatte, da geht garnix, angeblich Außerhalb des Speichers etc.

Grade bei ältere Handys hätte ich mir das vorstellen können, das es nicht geht, aber doch nicht bei Galaxy S3 das es dort einfach nicht geht, obwohl das viel schneller sein sollte aber doch Probleme macht.

Mir bleibt keine andere Wahl, außer die Bilder zu bearbeiten für die 4 Drawable:
drawable-hdpi
drawable-ldpi
drawable-mdpi
drawable-xhdpi

Edit: Achso, jetzt hab ich es verstanden, auf ein Bitmap Canvas zeichne ich meine Bitmaps und diese Bitmap Canvas skalliere ich dann einfach auf die tatsächliche Bildschirmgröße.
Ich werde es später mal testen und vielen Dank für die Hilfe.

MfG
 
Zuletzt bearbeitet:
"Obwohl das viel schneller sein sollte..."
Du vergleichst dein Galaxy S3 mit einem Galaxy Ace?

Das Ace hat eine Bildschirmauflösung von 320x480
Das GS3 hat eine Bildschirmauflösung von 1.280x720
Das ist ein 1280/320 * 720/480 = ~8 mal größerer Bildschirm.

Das Ace hat einen Arbeitsspeicher von 384 MB
Das GS3 hat einen Arbeitsspeicher von 1024 MB
Das ist ein 1024 / 384 = ~2,6 mal größerer Arbeitsspeicher
(Abgezogen muss eigentlich noch der größere RAM-Verbrauch der GS3 Androidversion)

Mit anderen Worten, das Ace hat in Relation zur Bildschirmgröße einen größeren Arbeitsspeicher als das GS3, es kann also mehr Bilder auf die Bildschirmgröße skalieren.

Gruß
Net
 
Vielen Dank für die information.

Da gibts aber noch ein Problem:
Wenn ich ein Bitmap Canvas verkleiner dann stimmen die berechnungen der einzelnen Bitmaps nicht mehr überein.
Das Problem hatte ich damals, z.B. habe ich eine Tile Map mit Mausberechnungen und diese berechne ich ja z.B. über die einzelne Bitmaps (breite und höhe), wenn ich dann nur das Bitmap Canvas an die Bildschörmgröße anpasse, bekomme ich dann auch die (breite und höhe) in Pixel von den einzelnen Bitmaps, die in ein Bitmap Canvas liegen?

MfG
 
Schau dir die Talks an von dem Typen den ich oben verlinkt habe. Der behandelt das entweder in seinem Talk 09, 10 oder 11 und erklärt das sehr gut.
 

Zurück
Oben