Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Chase

Alter Hase

  • »Chase« ist der Autor dieses Themas

Beiträge: 753

Wohnort: Nagaoka / Darmstadt / Düsseldorf

Beruf: fauler Studi

  • Private Nachricht senden

1

12.08.2006, 15:00

Performance-Fragen

Bisher dachte ich, um Performance muesste ich mich bei einem simplen 2D-Game nicht wirklich kuemmern, aber im laufe der Zeit haben sich schon einige Ruckler eingeschlichen die es zu beseitigen gilt..

Erst Mal zur Methode mit der ich Texturen lade: Da mein Game vergleichsweise viel Speicher braucht (fast 30MB bisher), geb ich alles so frueh wie moeglich wieder frei. Beispiel: Die Textur fuer einen Gegner wird erst geladen, wenn dieser das erste Mal erscheint. Gibt es keine Instanz dieses bestimmten Gegners mehr, wird auch die Textur freigegeben. Problem: Bei jedem Neuerscheinen muss neu geladen werden.
Allerdings hab ich das Gefuehl, dass ein Ruckeln nur beim allerersten Laden entsteht. Kann es sein, dass DirectX auch freigegebene Texturen irgendwo "archiviert" und sie nicht immer neu laden muss?
Und ganz Allgemein: Soll ich nicht besser bei Programmstart schon alles laden, und beim beenden erst wieder freigeben, oder ist das schlechter Stil?
Wenn ich Texturen ueberhaupt nicht Release, und warte bis das Programm beendet wird, macht die Tribase ja alles.. (oder?)

Dann zum Sound: Auch wenn vor Spielstart alle Sounddateien in Soundpffer geladen werden: Wenn der Sound das erste Mal abgespielt wird, entsteht ein Ruckeln. Wo kann das herkommen?

Danke schon mal.
"Have you tried turning it off and on again?"

Osram

Alter Hase

Beiträge: 889

Wohnort: Weissenthurm

Beruf: SW Entwickler

  • Private Nachricht senden

2

12.08.2006, 17:40

Als erstes solltest Du rausfinden, ob es wirklich daran liegt.
Also jeden Frame die Zeit für den Frame in ein Logdaei schreiben und ausserdem wenn Du eine Textur lädst. Wenn immer bei den langsamsten Frames steht, dass gerade eine Textur geladen wrd, dann musst Du in der Tat diese optimieren.


Sind die 30MB Hauptspeicher (wenn ja, dann IMO nicht das geringste Problem) oder VRAM? Im letzteren Fall könntest Du die VRAM Größe abfragen. Z.B. ich mache es mit unseren sogenannten Multiskins so dass diese bei 256+ MB VRAM beim Start einer Mission in das VRAM geladen werden, bei 128MB in den Hauptspeicher und bei 64 MB gehts wieder ganz anders.

Wenn Du nicht alles vorher laden kannst, wirds relativ aufwändig. Du solltest am Start der Mission schon möglichst viel "vorladen", solltest einen Thread zum Laden haben der ein paar Frames bevor z.B. eine Texture gebraucht wird aufgerufen wird und schon mal anfängt, und wann man was lädt oder wieder rausschmeisst ist eine halbe Kunst.
"Games are algorithmic entertainment."

Chase

Alter Hase

  • »Chase« ist der Autor dieses Themas

Beiträge: 753

Wohnort: Nagaoka / Darmstadt / Düsseldorf

Beruf: fauler Studi

  • Private Nachricht senden

3

12.08.2006, 18:31

Das mit dem Loggen hab ich mal gemacht, und in der Tat sind die Frames in denen eine, oder sogar mehrere Texturen geladen werden fast doppelt so lang (statt 10 20 Millisekunden)

Das mit dem Thread werd ich mal versuchen. Aber koennte es dann nicht passieren, dass die Textur noch nicht fertig geladen ist und man ein weisses Sprite bewunden kann?

Ausserdem sollte ich die Texturen wohl an zentraler Stelle verwalten. Ich hab mich da zwar auf den Texturmanager der Tribase verlassen, aber die Referenzen werden Trotzdem in den einzelnen Objekten gespeichert. (So hat meine Helicopter-Klasse zum Beispiel eine statische Member-Variable s_tex.. das ist so nix, oder?)

Wegen dem RAM: Ich hab ehrlich gesagt keine Ahnung wo genau die Daten sind. Alles was ich gemacht hab ist im Taskmanger nach dem Speicherverbrauch zu sehen. Ich denke 30MB sind schon viel, da vergleichbare Spiele mit einem Bruchteil davon auskommen.
Und der Speicher der fuer Texturen genutzt wird, erscheint da ja nichtmal..
"Have you tried turning it off and on again?"

Osram

Alter Hase

Beiträge: 889

Wohnort: Weissenthurm

Beruf: SW Entwickler

  • Private Nachricht senden

4

12.08.2006, 19:08

Zitat von »"Chase"«

Das mit dem Loggen hab ich mal gemacht, und in der Tat sind die Frames in denen eine, oder sogar mehrere Texturen geladen werden fast doppelt so lang (statt 10 20 Millisekunden)


Überraschend dass Du das "mit blossem Auge" sehen kannst. Wenn Du willst sende mir mal ein Log zu.

Zitat


Das mit dem Thread werd ich mal versuchen. Aber koennte es dann nicht passieren, dass die Textur noch nicht fertig geladen ist und man ein weisses Sprite bewunden kann?


Das ist was ich mit "halbe Kunst" meinte - es gibt je nach App jede Menge Möglichkeiten:
- Jedes Objekt hat auch ne Farbe und wird dann in der Farbe dargestellt.
- Du lädst von allen Texturen niedrige MipMaps vor
- Du stellst das Objekt nicht da bis die Texturen alle da sind
- Du wartest bis die Textur da ist, ist immer noch besser als was Du jetzt machst
- Du hast für alle Objekte eine Standardtextur, die erstmal genutzt wird.

Zitat


Ausserdem sollte ich die Texturen wohl an zentraler Stelle verwalten.


Das macht sicher Sinn.

Zitat


(So hat meine Helicopter-Klasse zum Beispiel eine statische Member-Variable s_tex.. das ist so nix, oder?)


Naja, wenn es ein Zeiger ist ists ok. Du musst halt a) selber bestimmen können wann Du lädst und nicht automatisch bei der heli Erstellung auch die Textur laden (und drauf warten) und b) wie gesagt u.U. zulassen dass der Heli ohne Textur behandelt wird.

Zitat


Wegen dem RAM: Ich hab ehrlich gesagt keine Ahnung wo genau die Daten sind. Alles was ich gemacht hab ist im Taskmanger nach dem Speicherverbrauch zu sehen. Ich denke 30MB sind schon viel, da vergleichbare Spiele mit einem Bruchteil davon auskommen.
Und der Speicher der fuer Texturen genutzt wird, erscheint da ja nichtmal..


Also an Deiner Stelle würde ich mir überlegen, den ganzen Aufwand sein zu lassen, einfach alles vor-zu-laden und die gewonnene Zeit in ein anderes cooles Feature zu stecken. Dazu solltest Du auf das VRAM achten, das ist kritischer. Und Du solltest "specs" mit minimalen Anforderungen haben, sodass Leuten klar ist, ob Ihr Rechner reicht oder nicht.
"Games are algorithmic entertainment."

Chase

Alter Hase

  • »Chase« ist der Autor dieses Themas

Beiträge: 753

Wohnort: Nagaoka / Darmstadt / Düsseldorf

Beruf: fauler Studi

  • Private Nachricht senden

5

13.08.2006, 03:35

Dank dir fuer die ausfuehliche Hilfe.

Zitat von »"Osram"«


Überraschend dass Du das "mit blossem Auge" sehen kannst. Wenn Du willst sende mir mal ein Log zu.

Das sah in etwa so aus (hab inzwischen schon wieder das logging aus dem code entfernt)

Quellcode

1
2
3
4
5
6
7
passed: 0.014564
passed: 0.015456
passed: 0.015365
Loading explosion texture
passed: 0.025469
passed: 0.026484
passed: 0.017456

Dazu ist zu sagen, dass die Explosionstextur wohl meine groesste ist (1.5MB) und ueberraschender Weise auch einige Frames nach dem Laden noch eine laengere passed-Zeit zu sehen ist. Das kann ich mir naemlich nicht erklaeren..

Zitat


Naja, wenn es ein Zeiger ist ists ok.

DirectX Texturen sind ja immer Zeiger. Naja ich werd einfach mal alles so lassen, mit der kleinen Aenderung die Texturen einfach nicht mehr zu entladen, bis der Level vorbei ist.

Diese Tricks zum kurzzeitigen ersetzen von Texturen kann man auf ein 2D-Game - oder zumindest meins - nicht gut anwenden.

Zitat von »"Osram"«


Und Du solltest "specs" mit minimalen Anforderungen haben, sodass Leuten klar ist, ob Ihr Rechner reicht oder nicht.

Hab ich auch, die lauten nur etwa so:
Processor: Pentium III 800 MHz or better
RAM: 128 MB or more
GFX: Direct x 9.0 supporting graphics card
In der blossen Annahme, "so ein kleines 2D Spiel braucht sicher nix" ;)
"Have you tried turning it off and on again?"

Werbeanzeige