Editor Performance verbessern

  • Schattenschaden? Naja, von mir aus.

    Aber es wird ja wohl hoffentlich keine Waffe geben, die jede Schadensart hat. Da nimmst du halt eine Variable rein mit Schadensart und dann den Schadenswert.

    Du machst eigentlich genau denselben Fehler, den ich am Anfang auch immer gemacht habe, und zugegeben ab und zu noch immer mache. Du denkst, du musst alle Eigenschaften, wirklich alle, in ein Objekt programmieren, so wie du sie dir in der realen Welt vorstellst. Spiele sind aber nur eine Simulation und bei denen muss man halt viele Abstriche machen. Es ergibt ja auch keinen Sinn, alles in eine Waffe zu packen.

    Ich würde es eher so machen.

    Typ: Schwert
    Schadensart: Hieb
    Schadenvolumen: 30
    Sekundäre Schadensart: Feuer
    Sekundärer Schade: 5

    Oder irgendetwas in dieser Richtung. Weil, wenn du mehr machst, das wird die Spieler überfordern. Vielleicht kannst du noch Sockel für Gems mit besonderen Eigenschaften auf das Schwert packen, aber dann addierst du das mit der Gem-ID, der auf dem Schwert ist und bekommst von dem seine Bonuswerte.

    Du musst dir das so vorstellen, dass du im Idealfall, die Schadens und Schutzberechnung mit jeder Waffe in einer Routine berechnen kannst, mit minimalen Änderungen. Da musst du hinkommen. Da helfen dir unter anderem auch Interfaces.

    Und dann brauchst du auch, um mal auf deinen ersten Post zurückzukommen, nicht tausende oder abertausende komplizierte Objekte in einer Datenbank durchsuchen. Die Waffe, die der Spieler bei sich hat, hat halt ihre Werte, dafür ist die Objektorientierung erfunden worden. Legt der Spieler seine Waffe zum Beispiel in eine Truhe mit mehreren anderen Objekten, dann speicherst du im Inventar der Truhe nur die ID der Waffe, eventuell noch mit einem kleinen Bildchen. Nimmt er die Waffe wieder aus der Truhe, wird halt das Objekt mit seinen Werten über die ID wieder hergestellt. Genau dasselbe, wenn der Spieler die Waffe nur in seinem Inventar hat. Schlau wäre es auch, wenn die Waffen und Gegenstände ab und zu mal kaputtgehen. Das wurde nicht wegen des Realismus eingeführt, sondern damit die Datenbanken nicht endlos groß werden.

  • Also ich finde die Ausführungen von Tomarr sind sehr umfangreich und vor allem plausibel. :)


    Ich denke auch da tausende Variablen rein zu bauen schießt übers Ziel hinaus, hinzukommt wenn die UE da nicht mitmacht mit der Performance muss man ja eh beginnen umzudenken.

  • Mich würde es trotzdem mal interessieren wo würdest du bei dir im Projekt diese Werte hin packen? Wenn nicht in ein Struct.

    Als Beispiel die Schadensarten im Spiel:

    - Feuerschaden

    - Eisschaden

    - Schattenschaden

    - Lichtschaden

    - Giftschaden

    - Blitzschaden

    - Physischer Schaden

    - Blutungsschaden

    usw.


    Diese Werte müssen auf alle Waffen drauf, weil alle Waffen das Potential haben diese Schadensarten zu machen. Etwa in dem man diese im Spiel mit Mods ausrüstet (die Mods sind aber individuell und nicht fest vorgegeben! Also es gibt eine Basis Mod die man im Spiel durch Herstellen verändern kann.)

    Das gleiche gilt als Negativform bei Rüstungen, Schmuck, Bauteilen (Festungsmauern, Fallen, uvm.)


    Alle diese Werte müssen Live im Spiel veränderbar sein, siehe Modbar.

    • Offizieller Beitrag

    Der Feuerschaden ist dann für alle Feuerschaden-Waffen, die keine Modifikation haben, gleich?

    Dann wäre diese Tabelle doch die Standardtabelle mit den Standardwerten für alle Waffen. Wenn du hier Werte änderst, kannst du den Standard-Schaden für alle Waffen ändern, die keine Modifikation haben.

    Aber warum möchtest du sie in einem Struct speichern? Die Standardwerte sind doch alle vom Typ Float. Ein Struct wird nur benötigt, wenn du unterschiedliche Datentypen hast.

    Warum machst du es nicht so:

    Eine Tabelle:

    • Name der Waffe
    • Standardwert des Schadens (Schaden, den die Waffe verursacht)
    • Maximale Reichweite (bei Distanzwaffen)
    • Lebensdauer (wie viel Schaden die Waffe einstecken kann, bevor sie kaputt geht)

    usw.

    Eine einzige Tabelle, in der alle Informationen zu allen Waffen und allen Werten gespeichert sind.

    Dann kannst du die gesamte Tabelle in ein Struct packen und mit einem Break die verschiedenen Datentypen auslesen.



    Ich würde eine Tabelle machen wo alles drin steht.


    Waffen, Rüstungen, Schmuck etc kannst du ja auch in verschiedene Tabellen Packen.

  • Eine einzige Tabelle, in der alle Informationen zu allen Waffen und allen Werten gespeichert sind.

    Dann kannst du die gesamte Tabelle in ein Struct packen und mit einem Break die verschiedenen Datentypen auslesen.

    Das wäre die Alternative zu einzelnen Variablen. Hätte dann auch den Vorteil, wenn man schon alle Werte unbedingt gleichzeitig haben möchte, diese dann auch in einer Schleife im Schadensalgorithmus durchgehen zu können. Macht aber dennoch die Schadensberechnung nicht unbedingt einfacher und auch fehleranfällig, das sollte man dazu sagen. Aber ich war der Meinung, ich hätte die Struct schon vorgeschlagen? OK, war vielleicht auch an einer anderen Stelle.

    Am Ende sehe ich aber das Hauptproblem darin, dass er einen Gegenstand aus irrwitzig vielen Gegenständen heraussuchen will.

    • Offizieller Beitrag

    In Spielen ist es doch so: Du findest oder bekommst eine Waffe. Dann kannst du diese Waffe verbessern, indem du sie levelst oder modifizierst.

    Von der Logik her, wenn man die Waffe findet, erhält die Waffe ein NEUES Array, in das die Werte aus der Tabelle gespeichert werden. Im besten Fall handelt es sich hierbei nur um Floatwerte. Andernfalls würde man für jede Waffe wiederum ein Struct benötigen, das sowohl Strings als auch Floats und Integers usw. enthält.

    Also werden alle Informationen (in Form von Floatwerten) aus dem extra für die Waffe angelegten Array bezogen. Informationen wie der Name der Waffe (z.B. Langschwert) werden jedoch weiterhin aus der Tabelle bezogen. Die Werte ändern sich normalerweise auch nicht.


    Im Array können diese Werte Überschrieben werden die default Werte in der Tabelle bleiben aber wie sie sind.

  • In Spielen ist es doch so: Du findest oder bekommst eine Waffe. Dann kannst du diese Waffe verbessern, indem du sie levelst oder modifizierst.

    Von der Logik her, wenn man die Waffe findet, erhält die Waffe ein NEUES Array, in das die Werte aus der Tabelle gespeichert werden. Im besten Fall handelt es sich hierbei nur um Floatwerte. Andernfalls würde man für jede Waffe wiederum ein Struct benötigen, das sowohl Strings als auch Floats und Integers usw. enthält.

    Also werden alle Informationen (in Form von Floatwerten) aus dem extra für die Waffe angelegten Array bezogen. Informationen wie der Name der Waffe (z.B. Langschwert) werden jedoch weiterhin aus der Tabelle bezogen. Die Werte ändern sich normalerweise auch nicht.


    Im Array können diese Werte Überschrieben werden die default Werte in der Tabelle bleiben aber wie sie sind.

    Na ganz so kenne ich das nicht. Ich kenne es eher so in die Richtung

    Hauptschadensart: Hieb
    HauptschadenMax: 10
    Nebenschadensart: Feuer

    NebenschadenMax: 5

    So, oder auch so ähnlich. Ich habe noch nie ein Rollenspiel gesehen, wo in jeder Waffe alle Werte gleichzeitig vorhanden sind, egal ob der Wert dann 0 oder 100 ist. Aus mehrerlei Gründen, erstens würde das viel Speicher verbrauchen, was auch wieder gleich bedeutet, dass mehr Daten übertragen werden müssen. Mit dem Debuggen und verlängertem Durchlauf einer Schleife habe ich ja schon erwähnt. Was ich aber noch nicht erwähnt habe ist, wenn der Spieler dann auch beliebig diese Werte in irgendeiner Form der Waffe ändern kann, zum Beispiel durch Training, hat plötzlich ein Spieler eine völlig überpowerte Waffe, die ihn quasi unbesiegbar macht und das dann noch unter dem Aspekt, dass derartig viele Werte schlecht auf Glitsches oder Cheating überwacht werden können. Und, was noch dazu kommt, das hatte ich ja auch schon erwähnt, wonach soll der Spieler am Ende dann seine Waffe auswählen oder vergleichen, welche besser ist. Dann hat der Spieler da auf einmal eine irre lange Liste mit irgendwelchen Werten, die er alle vergleichen muss, dann ist Feuer plötzlich Wert +1 gegenüber seiner vorherigen Waffe, aber Gift -1, ja, was bringt ihm nun mehr?

    Also wenn ich bei einem Spiel erstmal eine Stunde analysieren müsste, welche Waffe jetzt besser ist und dann auch noch vielleicht unterschiedlich bei jedem Gegner oder so, das wäre bei mir eine 1A Rückerstattung bei Steam.

    Aber, ich lasse mich da ja gerne eines Besseren belehren, vielleicht gibt es ja Spieler, die sich sowas antun wollen.

    • Offizieller Beitrag

    Na ganz so kenne ich das nicht. Ich kenne es eher so in die Richtung

    Hauptschadensart: Hieb
    HauptschadenMax: 10
    Nebenschadensart: Feuer

    NebenschadenMax: 5

    Ja aber Hieb und Feuer ändert sich ja nicht. Wenn ja dann würde ich da zusätzlich ein Integer oder Floatwert dafür nehmen. zb 1 ist Feuerwaffe, 2 ist Eiswaffe. Eben so, dass du das nicht extra in einem String Array speichern musst.

    Einfach nur Float Werte für alles und der Text eben aus der Tabelle.

    Auch für Mod Stufen zb was das Aussehen der Waffe angeht, könnte man ja einen Floatwert verwenden. (1 Ist Skin1) (2 eben Skin2) usw


    Du kannst halt nicht für jede Waffe ein Struct erstelle wo oder alle Datentypen drin hast die du ständig Lesen und bearbeiten musst.


    In einem Individuellen Array wo ändere bare Zahlen sind, ist das viel performanter. Als Variablen die theoretisch änderbar sind aber wo die meisten in der Praxis nicht geändert werden.

    Also wenn ich bei einem Spiel erstmal eine Stunde analysieren müsste, welche Waffe jetzt besser ist und dann auch noch vielleicht unterschiedlich bei jedem Gegner oder so, das wäre bei mir eine 1A Rückerstattung bei Steam.

    Oft Leveln sich die Waffen ja von Selbst und damit auch die Werte.


    Fallout4 als Beispiel es folgende Werte:


    Levelstufe

    Damage

    Feuerrate

    Genauigkeit

    Reichweite

    Preis.

    Magazin Typ zb 45mm


    Bei Fallout ist es so gelöst, dass die Waffe einen Default Wert hat und durch bestimmte Mods sich diese Werte entsprechend erhöhen. zb die Genauigkeit um 10, die Reichweite sinkt um 20 usw


    Wenn man eine Waffe findet, könnte man der per Zufall Mods verpassen und so ändern sich auch rechnerisch die Werte entsprechend.

  • Eigentlich habe ich noch nie Waffen gesehen, die sich selbst leveln. Normalerweise nehmen die Skills des Spielers zu. Und wenn man eine Waffe aufrüstet, zum Beispiel wie bei Diablo mit Gems, oder Seelensteinen, was auch immer, dann würde ich ja eher dem Edelstein ein Wertepaket mitgeben und dies dann über Interfaces hinzufügen. Sprich die ID des Edelsteins im Slot abfragen und über den dann nach Bedarf einfügen.

    Aber trotzdem niemals von jeder Schadensart alles in der Waffe speichern. Wie gesagt, die meisten Schadensarten werden ja hoffentlich eh 0 haben, weil eine Waffe, die alles hat und kann, ist einfach overpowerd. Und Werte, die eh nur 0 haben, brauchst du auch nicht speichern. Wozu? Normal hast du einen Hauptschaden und einen Nebenschaden.

    Man stelle sich mal vor, du machst einen Hieb mit einem Schwert, dieses hat zum Beispiel Hiebschaden, Feuerschaden, Giftschaden, Frostschaden, Blitzschaden, Magieschaden, usw.

    Jetzt sagt der Würfel, alle Schäden sind ein Treffer. Dann kommt in der Aktionsanzeige, Hieb Hit -20, Feuer Hit, -8, Gift Hit -9, Frost Hit -15, Blitz Hit -11.

    Erstmal liest du dir dann eine Minute die Hits durch und was für eine Chance soll denn noch der Gegner haben? Oder du hast vielleicht nur bei Hieb und Feuer einen Wert, alles andere ist 0. Dann hast du entweder bei Gift Hit 0, Frost Hit 0, Blitz Hit 0. Also der Spieler kriegt 3 Mal angezeigt er hat getroffen, macht aber keinen Schaden. Wie frustrierend. Alternativ fragst du vorher ab, ob es einen Wert größer 0 in der jeweiligen Schadensart gibt, ist aber auch wieder unnötige Loopberechnung, dann kannst du unnötige Werte auch gleich weglassen.

    Und jetzt verknüpf das noch zusätzlich mit den Skills des Spielers.

    Ich meine, wie ich schon sagte, mich geht das ja nichts an, zumal er ja auch resistent für Verbesserungsvorschläge ist und darauf keinen Bock hat. Und ich lasse mich da ja auch gerne eines Besseren belehren, von daher, alles gut so weit.

  • Im Grunde kann jede Waffe jede Schadensart gleichzeitig haben.

    Darum habe ich das ganze ja in 6 Hauptstrukturen aufgeteilt. Weil auf Essen (als Beispiel) brauche ich ja keine Kampfwerte haben.


    Das Problem ist halt, dadurch das alle Werte frei modifizierbar sind, muss ich diese über ein geordnetes Structure System ansprechen können. Ich hatte es vorher mit Variablen im MasterActor (Parent) gehabt aber das bedeutet wieder neue Probleme, weil man diese wiederum nicht so problemlos ansprechen kann. Bei einem Struct habe ich die wichtigsten Werte und alles was nicht wichtig und Gegenstandspezifisch ist, kann ich immer noch den separaten Child Actor packen.
    Z.B. ein Wohnhaus was einen Heilbrunnen hat. Das muss ich nicht in einem Struct machen, sondern kann es über den Actor selber regeln.
    Aber wer das Wohnhaus besitzt (Name, Actor usw.) das brauche ich im Struct um das besser zu identifizieren, um damit auch die Rechte für die Interaktion zu ermöglichen. Usw.


    Das hört sich so an als ob ich alles möglich in ein Hauptstruct packe, aber das stimmt nicht. Eben nur das wichtigste was alle Gegenstände dieser Kategorie betrifft.

    Gewicht ist so ein Wert, das jeden Gegenstand betrifft. So das man auch ein Haus mit Inhalt in die Inventartasche packen kann.




    Ich möchte vom Spielprinzip her in eine ganz andere Richtung gehen in der das Spiel personalisiert wird, und nicht auf Masse monoton und langweilig wird. Bin derzeit mit allen MMORPGs total unzufrieden weil diese so gut wie keine Inhalte bieten (monotone Quests sind kein Inhalt). Langweiliges Grinden und ständiges wiederholen von wiederholbaren Aufgaben ist kein Content. Davon möchte ich komplett weg und etwas ganz neues machen.


    Daher möchte ich ein Spiel machen in der man selber Inhalte erstellen kann. Spieler erzeugen für Spieler Content (Player based content) aber eben das wiederum auf Rollenspiel basis.



    Für Cheats usw. habe ich mir bereits ein System ausgedacht das dann eingreift.

    Übermächtige Gegenstände finden den Spieler und nicht Spieler finden übermächtige Gegenstände. Auch da möchte ich es andersherum machen.