Editor Performance verbessern

  • Hallo zusammen!


    Bin gerade dabei mein Inventarsystem zu finalisieren und da kommt mir ein komisches Problem, es bezieht sich auf den Unreal Engine Editor 5.3.

    Mein Computer ist stark genug und ich sehe da auch keine Leistung-/Auslastungen-/Temperaturen- Probleme. Alles im grünen Bereich, also muss das am Editor liegen.

    Das gleiche habe ich auch in einem anderen Test-Projekt!


    Das ganze Inventarsystem habe ich in eine externe "Component" integriert, die dann mit den anderen Actors verbunden ist (damit diese damit interagieren können).



    Wenn ich eine Array Variable durch eine andere austauschen muss, dann dauert diese ca. 6 Sekunden (während dessen hängt der Editor).

    Da ich sehr sehr sehr viele Array Variablen austauschen muss, wird das ganze zu einer extremen Tortur und je mehr ich austausche (weil ich 6 Struct Systeme habe, muss ich also das ganze 6x wiederholen).

    Bei anderen Variablen habe ich das Problem nicht oder es fällt nicht auf. Ich kann die Ursache davon auch nicht finden.
    Es kommt mir so vor, als wenn der Editor mit jeder Array Verbindung versucht, alle Dateien im Projekt zu durchforsten ob es da irgendwo Querverbindungen gibt, was diese Zeit Verzögerung bedeutet.

    Am liebsten wäre es mir wenn man alle 6 Structs in eine geteilte Variable setzten könnte, um diese dann zu filtern.
    Die Frage ist ob das ganze dann im Multiplayer bei vielen Spielern zu anderen Probleme führt?


    Danke für eure Infos.


    Bilder kann ich dazu keine Machen, weil es einfach für ein paar Sekunden hängt und dann geht alles wieder weiter. Das Probleme habe ich eben NUR bei den Array-Variablen der Structs.

    • Offizieller Beitrag

    Sorry wenn ich das so direkt sage, aber vielleicht liegt es auch nicht am Editor sondern an dem was du programmiert hast ?


    Möglicherweise ist dein Array auch sehr groß, so dass das durchsuchen eine Zeit dauert ?


    Hier ein paar Tipps:


    1. Verwende den Profiler um zu analysieren was beim Austausch der Array Variablen passiert.

    2.Code Optimierung

    3.Batch Operationen beim Durchsuchen der Arrays verwenden.

  • Das kann gut möglich sein.


    Alleine das Löschen der ungenutzt Variablen hat schon 21 Sekunden gedauert. Hmhm


    Aber wie soll man alternativ so viele Informationen hineinpacken die gespeichert werden müssen?


    Wie sieht Code Optimierung aus?


    Was ist ein Batch Operation?

    • Offizieller Beitrag

    Dein Problem ist vermutlich, dass ein riesiges Array durchsucht werden muss. Dabei muss jeder Eintrag durchsucht werden. Das ist das, was lange dauert.

    Ich weiß nicht genau, was du vorhast oder warum du ein so großes Array hast. Daher ist es schwierig, eine brauchbare Lösung zu präsentieren.

    1. Grundsätzlich kannst du ja nur eine bestimmte Anzahl an Items gleichzeitig anzeigen. Warum also 1 Million Items lesen, wenn du nur 50 anzeigen kannst? Vielleicht kannst du an dieser Stelle filtern?
    2. Du könntest jedem Item einen Tag zuweisen, z.B. allen Waffen einen "Waffe"-Tag. Du durchsuchst dann nur Items mit dem Tag "Waffe".
    3. Wie suchst du nach deinen Gegenständen? Wenn du jetzt nach einer bestimmten Waffe im Array suchst, ist das sehr unperformant. Überlege eher, mit IDs zu arbeiten. Also einem Integer-Wert, wo eine bestimmte Zahl eine bestimmte Waffe ist. Das Laserschwert hat die ID 1. Du suchst nicht nach dem Laserschwert im Array, sondern nach 1. Das ist dann viel viel schneller als einen Haufen Strings abzusuchen.
    4. Als Batching versteht man eine Programmierlogik, bei der mehrere Operationen gleichzeitig ausgeführt werden, statt zig einzelne Operationen zu haben.

    Mal ein Beispiel, wie man es nicht machen sollte:

    Du willst 200 Items von einer Kiste in dein Inventar übertragen. Du liest Item1, kopierst diesen Eintrag von Array (Kiste) nach Array (Inventar). Wenn diese Operation abgeschlossen ist, dann kopierst du Item2 von Array (Kiste) nach Array (Inventar) usw.

    Hier wird wirklich Item für Item kopiert. Eventuell wird das Kistenarray sogar jedes Mal neu gelesen, geöffnet und geschlossen.


    Besser wäre es, eine Logik zu überlegen, wie du alle Items mit einem Schlag von A nach B kopieren kannst. Zum Beispiel könnte jede Kiste eine Nummer haben (eine Art Postleitzahl). Nur die Items mit dieser Postleitzahl werden kopiert, alle anderen werden nicht angefasst.


    grob gesagt:


    1. Dein Array sinnvoll in mehr Arrays aufteilen.

    2. Deine Einträge filtern zb durch Tags oder IDs. Lieber nummern suchen als Strings.


    Um die Übersicht zu behalten würden sich vielleicht Datatables die du mit einer Exel bearbeiten kannst anbieten. Du könntest die Einträge aus der Exel auch in deine Arrays kopieren. Entweder im UnreakEditor per Script (Offline) oder (Ingame) einfach direkt aus der Exel auslesen.

  • 1. Das Problem ist das nach keinem Array Item gesucht wird!
    Ich vermute wir verstehen uns falsch, dass Array ist leer.


    2. Das mit der Tag-Idee habe ich durch die 6 unterschiedlichen Datenbanken gelöst, weil das in anderen Spielen zu massiven Performance Problemen geführt habe wenn man dies über ein System laufen lässt. Daran habe ich schon optimiert.


    3. Ich mache das ohne IDs weil ich darin keinen Sinn sehe das zutun, das hatte ich damals schon drinnen. Musste aber feststellen das die Gegenstände einzigartig sein können (also jede gleiche Waffe ist für sich einzigartig in den Werten), also muss sowieso alles separat durchsucht werden. Daher verwende ich "Array with Break". Es sei denn du meinst damit etwas anderes. Wenn ich in der Datenbank suche verwende ich den Namen als Suchfilter und keine Zahl. Z.B. wenn ich ein Basis-Gegenstand erzeugen muss, dieser dann später modifiziert wird.


    4. Das habe ich soweit schon integriert, nur eben die Datenbank Arrays müssen separat sein.



    Das mit dem schnelleren Kisten übertragen fehlt mir noch an der Stelle. Dafür sind die ganzen Gegenstände bereits gestapelt. Also Anstatt 100 (Item) x 1 Munition, habe ich 1 (item) Munition mit 100 Schuss. Da muss ich noch gucken wie ich das in Zukunft besser optimieren kann.


    Aktuell ist es mir derzeit wichtiger das ich dieses Jahr noch den ersten Gameplay Trailer machen kann.


    Der lag kommt nicht durch die Suche nach Gegenstände (weil ich das bereits vorher separiert habe, so wie du angegeben hast in unterschiedliche Arrays. Im Spiel funktioniert es wunderbar und ohne Lags oder Performance Probleme.)


    Es geht nur darum das, dass Verbinden der Array Nodes im Editor die Lags verursacht.

  • Du willst doch etwas durchsuchen, zum einen finde ich es etwas befremdlich, dass du 6 unterschiedliche Datenbanken durchsuchst, die aber wohl, wenn ich dich richtig verstanden habe, im selben Durchgang durchsucht werden sollen. Dazu musst du dann ja schon da 6-mal von vorne anfangen zu suchen. Ist wie bei einem Karteikasten. Wenn du einen Karteikasten hast, der von A bis Z geht, dann kannst du in der Mitte anfangen zu suchen, ist der Buchstabe größer als der, wo du jetzt bist, dann nimmst du Mitte der oberen verbleibenden Hälfte, ansonsten die Mitte der unteren Hälfte. Dann schaust du wieder, ob der zu durchsuchende Buchstabe größer oder kleiner ist. Je nach Richtung pikst du dann immer in die verbleibende Mitte, bis du das gefunden hast, was du suchst. Dadurch kannst du extrem schnell und in wenigen Schritten sehr große Datenbanken durchsuchen.

    Das funktioniert aber nicht, wenn du 6 Datenbanken hast. Du hast dadurch zumindest keinen Geschwindigkeitsvorteil. Eher im Gegenteil, weil du ja erstmal die richtige Datenbank finden musst.

    Dafür muss deine Datenbank aber indexiert sein. Sprich, das wonach du suchst, muss sortiert sein. Also, wie in meinem Beispiel, sortiert von A nach Z. Es funktioniert nicht, wenn die alphabetische Reihenfolge durcheinander ist.

    Deswegen gilt, bei Datenbanken ist die Indexierung extrem wichtig.

  • Der Geschwindigkeitsvorteil ist doch das man nur in der richtigen Datenbank suchen muss und nicht in der einen großen, weil genau das killt ja die Performance.

    Wenn man dann seine 100.000 Items und mehr hat, das in der Mitte suchen hört sich prima an, aber was ist wenn man die Übersicht verliert wonach man sucht. Dann muss man alles durchsuchen. Bei so vielen Gegenständen erhalten diese auch sehr unübersichtliche Bezeichnungen usw.

    Das ist mir schon sehr häufig passiert das ich nach einem Gegenstand in einer mega Datenbank suche aber diese nicht mehr finde, weil diese zu groß geworden ist.

    Daher habe ich das alle eingeteilt in die 6 Datenbanken und bei einer Replication Anfrage, wird auch nur diese übertragen und alle anderen nicht (spart Performance ein).


    Ich durchsuche nicht alle 6 Datenbanken, sondern immer nur die eine.


    Darum geht es hier nicht, sondern das ich im Editor den Lag habe!

    Nicht im Spiel.

  • Ich glaube, du verstehst Datenbanken nicht.

    Eine Datenbank kann mehrere Tables beinhalten, da brauchst du dann nicht 6 Datenbanken, sondern eine Datenbank mit 6 Tables.

    Wenn du die Übersicht verlierst, wonach du suchst, dann kann dir keine Datenbank dieser Welt helfen. Denn ein Table besteht aus drei wichtigen Punkten, einem unique Key, das ist ein eindeutiger und einmaliger Schlüssel, um einen Eintrag eindeutig identifizieren zu können, das kann etwas Komplexes sein, irgendein berechneter Schlüssel oder so, aber auch etwas ganz Einfaches, wie ein Integer, der einfach hoch zählt.

    Dann brauchst du indexierte Einträge. Indexierte Einträge sind die Einträge, nach denen du suchen kannst und diese müssen auch sortiert sein, weil sonst funktioniert die ganze Suchanfrage, bzw. der Suchalgorithmus nicht. Wenn zum Beispiel beim Suchen der Buchstabe B vor A kommt, dann wird der Algorithmus, falls er bei A anfängt zu suchen, ja nicht vor A nach B suchen, sondern in dem Fall bei C und wahrscheinlich auf den Rückschluss "nicht vorhandener Eintrag" kommen.

    Wenn du eine Datenbank komplett durchsuchen muss, also von vorne nach hinten und das jedes Mal, dann brauchst du keine Datenbank, dann kannst du auch alles unsortiert in irgendeine Datei schmeißen, du wirst auch keine Performancevorteile haben, weil er durchsucht ja eh alles usw. Wobei ich mir jetzt auch keine Situation einfallen würde, warum ich eine Datenbank durchsuchen sollte, wenn ich gar nicht weiß wonach ich suche.

    Und natürlich hat auch der Editor damit größere Probleme als das fertige Spiel, weil der verbraucht natürlich zusätzliche Performance als das Spiel ohne Editor und Debuginformationen etc. Wenn du das allerdings nicht optimierst, wird früher oder später auch dein Spiel darunter leiden.

    • Offizieller Beitrag

    Exaran

    Nur zur Sicherheit und das wir nicht von unterschiedlichen dingen sprechen.

    Reden wir hier Arrays oder von Datenbanken ? Das ist nicht das selbe.


    Der Vorteil an einem Array ist, dass Elemente schnell durch ihren Index gefunden werden können.


    Eine Datenbank ist ein strukturiertes Datenspeicherungssystem welches darauf ausgelegt ist große Mengen an Daten effizient zu speichern. Es persistent und hat mehr möglichkeiten Daten zu sortieren und zu organisieren.


    Ein Array ist genau genommen keine Datenbank weil es nicht die selben Möglichkeiten bietet wie eine SQL Datenbank


    Falls du also von Arrays redest solltest du vielleicht in Betracht ziehen eine richtige Datenbank zu verwenden.


    Bei so riesen Informationen, reichen Arrays eventuell nicht mehr aus da du auch gar nicht filtern kannst.


    Mich würde immer noch interessieren was du genau vor hast und warum dass so riesige Daten sind. Dann kann man dir doch viel besser helfen wie du das aufbauen kannst.

  • Mich würde immer noch interessieren was du genau vor hast und warum dass so riesige Daten sind. Dann kann man dir doch viel besser helfen wie du das aufbauen kannst.

    Stimmt. Ein nicht ganz unwichtiger Punkt. So wie beschrieben erscheint mir das ganze ein wenig übertrieben. Und das sage ich als König des übertriebenen und unnötigen Aufwands. :P

  • Es geht um Array Performance im Editor, wie ich oben bereits geschrieben habe.

    Verbinde ich ein Array mit einem "SetArray" node, dauert es in diesem Component ca. 5 Sekunden.

    Da ich ganze viele verbinden muss ist das extrem nervig.

    Das möchte ich gerne beschleunigen.


    ...

    2. Deine Einträge filtern zb durch Tags oder IDs. Lieber nummern suchen als Strings.

    ...

    Das mit den IDs hatte ich auch schon aber wie stellst du sicher das die ID nicht bereits anderswo vergeben wurde?

    Weil wenn mehrere Spieler in das Gleiche Inventar gucken (was auch immer das sein mag), besteht ja immer eine Chance das Gegenstände eine gleiche ID haben und das würde zu Fehlern führen.

    Man müsste die Zahl der ID so riesig machen das die Wahrscheinlichkeit klein bleibt. Dieses Prinzip habe ich bei dem Quest-System gemacht aber ich finde das keine gute Lösung. Weil die Chance besteht das eine andere Quest die gleiche ID hat = Fehler.



    ...

    Mich würde immer noch interessieren was du genau vor hast und warum dass so riesige Daten sind. Dann kann man dir doch viel besser helfen wie du das aufbauen kannst.

    Jeder Gegenstand und jede Gegenstandsart braucht ja unterschiedliche Informationen. Ein Fahrzeug hat diese und jene Informationen, eine Waffe andere und Gebäude wieder andere usw.

    Hätte ich nur ein Datenbanksystem wäre die suche zwar bequemer aber sorgt auch für mehr Last.

    • Offizieller Beitrag

    Nur um das mal festzuhalten: Du hast ja diesen Thread eröffnet weil du der Meinung warst der Editor (Unreal wäre Langsam) Ich glaube wir können zwischenzeitlich sagen dass das Problem nicht Unreal ist sondern die Größe deiner Datenbank. Oder hab ich was übersehen ?


    Das mit den IDs hatte ich auch schon aber wie stellst du sicher das die ID nicht bereits anderswo vergeben wurde?


    Weil wenn mehrere Spieler in das Gleiche Inventar gucken (was auch immer das sein mag), besteht ja immer eine Chance das Gegenstände eine gleiche ID haben und das würde zu Fehlern führen.

    Moment: Ververwechsel bitte nicht das Speichern von Gegenständen mit dem Lesen Gegenständen.


    Was du eigentlich hast ist eine lange Liste mit allen Gegenständen in deinem Spiel. Da könnte zb ein Datatable sein. Dann kannst du die Liste in Exel bearbeiten. In dieser Liste kannst du nicht nur den Namen des gegenstandes bearbeiten sondern zb auch welchen Damage die Waffe macht oder welchen Schutzwert die Rüstung hat. Diese Liste ist dynamisch erweiterbar und kannst die Daten über ein Blueprint abfragen.


    Wenn bei Workaround kämen alle Informationen aus dem Datatable. Aber du kannst die Exeltabele auch nutzen um diese Informationen in ein Array oder in eine Datenbank zu exportieren. Ich persönlich finde es einfacher solche dinge in eine Tabelle zu bearbeiten als sie immer in einem Array zusammen zu suchen.


    Egal wie du das nun anstellst. Alle deine Gegenstände haben eine eindeutige ID. Das Exailbur Schwert hat zb ID 1


    Wenn dinge in eine Kiste gelegt werden, so bekommt die Kiste ein Array mit dem Inhalt. In der Regel passen in die Kiste keine 2 Millionen Gegenstände rein. Ich gehe daher mal davon aus das dir zum speichern eine 8 Bit Interger reicht.


    Hier mal Liste zu den Integer

    8 Bit Integer kann von - 128 bis + 127 Zahlen speichern.

    16 Bit Integer kann von -32.768 bis 32.767 speichern.

    32 Bit Integer kann von -2.147.483.648 bis 2.147.483.647 speichern.

    64. Bit Integer kann von -9.223.372.036.854.775.808 bis 9.223.372.036.854.775.807 speichern.


    Ich denke, egal was du vor hast eine 16 Bit Integer wird dir auf jedenfall reichen vermutlich reicht dir auch eine 8Bit interger.



    Jede Kiste hat sein eigenes Array. Alles was du speicherst wenn etwas in die Kiste gelegt wird, ist ID1 völlig Wurst ob es sich um das Exalibur Schwert handelt.


    Macht die Kiste jemand auf, suchst du in deiner Datenbank nach ID 1 und zeigst die jeweiligen Informationen an.


    Du liest im nur Informationen aus der Datenbank schreibst da aber nichts rein. Speichern tust du nur die ID welche 1 Platzhalter für alle Informationen sind.


    Jeder Gegenstand und jede Gegenstandsart braucht ja unterschiedliche Informationen. Ein Fahrzeug hat diese und jene Informationen, eine Waffe andere und Gebäude wieder andere usw.

    Das spielt in der Datenbank keine Rolle. Du kannst dein Script ja so bauen, dass wenn in der Tabelle in einer Zelle nichts steht, diese Information auch nicht angezeigt wird.


    Das schöne ist doch, dass du auf diese Art auch schön sortieren kannst. Du schreibst die Tabelle auch rein ob es sich um eine Waffe oder um eine Fahrzeug handelt. So kannst du Inhalt in einer Kiste auch entsprechend sortieren.


    So sieht ein typisches Datatable aus:


    Du siehst, dass viele Felder einen Wert von 0 haben hier sind keine Informationen hinterlegt.


    Du kannst Script so aufbauen das du die gesamte ID liest völlig egal was drin steht. So kannst du deine Tabelle auch immer erweitern.

    Du machst ein Script fürs Kistenlesen wo einfach nur neue Gegenstände hinzufügst.

    Hier siehst du auch die ID nur heißt es hier Row Name



    Was keinen Sinn macht ist jeden Gegenstand jedes mal in eine Tabelle zu speichern und wieder zu lesen. Somit hast du hast du jede Information mehrmals gespeichert.


    Das wäre ein jetzt mein Gedanke

  • Ich würde da noch weiter gehen.

    Also einmal, was mehrere Spieler angeht, so nutzen sie ja eine gemeinsame, ich sage mal Datengrundlage, also egal, ob es Datatable, Array oder SQL-Datenbank ist. Deswegen musst du auch nicht dafür sorgen, dass bei jedem Spieler eine andere ID ist. Das dürfte es schon einmal sehr stark reduzieren, wie ich oben ja schon beschrieben habe reicht auch einfaches durchzählen. Der unique Key ist aber eigentlich nur in einer Datenbank wichtig. Ein Array habe ich noch nie mit unique Key verwendet.

    Was deine Speicherung der Details angeht, da würde ich mich mehr an das Konzept der Objektorientierung halten, sprich du machst ein Parentactor einer Waffe und in diesem sind dann alle Daten vorhanden, je nachdem Schadenswirkung, Handling, Damage, Erweiterungen, Zauber und was weiß ich, was du da alles speichern möchtest.

    Und in dem Array speicherst du dann halt diese Waffe als Klassenmember.

    Zum besseren Verständnis kann ich dir da sogar das Videotutorial, welches ich gestern in einem anderen Thema gepostet habe empfehlen, wo es um Hordenspawning ging. Da wird zwar ein Array mit NPCs beschrieben, aber vom Prinzip her funktioniert das Ganze sehr ähnlich.

    Habe es noch einmal kopiert.

    Externer Inhalt youtu.be
    Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.
    Durch die Aktivierung der externen Inhalte erklären Sie sich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.


    Mit ein wenig Abwandlung kannst du es für deine Zwecke nutzen.

    Zudem solltest du dir überlegen, wo du das Ganze vielleicht noch optimieren kannst, denn kein einziger Spieler wird in die Situation kommen, dass alle Gegenstände aufgelistet werden. Von daher solltest du dir überlegen, wie man unnötige Gegenstände in der Liste irgendwie weg rationiert.

    • Offizieller Beitrag

    Exaran Seid wann tritt eigentlich dein Problem auf? Seid Engine Version wechsel?

    Betrifft das nur dein Component Actor?

    Schon mal Redirection gemacht?


    Dauert das compilieren auch so lange?

    Dauert eine Suche nach Referenzen dieser Variablen auch so lange?

    Wo löscht du die Arrays. Vom Struct, oder vom Component?

  • ...

    Ich verwende derzeit ein Datatable für meine ganzen Gegenstände. Das muss ich erst noch später in eine Datei speichern, soweit bin ich noch nicht.


    Aktuell ist es so das ich mich bemühe ein Graphen-System zu machen. In der der Basis-Gegenstand einmalig von dem Datatable erfolgt und dieser Gegenstand kann danach frei verändert werden. Daher ist dieser nicht mehr kompatibel mit der ID von der Datatable. (Der Grund warum ich keine IDs verwende, weil ich nicht den Sinn dahinter verstehe. Also ja wenn alle Gegenstände gleich sind dann macht es Sinn.)




    ...

    Dieses System verwende ich bereits. Daher habe ich das in 6 Gegenstandsysteme aufgeteilt, damit die Informationen unterschiedlich erfolgen und sich nicht gegenseitig die Performance klauen. Im Grunde habe ich ein Parent und der Child daraus wird separat mit Infos gefüttert.


    Habe es so gemacht das ich ein "Master-Ausrüstung" Actor habe. Da sind dann alle Waffen Infos drinnen. Daraus erzeugt ein Munition Child welches nur Munition enthält usw.


    Daneben ein separates "Master-Fahrzeug", was alle Fahrzeug Dinge enthält, Waffen, Munition, Bauteile usw.


    Zuerst hatte ich alles in einem Master-Actor, habe aber feststellen müssen das es zu Performance Probleme führte, je mehr Informationen darin enthalten waren. Dafür war es bequemer weil man nur einen Haupt-Actor für alles hatte.

    Es kann aber auch sein das ich damit komplett falsch liege.

    Das werde ich erst sehen wenn das ganze mit mehr Spielern abläuft.


    Danke für die Info ich werde es mir noch mal genauer anschauen.



    Ich habe meine ganzen Interaktionen nun in separate Components ausgelagert, weil ich damit besser Zugriff auf die separaten Gegenstandsysteme habe.


    Z.B. "InventoryTransferComponent", darüber erfolgt der ganze Austausch der Inventare hin über die ganzen Gegenstand-Systeme, weil diese unterschiedlich sind. Das ist etwas doof zu erklären aber ein Component kann ja bei jedem Actor erfolgen. Sonst müsste ich alles in jedem Actor separat erstellen.


    Das FixUpRedirectors brachte leider keine Verbesserung.


    Ja das Compilieren dauert genau so lange wie das verbinden der Nodes.

    Komischerweise ist das aber nicht bei allen. Wenn ich mein Array mit einer Array-Get Node verbinde, geht es sofort.


    CPU Auslastung usw. da gibt es keine Veränderung.

    Ich merke nur das der Editor dabei hängt und nicht mehr reagiert.


    Mir kommt es so vor als irgendwas in dem Array für Leistungsprobleme sorgt.

    • Offizieller Beitrag

    (Der Grund warum ich keine IDs verwende, weil ich nicht den Sinn dahinter verstehe

    ich dachte der Sinn ist zwischenzeitlich klar ? Es ist ein Unterschied ob du in einer Datenbank nach einer einer ID mit vielleicht 4 Stellen suchst oder ob du ewig lange Strings durchsuchen musst. Auch kannst du Gegenstände sortieren, in dem sich zb Waffen in einer Range von ID 100 - 200 befinden. Rüstungen von 400 -600 usw


    Mein Eindruck ist so wie du es geschildert hast, dass du immer nach Gegenständen und ihrem Namen suchst und dass dürften ja dann strings sein.


    Was ich auch nicht verstehe: Wenn du deine Sachen in einem Array speicherst, dann kannst du sie ja nicht persisent speichern. Wenn dein Spiel Online verfügbar sein soll, dann brauchst du ne Datenbank. Es ist doch viel Sinnervoller eine Datenbank zu haben wo alle Player ihr Kram reinspeichern. Die Menge an Daten wächst sonst expotenziell zu deinen Playern. Wenn es 10 Gegenstände gibt, dann haben 100 Player bereits 1000 Datensätze die durchsucht werden müssen. Bei 1000 Player sind es bereits 10000 Datensätze.


    Jeder Internet Shop und jede App und des Spiel benutzen IDs um ihre Artikel und Gegenstände schneller verwalten zu können.

  • Was ist eigentlich wenn von dem Excalibur Schwert (als Beispiel) 1000 unterschiedliche Varianten existieren, weil diese alle von den Spielern manuell modifiziert wurden. Wie sortiert man das?



    Das mit dem Speichern kommt noch. Bisher muss ich das leider erstmal so machen da mir Erfahrung dafür fehlt usw.


    Das Array soll ja nur während des Spiels genutzt werden. Wenn man das Spiel startet oder verlässt, wird der Inhalt der Arrays in eine externe Datei gespeichert und das array gecleart. Startet man im Spiel, wird vom Server der Inhalt der Datei in den Array geladen. So stelle ich mir das vor.


    Ich habe noch ein anderes Problem und hoffe hier auf eine Lösung zu treffen.

    Wenn ich in einem Struct etwas ändere, erhalte ich von allen Blueprints usw. die Fehlermeldung "Unknown Structure". Das dauert dann ewig bis alles manuell wieder compiled wurde oder mit refresh all nodes... es dauert einfach viel zu lange.


    Gibt es das auch in schneller?

  • Was ist eigentlich wenn von dem Excalibur Schwert (als Beispiel) 1000 unterschiedliche Varianten existieren, weil diese alle von den Spielern manuell modifiziert wurden. Wie sortiert man das?

    Dafür gibt es dann mehrere Suchkriterien. Erster Suchbegriff dürfte dann zum Beispiel "Excalibur" sein. Als Nächstes dann, keine Ahnung, Stärke oder so. Eine derartige Suche wirst du allerdings wohl wirklich nur mit einer SQL-Datenbank und Select-Abfrage hinbekommen. Zumindest stelle ich mir das mit Arrays sehr kompliziert vor, wenn überhaupt machbar. Datenbanken haben schon ihre Existenzberechtigung.

    Die größere Frage ist doch, warum diese Information jedem Spieler überall im Spiel zur Verfügung stehen sollte.

    • Offizieller Beitrag

    Was ist eigentlich wenn von dem Excalibur Schwert (als Beispiel) 1000 unterschiedliche Varianten existieren, weil diese alle von den Spielern manuell modifiziert wurden. Wie sortiert man das?

    Jeder Spieler hat eine Zeile in der Datenbank mit seinem Besitz. Dort steht eine Zelle mit dem Excalibur-Schwert und über welche Attribute es verfügt. Diese Datenbank sollte BTW auch Sicher sein, damit keine Daten gecheatet werden können.
    Statt 1000 verschiedene Schwerter zu machen, könntest du ein modulares System verwenden. Zum Beispiel könntest du den Griff ausblenden oder einen anderen Griff einblenden. Ein Schwert hätte bei 1000 Möglichkeiten vielleicht 10 Dinge, die geändert werden können. Bei 100 Dingen, die ausgewechselt werden können, ergeben sich 1000 Möglichkeiten. Aber du brauchst in der Datenbank nur 10 Spalten dafür, wo geschrieben steht, welcher Griff verwendet wird, welche Verzierung die Klinge hat, welche Verzierung der Griff hat usw.
    Für die Welt draußen hättest du für jede Kiste eine Zeile, wo steht, was drin ist und über welche Attribute dieser Gegenstand verfügt.


    Die einen Daten speicherst du in einer Weltdatenbank: Wenn in einer Kiste ein bestimmtes Schwert Spawnt müssen alle Spieler das selbe Schwert in der Kiste finden.

    Die andren Daten zb das Inventar, speicherst du in den Player Informationen des jeweiligen spielers.


    Das Thema Sicherheit geht manchmal komplett unter: Ich vor über 10 Jahren mal Facebookspiele Manipuliert in dem ich über eine Software die Datensätze analysiert hab. Dafür gibts Software.

    Du startest eine Software die ein Spiel überwacht. Du kaufst in diesem Spiel etwas, und das Programm schaut was im Spiel passiert.

    Wenn das Online passiert. Kannst du diesen Datenaustausch simulieren. Du zb dem Server sagen: Hey hier hab ich einer Kiste 1000000 Millionen Münzen gefunden.

    Da muss man Sicherheitsmechanismen einbauen dass man sich so nicht einfach dinge ercheaten kann.


    Ich will damit sagen: Du musst die Datenbank so aufbauen das du solche dinge verhindern kannst. Sonst merkst du am Schluss das du die Datenbank so wie du sie gebaut hast in die Tonne treten kannst.


    Ich kann dir da aber leider auch nicht viel dazu sagen.