Neuorganisation der Itemverwaltung
Verfasst: 8. Aug 2005, 21:38
Da die Itemflut eine so grosse Rolle spielt bei der Serverlast, wäre ich dafür, die Itemverwaltung der Items im Bankschliessfach anders zu gestalten. Bisher scheint es so zu sein, daß jedes Item eine ID bekommt und diese nicht verliert, egal was mit dem Item passiert. Das heißt, sollte jemand 50 ZK in der Bank liegen haben, so werden 50 Einzelitems gespeichert mit 50 verscchiedenen ID\s. Die Frage, die sich mir dabei stellt, ist ob das unbedingt nötig ist?
Als Test dafür, daß das auch wirklich so ist, hab ich übrigens gleichartige Items aus dem Schliessfach genommen, mit ihre ID aufgeschrieben, sie ins Schließfach zurückgelegt, erneut herausgenommen und die ID\s erneut aufgeschrieben.
Hier also die Idee: Anstatt jedes Item für sich abzuspeichern, wird pro Item nur ein Exemplar abgespeichert und dazu die Anzahl der Items, die man davon besitzt. Die eigentlichen Instanzen der Items werden also beim Einlagern zerstört, es wird halt zu jedem Item nur noch eine Instanz gespeichert und die Anzahl der Instanzen. Beim Herausholen der Items aus dem Schliessfach werden die Items neu erschaffen und dann dem Inventar zugefügt, die Anzahl der Items, die im Schliessfach vorhanden sind, wird um den dementsprechenden Wert verringert.
Mein Schliessfach ist mit 500 Items ziemlich überfüllt, zugegeben, doch wenn man gleichartige Items zusammenfassen würde, so könnte man bei mir um die 280 Itemspeicherungen einsparen. Und ich denke, so wir mir wird es auch bei einigen anderen sein.
Es mag sein, daß es sich nicht lohnen würde, für jede Art Items diese Umsetzung zu machen, man sollte sie aber definitiv für bestimmte Items machen, wie z.B. Stierhoden, Kuhköpfe, Gepresste Zauberkugeln, Diebstahlzauber, Zauberpollen, Silberschnee, Goldstaub, Ölfässer, Baru-Getreide, Sumpfgas, Mondscheindiamanten, Rubine, ect. halt alles Dinge, die sich ansammeln könnten, jedoch als Einzelitem kaum gebraucht werden und somit auch nicht alzu häufig aus dem Schliessfach genommen werden. Items, die häufiger gebraucht werden, wie Edelstein des Lichts, könnten ihre ID behalten.
-----------------------------------------------
Anmerkungen zur Umsetzung:
Dieser Teil ist zur Bewertung der Idee nicht sonderlich wichtig, er ist eigentlich auch nicht wirklich für Sotrax gedacht, denn dieser wird selbst besser wissen, worauf man achten muß und was man machen kann (er kennt den Code, ich nicht!). Ich habe ihn eher für Interessierte geschrieben und für die Leute, die eine Idee grundsätzlich ablehnen mit der Begründung: DAs ist nicht möglich, oder das ist zu aufwendig, ohne überhaupt über die Vorgänge bescheid zu wissen oder die Probleme, die auftreten könnten. Natürlich ist dieses nur eine generelle Überlegung dazu und ich muß gestehen, ich hab persönlich mit MySQL nicht gearbetet, jedoch ähneln sich Programmiersprachen ja gründsätzlich.
--------------------------------
Aufpassen muss man darauf. daß Items mit Diebstahlschutz/Todesschutz gesondert abgespeichert werden, ebenso Unique-Items mit dem Namen eines Standarditems, aber einer anderen Beschreibung (ich kenne einen Fall, wo das bei einem Wok so ist) [was sich als das größte Problem herausstellen könnte] und Items mit Haltbarkeit. Auch muß darauf geachtet werden, daß nicht unterschiedliche Versionen des gleichen Items vermischt werden (sprich nicht alte und neue KU vermischt, sondern als getrennte Items behandelt). Mit anderen Worten: Es müßte wohl eine relativ aufwendige Funktion gemacht werden, welche ein einzulagerndes Item mit den bereits vorhandenen abgleicht.
Teile dieser Funktion müssen bereits vorhanden sein, da ansonsten das Zusammenfassen der Items bei der Anzeige nicht funktionieren würde. Was diese Funktion noch nicht leistet, ist das Unterscheiden, ob ein Item diebstahl-/Todgeschützt ist, oder nicht. Ich könnte mir auch vorstellen, daß der Sonderfall des Unique-Items Messingwok mit eigener Beschreibung auch mit einem Standard.Messingwok zusammengefasst würde. Aber in den Grundzügen gibt es schon die Routine, die Items in Gruppen einsortieren kann.
Das Sortieren des Bankschliessfaches ist kein Userabhängiger Vorgang, sondern kann nebenläufig passieren. Sorich: Sollte ein User Items einlagern wollen, so könnten diese immer noch wie üblich eingelagert werden, jedoch in eine temporäre Liste. Diese werd dann abgearbeitet und die Items einsortiert (und dabei zerstört), sobald der Server Luft hat. Andere Alternative, um die Sortierungsvorgänge zu begrenzen, wäre das Zwischenspeichern der Items in deiner FiFO-Hashtabelle, in der die Zeit gespeichert wird, zu der die Items in die Bank gelegt wurden. Frühestens nach einer gewissen Zeitspanne (z.B. 1h, oder aber nach dem Ausloggen des Spielers) werden die Items "richtig" einsortiert.
Sollten dermaßen "gepackte" Items wieder aus der Bank geholt werden. so müssten die Items neu erschaffen werden. Dabei muß darauf geachtet werden, diesen Prozess absturzsicher zu machen. am leichtesten geschieht das, indem die Items, die geholt werden, zunächst nicht ins Inventar des Charakters erschaffen werden, sondern in das Bankinventar. Das ist eine rein Serverseitige Sache, die wahrscheinlich relativ sicher läuft. Dann muß natürlich darauf geachtet werden, daß, bevor das erste Items aus der Bank übertragen werden darf, zunächst alle Additions-/Subtraktionsoberationen auf die Anzahl der befindlichen Items in der Bank abgeschlossen werden müssen (das dient dafür, daß man bei einem Serverlagg nicht in der Lage sein darf, Items zu verdoppeln). Hier ist es also vonnöten, mit Sperrmechanismen (Semaphoren) zu arbeiten.
Ansonsten sollte bei dem Prozess nicht alzuviel schiefgehen können, das eigentliche Übertragen der Items aus der Bank ist wie gehabt.
Wie viel oder wenig diese Einsparungen bringen, was die Sortierroutine von der Ersparnis des geringeren Itemaufkommens wieder an Performance schluckt, kann ich nicht sagen, ich kann mir aber vorstellen, daß eine deutlich spürbare Verbesserung herauskommt. Im Allgemeinen heißt es, wo auch immer die DB sinnvoll verkleinert werden kann, sollte man es machen. Und Sinn macht es, die DB an den Stellen zu komprimieren, die eh einen seltenen Zugriff haben.
Als Test dafür, daß das auch wirklich so ist, hab ich übrigens gleichartige Items aus dem Schliessfach genommen, mit ihre ID aufgeschrieben, sie ins Schließfach zurückgelegt, erneut herausgenommen und die ID\s erneut aufgeschrieben.
Hier also die Idee: Anstatt jedes Item für sich abzuspeichern, wird pro Item nur ein Exemplar abgespeichert und dazu die Anzahl der Items, die man davon besitzt. Die eigentlichen Instanzen der Items werden also beim Einlagern zerstört, es wird halt zu jedem Item nur noch eine Instanz gespeichert und die Anzahl der Instanzen. Beim Herausholen der Items aus dem Schliessfach werden die Items neu erschaffen und dann dem Inventar zugefügt, die Anzahl der Items, die im Schliessfach vorhanden sind, wird um den dementsprechenden Wert verringert.
Mein Schliessfach ist mit 500 Items ziemlich überfüllt, zugegeben, doch wenn man gleichartige Items zusammenfassen würde, so könnte man bei mir um die 280 Itemspeicherungen einsparen. Und ich denke, so wir mir wird es auch bei einigen anderen sein.
Es mag sein, daß es sich nicht lohnen würde, für jede Art Items diese Umsetzung zu machen, man sollte sie aber definitiv für bestimmte Items machen, wie z.B. Stierhoden, Kuhköpfe, Gepresste Zauberkugeln, Diebstahlzauber, Zauberpollen, Silberschnee, Goldstaub, Ölfässer, Baru-Getreide, Sumpfgas, Mondscheindiamanten, Rubine, ect. halt alles Dinge, die sich ansammeln könnten, jedoch als Einzelitem kaum gebraucht werden und somit auch nicht alzu häufig aus dem Schliessfach genommen werden. Items, die häufiger gebraucht werden, wie Edelstein des Lichts, könnten ihre ID behalten.
-----------------------------------------------
Anmerkungen zur Umsetzung:
Dieser Teil ist zur Bewertung der Idee nicht sonderlich wichtig, er ist eigentlich auch nicht wirklich für Sotrax gedacht, denn dieser wird selbst besser wissen, worauf man achten muß und was man machen kann (er kennt den Code, ich nicht!). Ich habe ihn eher für Interessierte geschrieben und für die Leute, die eine Idee grundsätzlich ablehnen mit der Begründung: DAs ist nicht möglich, oder das ist zu aufwendig, ohne überhaupt über die Vorgänge bescheid zu wissen oder die Probleme, die auftreten könnten. Natürlich ist dieses nur eine generelle Überlegung dazu und ich muß gestehen, ich hab persönlich mit MySQL nicht gearbetet, jedoch ähneln sich Programmiersprachen ja gründsätzlich.
--------------------------------
Aufpassen muss man darauf. daß Items mit Diebstahlschutz/Todesschutz gesondert abgespeichert werden, ebenso Unique-Items mit dem Namen eines Standarditems, aber einer anderen Beschreibung (ich kenne einen Fall, wo das bei einem Wok so ist) [was sich als das größte Problem herausstellen könnte] und Items mit Haltbarkeit. Auch muß darauf geachtet werden, daß nicht unterschiedliche Versionen des gleichen Items vermischt werden (sprich nicht alte und neue KU vermischt, sondern als getrennte Items behandelt). Mit anderen Worten: Es müßte wohl eine relativ aufwendige Funktion gemacht werden, welche ein einzulagerndes Item mit den bereits vorhandenen abgleicht.
Teile dieser Funktion müssen bereits vorhanden sein, da ansonsten das Zusammenfassen der Items bei der Anzeige nicht funktionieren würde. Was diese Funktion noch nicht leistet, ist das Unterscheiden, ob ein Item diebstahl-/Todgeschützt ist, oder nicht. Ich könnte mir auch vorstellen, daß der Sonderfall des Unique-Items Messingwok mit eigener Beschreibung auch mit einem Standard.Messingwok zusammengefasst würde. Aber in den Grundzügen gibt es schon die Routine, die Items in Gruppen einsortieren kann.
Das Sortieren des Bankschliessfaches ist kein Userabhängiger Vorgang, sondern kann nebenläufig passieren. Sorich: Sollte ein User Items einlagern wollen, so könnten diese immer noch wie üblich eingelagert werden, jedoch in eine temporäre Liste. Diese werd dann abgearbeitet und die Items einsortiert (und dabei zerstört), sobald der Server Luft hat. Andere Alternative, um die Sortierungsvorgänge zu begrenzen, wäre das Zwischenspeichern der Items in deiner FiFO-Hashtabelle, in der die Zeit gespeichert wird, zu der die Items in die Bank gelegt wurden. Frühestens nach einer gewissen Zeitspanne (z.B. 1h, oder aber nach dem Ausloggen des Spielers) werden die Items "richtig" einsortiert.
Sollten dermaßen "gepackte" Items wieder aus der Bank geholt werden. so müssten die Items neu erschaffen werden. Dabei muß darauf geachtet werden, diesen Prozess absturzsicher zu machen. am leichtesten geschieht das, indem die Items, die geholt werden, zunächst nicht ins Inventar des Charakters erschaffen werden, sondern in das Bankinventar. Das ist eine rein Serverseitige Sache, die wahrscheinlich relativ sicher läuft. Dann muß natürlich darauf geachtet werden, daß, bevor das erste Items aus der Bank übertragen werden darf, zunächst alle Additions-/Subtraktionsoberationen auf die Anzahl der befindlichen Items in der Bank abgeschlossen werden müssen (das dient dafür, daß man bei einem Serverlagg nicht in der Lage sein darf, Items zu verdoppeln). Hier ist es also vonnöten, mit Sperrmechanismen (Semaphoren) zu arbeiten.
Ansonsten sollte bei dem Prozess nicht alzuviel schiefgehen können, das eigentliche Übertragen der Items aus der Bank ist wie gehabt.
Wie viel oder wenig diese Einsparungen bringen, was die Sortierroutine von der Ersparnis des geringeren Itemaufkommens wieder an Performance schluckt, kann ich nicht sagen, ich kann mir aber vorstellen, daß eine deutlich spürbare Verbesserung herauskommt. Im Allgemeinen heißt es, wo auch immer die DB sinnvoll verkleinert werden kann, sollte man es machen. Und Sinn macht es, die DB an den Stellen zu komprimieren, die eh einen seltenen Zugriff haben.