Archiv der Kategorie: Uncategorized

Kurzes Update

Hallo zusammen

Es gab schon ewig kein Update mehr, darum dachte ich mir, mache ich doch jetzt wenigstens schnell ein kurzes: Hinter den Kulissen bin ich immer noch fleissig am Projekt am arbeiten.

In meinem Leben ging in den letzten Monaten einfach so viel (Jobwechsel, ein paar private Dinge, Urlaub), dass ich weniger Zeit als Üblich für das Projekt hatte.
Daher entschied ich mich, die Zeit die übrig blieb dazu zu nutzen, wirklich am Projekt zu arbeiten statt lange Blogeinträge zu schreiben, die oft mehr Zeit benötigen, als man denken mag.

Bleibt gespannt!

Fortschrittsbericht: Januar 2019

Im Januar hat sich einiges getan, aber das meiste davon habe ich bereits geposted.

Hauptsächlich habe ich:

  • Ein System entwickelt um NavMeshes (Daten, die der KI sagen, wo sie hinlaufen kann und wo nicht) aus 2D Objekten zu generieren.
  • Endlich den ersten Schiffskampfprototypen fertiggestellt.

Aus reiner Neugier habe ich ein Diagramm erstellt, welches darstellt, wie viele Tasks ich in den letzten 120 erstellt und abgeschlossen habe. ich war überrascht, wie gut sich die verschiedenen Geschehnisse meines Lebens aus dieser Grafik erhauslesen lassen (Da ich mir aus Zeitgründen vorgenommen habe, die Blogeinträge etwas effizienter zu gestalten, sind die Beschreibungen leider nur in Englisch, ich bitte um Verständnis.):

Codeschnipsel #2: Nicht Ganz So Simpler Pooling Manager

Vor einer Weile habe ich über meinen simplen Pooling Manger geschrieben. Unglücklicherweise stellte sich dieser für meine Zwecke als etwas zu simpel heraus.

Ein für mich häufiger Anwendungsfall wurde nicht abgedeckt: Objekte aus dem Pool holen, aber nicht unmittelbar verwenden. Kern des problems war, dass zum Bestimmen, ob ein Objekt in Benutzung ist oder vom Pool vergeben werden kann, geschaut wurde, ob ein Objekt aktiv ist, oder nicht.
Vergab der Pool ein Objekt, setzte er dieses auch direkt auf aktiv, damit es nicht aus versehen 2x vergeben wird.

In einem Fall wie dem folgenden brachte das aber einige Probleme mit sich:

  • Ein Schiff feuert seine Kanonen.
  • Da das Schiff 20 Kanonen hat, werden 20 Kanonenkugeln benötigt.
  • Um etwas mehr Realismus ins Spiel zu bringen, werden nicht alle Kanonen exakt zur selben Zeit abgefeuert.
  • Allerdings ist es wesentlich performanter, 20 Kugeln mit einem Aufrufr aus dem Pool zu holen, als 20x eine Kugel.
  • Da der Pool die Objekte „aktiv“ setzen muss wenn er sie vergibt, werden die Kugeln sofort sichtbar. Das funktioniert für Kugeln, die im selben Frame gefeuert werden, wie sie angefragt wurden. Kugeln, die aber etwas später abgefeuert werden, erscheinen auf dem Bildschirm an der Stelle, an der sie waren, bevor sie das letzte Mal deaktiviert/in den Pool zurückgegeben wurden und bleiben dort, bis sie wirklich gebraucht werden. Dann werden sie an die Korrekte stelle teleportiert und abgefeuert.
  • Um dieses Problem zu umgehen, musste ich viel Code schreiben, der ausgeführt wurde, wann immer das Objekt (de)aktiviert wurde. Es war einiges an Arbeit, fehleranfällig und musste separat für jede Art von Pool Objekt gemacht werden, die nicht immer direkt benutzt wurde, nachdem das Objekt aus dem Pool angefordert wurde.

Deshalb habe ich einen neues Pooling System geschrieben, das nicht den active Status eines Objekt nutzts, um festzustellen, ob das Objekt gerade in Gebrauch ist oder nicht. Auf diese Weise kann der Pool ein Objekt vergeben, das noch inaktiv ist und erst bei effektiver Benutzung aktiviert werden kann.
Da es grosse Änderung gibt, habe ich mich dazu entschieden, statt den alten Beitrag upzudaten, einen neuen zu verfassen. Auf diese Weise können auch Leute, die lieber einen simpleres System verwendeten oder die beiden vergleichen möchten, dies problemlos tun.

Hier ist meine neue Version des Pooling Systems:

Klasse zum Verwalten der Pools:

Pool Klasse:

Klasse die, die vom Pool zu den gepoolten Objekten hinzugefügt wird. Diese Metainformationen werden dann vom Pooling Manager benutzt, um Objekte in den richtigen Pool zurückzulegen:

Bemerkungen

  • Im alten Pooling System Beitrag erwähnte ich, dass es wesentlich performanter ist, 1x n Objekte anzufordern, als n mal 1 Objekt.
    Während es immer noch performanter ist, alle Objekte in einem Aufruf zu holen, sind die Unterschiede beim neuen System wesentlich geringer.
  • Stellenweise sieht der Code etwas unelegant aus (for statt foreach, speichern der Anzahl Listenelemente statt Count() zu verwenden, etc.).
    Dieses Design ist beabsichtigt. Ich habe eine ausgiebige Performanceanalyse gemacht und kam zum Schluss, dass der Code auf diese Weise wesentlich performanter ist, wenn mit einer grossen Anzahl an Objekten gearbeitet wird.