Performance Tipps für Spieleprogrammierung

  • Antworten:62
Andy N.
  • Forum-Beiträge: 3.112

11.03.2011, 17:04:21 via Website

int ist in Java glaub ich kein Objekt. Jedenfalls gibt es die Methode void writeInt( int i )

L3322Ansgar M

Antworten
L3322
  • Forum-Beiträge: 467

14.03.2011, 22:09:12 via Website

Okay:
1fos = mContext.openFileOutput("score", Context.MODE_PRIVATE);
2 out = new ObjectOutputStream(fos);
3 out.writeInt(score);
Schmeißt mir keine exception etc.

Aber auslesen:
1try {
2 is = mContext.openFileInput("score");
3 try {
4 ois = new ObjectInputStream(is);
5 score = ois.readInt();
6 Log.e("GAMEVIEW", "score : " + score);
7 new File(path + "score").delete();
8 GameMode = PAUSE;
9
10 } catch (StreamCorruptedException e) {
11 Log.e("GAMEVIEW", "StreamCorruptedException : " + e);
12 } catch (IOException e) {
13 Log.e("GAMEVIEW", "IOException : " + e);
14 }
15 } catch (FileNotFoundException e) {
16 score = 0;
17 GameMode = RUNNING;
18 Log.e("GAMEVIEW", "No Game to Resume");
19 }

Error Log:
1ERROR/GAMEVIEW(7982): IOException : java.io.EOFException

Aber wenn ich readInt() zu read() ändere bekomme ich immernoch -1 obwohl score >= 1 ist!!

LG L3322

— geändert am 14.03.2011, 22:17:20

"Hard work beats talent, when talent fails to work hard"

Antworten
L3322
  • Forum-Beiträge: 467

15.03.2011, 16:45:16 via App

ich hasse Leichtsinnsfehler
Ja flush habe ich vergessen!
Danke

Achja wenn noch irgendwer Tipps hat her damit :grin:

"Hard work beats talent, when talent fails to work hard"

Antworten
L3322
  • Forum-Beiträge: 467

15.03.2011, 18:29:41 via Website

Zack nächste Frage:
Mein Spiel durchläuft ja pro Update des Spiel über den Thread mehrere Prozesse und wenn onPause() aufgerufen wird läuft dann ein Prozess komplett zu Ende oder hält das Spiel mittendrin an?

"Hard work beats talent, when talent fails to work hard"

Antworten
L3322
  • Forum-Beiträge: 467

30.03.2011, 12:47:59 via App

So ich mal wieder...:V
Meine Kollisionen zwischen Objekten erkenne ich mittels rect.intersect(rect2);

Allerdings sind die meisten meiner Objekte Oval oder Dreieck!

Gibt es da etwas wie ich erkennen kann wann sich beispielsweise ein oval und ein dreieckig überschneiden?

liebe Grüße l3322

— geändert am 03.04.2011, 21:30:52

"Hard work beats talent, when talent fails to work hard"

Antworten
Gelöschter Account
  • Forum-Beiträge: 5

31.03.2011, 12:36:26 via Website

Also ohne den Thread gänzlich gelesen zu haben, hätte ich ein paar Bemerkungen:

OpenGL ist nicht unbedingtes "Muss" für ein Spiel. Wer sich ein paar FPS Test Tools angesehen hat, wie z.B. SpriteMethodTest von Google, der wird erkennen, das OpenGL da oftmals gar keine großen Vorteile bringt. Bei mir renderte der Test auch noch 800 Bitmaps die sich bewegen mit 47FPS. openGL ist da sogar schlechter im Test.

Wie auch immer. OpenGl hat sicher seine Vorzüge, z.B. im 3D Bereich, oder wenn man sein Spiel Multithreaden will und dann die Last auf CPU und auf GPU legt (wie im ReplicaIsland Demo) Zudem ist es "einfacher" OpelnGl eine konstante, rucketfreie Framerate zu bekommen. Wenn man alles auf der CPU macht, dann wird das Rendereing hier und da mal von der GarbageCollection unterbochen und das kann kein Ziel sein, wenn man ein Realtime Spiel programmieren will

Das ist auch so in etwa der Dreh und Angelpunkt.Ich hatte Anfangs auf "riesige" Probleme mit Canvas Rendering. Das ist aber nicht darin zu begründen, dass es schlecht ist, sondern das man auf Dinge aufpassen muss, die einen sonst nicht sonderlich tangieren. Um es auf den Punkt zu bringen, man muss die Garbage Colection "komplett" ausschalten indem man einfach alles allokiert was man braucht. Das ist erstmal einfacher gesagt als getan, denn auch Strings, ArrayListen, Iteratoren Objekte oder sonstige Collections erzeugen zur Laufzeit Objekte die wieder weggeschmissen werden.

Meine neue "Spielarchitektur" baut da auf Passive und Aktive FastArrays die sich gegenseitig die Objekte hin und herschieben und ich bin bis dato sehr erfreut über die Performance die noch nie unter 60 FPS gesunken ist.

Antworten
L3322
  • Forum-Beiträge: 467

03.04.2011, 21:32:31 via App

L3322
So ich mal wieder...:V
Meine Kollisionen zwischen Objekten erkenne ich mittels rect.intersect(rect2);

Allerdings sind die meisten meiner Objekte Oval oder Dreieck!

Gibt es da etwas wie ich erkennen kann wann sich beispielsweise ein oval und ein dreieckig überschneiden?

liebe Grüße l3322
Ich weiß man pusht nicht aber wie könnte ich das am besten machen?

— geändert am 03.04.2011, 21:33:11

"Hard work beats talent, when talent fails to work hard"

Antworten
L3322
  • Forum-Beiträge: 467

24.05.2011, 22:45:13 via App

Ich hab mich jetzt die letzten Monate, zumindest in die 2d spieleentwicklung eingearbeitet und an alle :
beachtet die Performance Tipps hier im thread bitte von Anfang an! Ihr spart euch damit eine Menge Zeit! (ich hab da jetzt noch einige stunden daran zu arbeiten!). und ich denke der wichtigste Punkt ist die Garbage Collection!

ach ja vielen Dank an alle die mir geholfen haben! I love you :grin:

"Hard work beats talent, when talent fails to work hard"

Antworten
L3322
  • Forum-Beiträge: 467

09.07.2011, 12:45:05 via Website

Ich habe mir jetzt nach einer Programmierpause:bored: mal folgende Idee für die Performance meines Spiels überlegt:
Alle Objekte die bei Start benötigt werden in einer ArrayList
1ArryList<Money> startMoney
geaddet,
die Objekte die ich auf den Bildschirm male sind in einer anderen Liste
1ArryList<Money> moneyList
die bei start erstmal nichts beinhält!
bei bedarf mach ich folgendes:
1moneyList.add(startMoney.get(0)); startMoney.remove(0);
.
Somit kann ich die Objekte einfach hin und her verschieben!

Ist der Gedanke richtig und auch performant oder soll ich das anders angehen??

danke

"Hard work beats talent, when talent fails to work hard"

Antworten
L3322
  • Forum-Beiträge: 467

10.07.2011, 17:16:55 via App

Ich weiß man pusht nicht allerdings wüsste ich gerne ob diese Art perfekt ist oder ob es irgendwie noch performanter geht.

Entschuldigung fürs pushen und danke

"Hard work beats talent, when talent fails to work hard"

Antworten
Aeefire
  • Forum-Beiträge: 172

12.07.2011, 11:09:12 via Website

Mac Systems
Du musst nicht wissen wann eine Sekunde vergangen ist sonder nur wie viel Zeit vergangen ist:

now = System.nanoTime
dif = now - last;
last = now;

this.

google mal nach "deltaTime" ...sonst kann ich noch das Buch / ebook Android Games for Beginners oder so empfehlen... da wird das schon am Anfang recht schön erklärt

Antworten