Autor | Beitrag |
---|
000 07.11.2009, 14:47 AlexS |
Moin Leute, ich code gerade ein wenig an der Critical Engine, eine Engine von mir geschrieben zum erstellen eines First Person Shooters, basierend auf DirectX 9c. Alles funktioniert wunderbar, sogar unser Hammer ähnlicher Map-Editor wurde bereits Einwandfrei implementiert. Jedoch sitze ich gerade an der Waffen- und Munitionsverwaltung und wollte nachfragen, ob jemand eine bessere bzw. effektivere Idee zur implementierung hat.
-- Das Verzeichnis indem die Modelle liegen -- Der Modellname inkl. Animation -- Sounds shoot1 = "m4_shoot.wav" -- Animationen -- es gibt 4 verschiedene Animationsstufen (Schiessen1, Schiessen2, Idle, und Nachladen der primären Munition) -- ani1 ist Idle -- ani2 ist Feuermodus 1 -- ani3 ist Feuermodus 2 -- ani4 ist Nachladen -- Der Modus schaltet zwischen Einzelschuss (0) und Dauerfeuer (1) wpn2_mode=1 prim_ammo="556" -- Maximal mögliche Munition im Magazin -- Die "rate of fire" für primäres Feuer in msec -- Die "rate of fire" für sekundäres Feuer in msec -- Die "rate of fire" für primäre Nachladen in msec Eine Munitionsdefinition folgendermaßen: -- als effect bezeichnet man die Art des Verschusses effect=1 --byte -- größt möglichster Schaden -- Schadenstolleranz -- Hier kommen die Startwerte, die der Spieler beim Enginestart erhält. ammo=30 --byte Jeweils Waffe und Munition wird in einem eigenen Array mit allen Daten abgespeichert. Für Interessierte, welche Ergebnisse die Engine liefert, gibt es hier einen, leider etwas veralteten, Screenshotbereich: ____Maps____________________________ Dieser Beitrag wurde am 07.11.2009 um 14:48 von AlexS bearbeitet. |
Profil || Suche |
001 08.11.2009, 10:38 Adrian_Broher Admin |
Eine bessere Loesung fuer was? -- There is nothing wrong with high standards. It's your problem that you don't meet them. |
Profil || Suche |
002 08.11.2009, 12:13 AlexS |
Eine Lösung für einen schnelleren Zugriff. Leider bringt mit ein Test mit 1mio Abfragen nichts, da die Geschwindigkeit dieses Prozessors varriert, dass ich keine geeigneten Testergebnisse bekomme. --____Maps____________________________ |
Profil || Suche |
003 08.11.2009, 17:22 hausi |
Du solltest ohnehin nie Code optimieren, ohne dass du dort Performance-Probleme hast. Also schreibst du ihn am besten so, dass er einfach verständlich ist und wenn du schlussendlich eine schlechte Performance hast, kannst du mit Profiling-Tools einmal durchgehen und die Flaschenhälse suchen. Ich denke nämlich nicht, dass eine Waffen-Definition, auf die vielleicht 2-3 mal pro Sekunde darauf zugegriffen wird auf die Gesamtgeschwindigkeit einen grossen Einfluss hat. -- |
Profil || Suche |
004 08.11.2009, 18:24 AlexS |
Leider wird, und dass geht nicht anders, in jedem Schleifendurchlauf das Array aufgerufen um die Animationsdaten auszufragen. --____Maps____________________________ |
Profil || Suche |
005 08.11.2009, 18:53 Bluthund |
Warum hier kein sprechender Name, wie den ammo-Einträgen? Warum nicht einfach (32Bit-)Integers für alles was Ganzzahl ist. So fällt dir der Datentyp wenigstens nicht auf die Füße wenn jemand ein MG mit 300 Schuss Ersatzmunition definieren will. Vorweg: Ohne Messung hast du kein Performanceproblem. "Premature optimization is the root of all evil." Ich verstehe auch deinen Ist-Zustand nicht so wirklich. "Via Type etwas in ein Array einbinden"? Reden wir hier von einem Datentyp für Datentypen wie System.Type in .NET oder type_info in C++? Ein normales Array speichert in vielen Sprachen nur Daten eines Datentyps ab. Damit kannst du ja schon erstmal nicht Zeichenketten und Ganzzahlen in das selbe Array packen (außer über Vergewohltätigungen wie union, was in vielen Fällen zu Code führt den niemand lesen/warten will). Wäre gut wenn du zu dem Punkt mal etwas mehr Input liefern könntest (e.g. Pseudocode für die Zieldatentypen; Oder packst du tatsächlich alle gelesenen Werte einfach nur in ein Array?!). Die Daten, die du da einliest sehen mir alle nach wunderbaren Kandidaten für Konstruktionsparameter für eine Waffenklasse aus. Sprich: Alle Waffendefinitionsdateien parsen, anschließend Instanzen der Waffenklassen konstruieren und die Referenzen darauf dann in einen Container für den späteren Gebrauch im Spiel packen. Für alles was im Nachhinein änderbar sein soll (e.g. durch den Mapper), gibst du der Waffenklasse öffentliche Änderungsmethoden/Eigenschaften für die Membervariablen/Felder/Instanzvariablen - passende Termini je nach verwendeter Sprache selbst wählen ;) Wenn du nicht immer iterieren möchtest, um zur entsprechenden Waffe zu kommen, kannst du ja einen Container benutzen der seine Inhalte über Keys direkt anspringt (e.g. std::map oder std::multimap [C++ STL], System.Collections.Generic.Dictionary [.NET]). --The C language combines all the power of assembly language with all the ease-of-use of assembly language. Dieser Beitrag wurde am 08.11.2009 um 18:56 von Bluthund bearbeitet. |
Profil || Suche |