Laden...

performance bei 3D-Spiel (Texturen/Timer)

Erstellt von habeKA vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.910 Views
H
habeKA Themenstarter:in
90 Beiträge seit 2007
vor 15 Jahren
performance bei 3D-Spiel (Texturen/Timer)

Moin moin,

also ich habe mich mal drann gesetzt und nen kleines 3D Game entwickelt.Naja nix besonderes einfach ein Labyrint mit ein paar Gegnern. Also wenn man so will sieht es aus wie Pacman 3D. Naja nun aber zur meiner Problem:

Also ich las die Gegner über einen Timer laufen, den Spieler und die Umwelt(also das Level).
Das läuft auch sehr sehr gut, nur performance mässig unter aller sau 😄.
Also unter aller sau heisst 253MB arbeitsspeicher frist das Spiel. Naja heutzutage ist das ja nix nur für so nen kleines Spiel doch relartiv viel.
Naja wo das Problem liegt weiss ich auch. In dem Timer für das Level wird nach einer bewegung des Spielers die Texturen immer wieder neu Berechnet und Geladen.

Meine Frage lautet also jetzt gibt es performatere lösungen um die Texturen zu überprüfen als in einem Timer?

mfg
habekA

There's no place like 127.0.0.1

3.971 Beiträge seit 2006
vor 15 Jahren

Welchen Timer verwendest du denn?

Speicherproblem bei Bilder und Texturen deutet eventuell auf ein vergessenes Dispose hin. Hast du das Programm mal längere Zeit laufen gelassen, steigt der Verbrauch an?

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

H
habeKA Themenstarter:in
90 Beiträge seit 2007
vor 15 Jahren

Welchen Timer verwendest du denn?

Den normalen Timer aus


System.Windows.Forms.Timer

Speicherproblem bei Bilder und Texturen deutet eventuell auf ein vergessenes Dispose hin.

Dachte ich zuerst auch nur es steigt nicht konstant sonder jenachdem was grade passiert.
Beispiel : Man kommt um die Ecke hat einen gegner vorsich und da man um die Ecke kommt werden die texturen neu geladen. Bääm maxwert 253MB.

There's no place like 127.0.0.1

3.971 Beiträge seit 2006
vor 15 Jahren

Dann hast du doch ein Speicherproblem. Du musst genau wissen, wann wird ein Textur gebraucht, wann wird eine Textur nicht mehr agezeigt/gebraucht, anschließend Ressourcen freigeben. Es kommt auch drauf an, wie du deine Texturen verwendest, immer das selbe für eine zweite Stelle oder eine Kopie/Clone davon.

Verwende den System.Threading.Timer, der sollte performanter sein. Wichtig, wenn du mit GDI zeichnest, Invoke nicht vergessen.

Ich kenne mich mit Spieleprogrammierung leider nicht aus, aber wäre es nicht sinnvoll die Gegnerische KI asynchron den nächsten Schritt/Bewegung zu berechnen.

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

H
habeKA Themenstarter:in
90 Beiträge seit 2007
vor 15 Jahren

Danke für die Tips.

Leider kenn ich mich auch noch nicht so gut aus in dem Bereich Spieleprogrammierung, deswegen kann ich dir jetzt noch nicht sagen ob die KI asynchron zu berechne besser ist.
Ich werde einfach mal deine Tips umsetzten und schaun 😉 und dann melde ich mich wieder

mfg

habekA

There's no place like 127.0.0.1

F
10.010 Beiträge seit 2004
vor 15 Jahren

Wenn du performat Spiele entwickeln willst, schau dir lieber das ( auch Kostenlose )
XNA-Studio von MS an.
http://www.microsoft.com/germany/msdn/coding4fun/xna/default.mspx

M
8 Beiträge seit 2004
vor 15 Jahren
Evtl. Texturen zwischenspeichern

hi,

habe vor kurzem auch mit einem kleinen Spiel angefangen und kämpfe auch an allen Ecken und Enden mit Problemen ;O).
Zum Timer: Ich denke für deinen Verwendungszweck kann man den wahrscheinlich einspannen (sowohl den aus Threading wie auch aus Forms) ansonsten würde ich dir als Alternative die kernel32 dll (QueryPerformanceCounter) empfehlen, da viel genauer (der aus Forms liegt glaube ich im 20ms Bereich und ist auch nicht exakt also mal 19ms mal 20 usw, wenn ich das richtig im Kopf habe..)
Zum TexturenSpeicherFressProblem: Ne Art Textur Cache würde hier wahrscheinlich helfen. Einfach ne Klasse mit ner Funktion welcher du die gewünschte Textur angibst und die diese dann lädt und in nem Dictionary speichert, beim nächsten mal muss die Textur so nicht neu geladen werden.

pseudocode


Dictionary<String, Texture> dict;

getTexture(String Path) {
  if (dict.ContainsKey(Path) {
     dict.Add(Path, getTextureFromFile(Path);
    // Fehlerbehandlung...
  }
  return dict.get(Path);
}

Aber irgendein Problem besteht schon, ausser deine Texturen sind zusammen 256MB gross ;O).
Hier kann ich dir den Antsprofile empfehlen gib ne Testversion davon, einfach mal googeln. Damit kannst du dir anzeigen lassen welche Objekte wieviel Platz beanspruchen und kommst so evtl dem Problem auf die Spur. Was ich mir aber vorstellen könnte ist, dass der Garbage Collector einfach noch nicht durch ist, resp. da du die Texturen relativ oft neu lädst, kommt er sozusagen nicht nach...

mfg

fastest code is no code

J
66 Beiträge seit 2008
vor 15 Jahren

Also ich weiß garne wo dein Problem ist?Du sagstest du hast ein Performanceproblem schreibst aber nur von einer hohen Speicherauslastung. Und das scheint, zumindest hast du es net so ausgedrückt, als ob das dem Spielfluss nicht beeindrächtigt.

Welchen Speicher schaust du dir überhaupt an?Wirklich auch den VRAM?Vermute mal nicht...oder hast du exklusiv angeben das alle Texturen in den RAM kommen sollen?

Zumal ist die Angabe des Speichers eh nicht fix zu dem was du explizit einlädts, da im Hindergrund ohne dein zutun noch viel anfällt was gespeichert werden muss wie zB der Backbuffer, Z-Buffer und und und.

Das einzige was wäre und was mcs schon meinte ist, das es unperformant ist in jedem DrawCall die Texutren neuzuladen. Das alles vorher erledigen. Und bei dem Spiel dieser Art brauchst du auch kein Texturmanager, da du wohl eh ein ziemlich einheitliches Environement haben wirst, wo es sich nicht lohnen würde Texturen ein- und auszuladen.

H
habeKA Themenstarter:in
90 Beiträge seit 2007
vor 15 Jahren

Also ich weiß garne wo dein Problem ist?Du sagstest du hast ein Performanceproblem schreibst aber nur von einer hohen Speicherauslastung. Und das scheint, zumindest hast du es net so ausgedrückt, als ob das dem Spielfluss nicht beeindrächtigt.

Hm hohe Speicherauslastung zählt nicht zur Performance 🤔 😉
Du hast schon recht das Spiel an sich wird davon nicht beeinträchtigt. Alles läuft flüssig und ohne ruckler.
Aber trotzdem muss das mit dem hohen Speicher verbrauch nicht sein.

@mcs

dein Tips sind echt gut. Ich bin grade an der umsetzung drann und werde mich melden wenn ich damit fertig bin.

mfg

habeKA

There's no place like 127.0.0.1

Gelöschter Account
vor 15 Jahren

Hm hohe Speicherauslastung zählt nicht zur Performance

nein zählt nicht zur performance. performance ist geschwindigkeit unabhängig des speicherverbrauchs. unter anderem ist der speicherverbrauch bei .net anwendungen nicht mit anderen anwendungen gleichzusetzen, da das speichermanagment komplett anders ist als man es sonst von früher gewohnt ist. hoher speicherverbrauch hat bei .net anwendungen garkeine aussagekraft.

wenn dein spiel ohne ruckler läuft und sonst keinen konstant ansteigenen verbrauch hat (bis in den gigabytebereich), dann hast du wohl das wichtigste richtig gemacht.