Speed Speed Speed
-
Wie und womit renderst du die Grafik? Welcher Art sind die Daten deiner Objekte und wie verwaltest du sie?
-
Mit DirectX.
Wie meinst du welcher Art sind die Daten deiner ObjekteJeder Gegner ist ein Objekt Struct das ich in der Hauptschleife durch eine Reihe Verarbeitungsalgorithmen schicke. Werde dann wahrscheinlich weiter entfernt liegenden Gegnern eine extra Verarbeitungsschleife spendieren muessen die nicht so umfassend ist!
-
Jetzt mal gaaaaaaaaaaaaaaaaaaaaaaaaaanz langsam!
Profiler benutzen, Zeitmessungen einbauen. Die Wahrscheinlichkeit, dass du durch blindes Optimieren genau das Richtige erwischt ist gering. Mach erstmal genau ausfindig, wo der Flaschenhals ist. Vielleicht ist es nichtmal die Grafik, sondern die KI?
-
Ja es ist die KI die meinen PC aufhaltet! Ich hab jetzt mal alle Gegner weggeschalten die nicht in einem bestimmten Radius um den Spieler liegen! Framerate hat sich zwar ein bischen verbessert aber doch nicht wesentlich! Haette mich ja auch gewundert wenn die ganze sache fluessig abgelaufen waere denn ich kann von meinem Computer nicht verlangen dass er 1000 gegner gleichzeitig bewegen, sie kaempfen und sterben
lassen kann. Muss jetzt schauen wie ich die ganzen Algos vereinfachen kann. Vorallem sollte die ki ja auch ohne Fehler von statten gehen und das fuer 1000 gegner ist schon ne herausforderung! ideen wie die fussbewegungen einzelner gegner synchron schalten damit weniger daten berechnet werden muessen sind mir eingefallen, aber das verkomplitziert alles enorm! aber genau hier liegt ja auch der Spass. Hier kann man seiner kreativitaet freien Raum lassen
-
SpaceMonkey: Optimizer hat Recht, Du solltest auf alle Fälle mal den Profiler Deines Vertrauens anwerfen, so einfach ins Blaue hineinzuoptimieren macht keinen Sinn!
-
Ich weiß ja, dass der Schwachpunkt bei der KI liegt. Hier liegt die große Herausforderung. Wenn ich es nur mit einzelnen Gegnern sprich nicht gleich um die 1000 zu tun hätte könnte ich viel genauer auf den einzelnen Gegner eingehen. Ich habe es aber mit 1000 zu tun und das heißt dass ich nicht auf jeden Gegner einzeln eingehen kann - was ich bis jetzt gemacht habe - und dass es klar ist das hier die ganze Geschwindigkeit flöten geht! Muss irgendeinen Weg finden wie ich es bewerkstelligen kann dass jeder Gegner zum Beispiel erkennt wenn er vor einem Hindernis steht oder dass zum Beispiel jeder Gegner erkennt wann er getroffen worden ist. Jetzt habe ich es so gemacht dass einfach jeder Gegner in einer Schleife durchgegangen wird und auf die Umstände in denen sich jeder Gegner befindet eingegangen wird. Solch eine Methode ist zwar die einfachste und wäre wahrscheinlich auch die sicherste mit den wenigsten Bugs aber sie ist schlicht nicht machbar. Hier müssen halt Tricks angewandt werden. Stehe aber (noch) im Dunkeln und muss überlegen wie dieses Problem am besten bewältigt werden kann. Hat einer von euch vielleicht eine Idee wie das gehen könnte
Wäre sehr dankbar
-
SpaceMonkey schrieb:
Ich weiß ja, dass der Schwachpunkt bei der KI liegt.
Das sagt nicht viel aus. Lass einen Profiler drüberlaufen und schau wo genau die Hotspots Deines Programms liegen! (D.h. versuche wirklich herauszufinden in welcher _Methode_/ Funktion oä die meiste Zeit verbracht wird, nicht nur in welchem Teil des Programms.)
-
Und wenn deine kritische Methode mehr als 15 Zeilen hat, dann teile sie in kleinere Methoden auf und lass den Profiler nochmal darüber laufen.
Wenn du nen wirklich krassen Hotspot gut optimieren kannst, macht das verdammt viel aus.
Wenn er sich dann nicht mehr weiter optimieren lässt, dann überlege, wie du ihn weniger oft aufrufen kannst (Bps. Wegfindung: nur Hindernisse im Umkreis erfassen, ö.ä.).
-
Danke für die viele Hilfe! Ich versuch mal was ich kann! Wenn es irgendwo Probleme gibt melde ich mich wieder!
-
Welchen Profiler benutzt du?
-
keine ahnung was culling ist aber meinen das die KI methoden das hauptproblem sind...soso
bye
tt
-
Ich weiss nicht genau wie es bei Battlefield 1942 gemacht wird, aber dort werden weiter entfernte Objekte weniger detailiert dargestellt.
Ich weiss aber nicht, ob die für jede Detailstufe ein eigenes Modell haben, oder ob die das per Algorithmus zur Laufzeit lösen.
-
Bei Battlefield gibt's ehh nicht 1000 Gegner (mmhh, warum wohl?). Was bringen Dir eigentlich 1000 Gegner (gleichzeitig), das wäre doch höchstens bei einem RTS sinnvoll.
Bye, TGGC
-
Ein Battefield mit 1000 Gegnern wär bestimmt lustig
Ok, sagen wir 100 und dann bei 3 facher Kartengrösse.
Ausserdem, sehr geehrter Herr TGGC, wollte ich damit nur ein Beispiel für Detail-Stufen nennen
-
Cpp_Junky schrieb:
Ich weiss nicht genau wie es bei Battlefield 1942 gemacht wird, aber dort werden weiter entfernte Objekte weniger detailiert dargestellt.
Ich weiss aber nicht, ob die für jede Detailstufe ein eigenes Modell haben, oder ob die das per Algorithmus zur Laufzeit lösen.Ist fraglich ob eine Realtimeberechnung der Objektdetailstufe ein sinnvoller Weg ist die Framerate zu erhöhen.
-
So hab mich jetzt ein bischen informiert. Was bringt mir Culling wenn ich sowieso weiß dass meine Engstelle nicht die Grafik ist? Wie schon gesagt bestehen meine Gegner zur Zeit ja praktisch nur aus Quadern. Folglich habe ich jetzt zum Beispiel alle Gegner außerhalb eines bestimmten Umfelds einfach aus der Renderpipeline gestrichen und keine wunderbaren Verbesserungen bezüglich Framerate erhalten.
Auch bin ich der Ansicht, dass ein Profiler mir keine wirklichen neuen Engstellen zeigen könnte die ich nicht schon wüßte! Denn mein Spiel besteht zur Zeit außer Grafik und Ki aus keinen weiteren Komponenten. Wo sollte die Geschwindigkeit also versieben wenn ich weiß dass es die Grafik nicht ist?
Warum sollte man nicht 1000 Gegner in ein Spiel packen? Ist doch langweilig wenn man nur gegen einen Alien kämpft oder? Serious Sam zum Beispiel hat die ganze Sache mächtig gut hinbekommen. Die haben sicher auch Tricks anwenden müßen um auf solche Gegnermaßen zu kommen! Wenn jemand Ideen hätte wie ich die Ki so klein aber auch so effizient wie möglich halten könnte wäre ich echt Dankbar!
-
kommt drauf an was deine KI leistet/leisten soll und wie du es umgesetzt hast. Müsstest du schon herzeigen
-
Ich bezweifle dass der Code etwas bringen würde da den keiner mehr wirklich verstehen würde ausser ich
aber so ungefähr: ich gehe halt auf jeden Gegner in einer Schleife explizit ein, laße ihn in dieser Schleife auf den Gegner zulaufen, testen ob er vor einem Hindernis steht testen ob er schon in Kontakt mit dem Spieler ist wenn ja schlägt er zu. Alles halt ziemlich Zeitaufwendig da auf jeden Gegner eingegangen werden muß. meine idee ist jetzt dass ich bei weiter entfernt liegenden Gegnern jetzt die Funktionen ob er den Gegner berührt und wie er auf den Spieler einschlägt weg lasse da er sowieso noch nicht im Kontakt mit dem Spieler steht. Ich schau jetzt mal ob das irgendwelche Einflüße auf die Framerate hat!
-
Wenn du so viele Gegner haben willst, kannst du halt nur die wirklich berechnen, die im direkten Kontakt (Sichtfeld) mit dem Spieler stehen und bei den anderen nur dafür sorgen, das sie nicht in eine Wand rennen oder ähnliches.
Culling ist das Entfernen von Objekten vor dem Rendern, um Berechnungen der Grafikkarte (Transformation, Beleuchtung) zu ersparen. Ist aber sinnlos zu optimieren, wenn die KI die Schwachstelle ist.
-
Bei einer Gegneranzahl von 2000 komme ich jetzt nun wenn ich nur noch die Gegner in die KI miteinbeziehe die um den spieler stehen schon auf 18 Frames. Das ist aber bei weitem noch zu wenig! Muß mir noch was anderes einfallen lassen!