Tagebuch: GalaxyCommand

Der Sinn war natürlich dass das eben nicht passiert. Zumindest könnte ich dann bei Änderungen die Kartendaten einfach in einen neuen Spielstand übertragen und mein Raumschiff für Testzwecke behalten.
Aber dein Vorschlag ist eigentlich gar nicht so schlecht, vielleicht ist das auch erst mal zu viel tote Arbeitszeit, stattdessen konzentriere ich mich erst mal auf die rudimentäre Umsetzung der Spielelemente.

Im Vordergrund steht immer noch die Weiterentwicklung der einzelnen Techniken. Dann kommt als nächstes die Anschaffung einer Kreditkarte :smiley: Bin kein Freund von Krediten, aber anders kommt man nicht an einen Entwickleraccount bei Google, damit es hier auch mal was zum sandboxen gibt :smiley:

Ja aber ich glaub das funktioniert nur wenn das Spiel schon Recht weit ist. Und selbst dann nicht immer. So war es zumindest bei Feature Runner.

Ja mach das Mal ;). Wäre durchaus interessant :slight_smile:

So, jetzt hat das Raumschiff auch ein Schadenssystem. Wände, Böden und Bordsysteme (Antriebe, Waffen, Kühltürme, Teleporter) können jetzt also auch visuell kaputt gehen. Die Wegfindung und das Raycasting ignorieren zudem zerstörte Elemente.

Die größte Kopfnuss war aber das überarbeiten des Rotierens von Boardsystemen. Trigonometrie :sweat_smile: Besonders auch noch invers.
Das Array des Boardsystems wird nicht mehr selbst rotiert, sondern die theoretische Position auf dem rotierten Array wird invers zurück transformiert.
Ja und da war es dann auch schon halb 6 Uhr morgens :sweat_smile:

Java Programmierer hypen immer so ihre „Tests“ (bin ich nicht immer so überzeugt von für jedes Hello World mindestens 3 Stück zu haben), aber das war mal so einer dieser Momente wo sich in meinen Augen der Test wirklich gelohnt hat. Insbesondere weil Android Studio die Tests auch auf dem lokalen Gerät ausführen lassen kann - war extremst hilfreich.

Oha. Ich hab ne Regel für mich: nach 22:00 mach ich nix mehr. Da ist mir die Gefahr zu groß, dass ich am nächsten Tag dann einiges fixen darf ^^.

Nun ja - es kommt halt immer drauf an, wie exzessiv man Tests schreibt. Klar, man kann versuchen jeden Edge-Case ab zu decken. Aber ich bin ein Freund von „Happy Path first“. Das reduziert die tests schon mal und man hat eine abgesicherte Basis.

Als nächstes steht an, ein automatisches Optimierungssystem einzubauen, um die Auslastung auf die einzelnen Kerne zu verwalten/zu verteilen/zu optimieren.

Dafür habe ich mich die letzten Tage mit dem (erweiterten) Kalman Filter auseinander gesetzt um die Messungen der Prozessor-Auslastung zu glätten. Ansonsten könnten kurze starke Messauschläge dafür sorgen, dass das geplante Optimierungssystem instabil wird.

Und nachdem ich jetzt das Problem der Nicht-Linearen Systemdynamik angegangen bin folgt direkt die nächste auch nicht kleine Herausforderung: Das Partitionsproblem. https://de.wikipedia.org/wiki/Partitionsproblem
Irgendwie müssen die Aufgaben (Aufgabenlast) auf n Prozessorkerne möglichst gleichmäßig verteilt werden. Es gibt Lösungen für 2 und für 3 Systeme, aber nicht für n Systeme… man darf gespannt sein wie ich das schlussendlich angehe.

EINTRAG #1

Jahre später :smiley: Und das automatische Optimierungssystem ist endlich fertig. Dafür waren teifgreifende Änderungen in der Projektstruktur notwendig um neue Abhängigkeiten zwischen den Threads und ihren Datenbanken zu ermöglichen, oder um Tomate_Salat zu zitieren:

Die Lösung sieht in etwa wie folgt aus: Es gibt einen zentralen „Kapazitäten“ Markt in der alle Threads ihre Auslastung abgeben, und anschließend können die Threads bei Bedarf Kapazitäten einkaufen bezwiehungsweise Workloads dauerhaft verkaufen.
Die Auslastung aller Workload(-Gruppen) kann zu diesem Zweck einzeln überwacht werden.

Damit das ganze System nicht überschwingt oder sich gar instabil verhält, werden mehrere Kalman Filter eingesetzt, die Rauschen aus den Messwerten in Echtzeit filtern und damit verhindern dass Kapazitäten kreuz und quer, vor und zurück verkauft werden.

Die Änderung war unheimlich notwendig, und das merke ich jetzt mehr denn je wie flüssig das läuft. Vorallem beim Neustart des Programmes sind viele Aufgaben auf (später) voll ausgelasteten Threads gelandet, und das konnte nicht mehr geändert werden.


EINTRAG #2

Zudem habe ich die Schwarm-KI and das neue Multithreading Framework angepasst und die kann jetzt nicht nur größere Karten bearbeiten sondern läuft auch Thread übergreifend… schneller!? :frowning: Meine Vermutung ist dass die Threads/Kerne zusammen einen größeren Cache haben, denn Speicherlatenz ist ein großes Thema bei der Schwarm Intelligenz.


EINTRAG #3

Weiterhin hab ich die Multithreading Architektur „Context-based Threading“ jetzt in „Asynchronous Context-based Threading“ umbenannt für die neue Abkürzung „ACT“. Wie man mich im Chat hinwies war die alte Abkürzung bereits „in Verwendung“ für etwas mit dem ich nicht identifizieren möchte.

Also jetzt mal ernsthaft, wenn ich das hier

for( int y = 0; y < arrayLength; y++ ) {
    for( int x = 0; x < arrayHeight; x++ ) {
        array[x][y] = consume(array[x][y]);
    }
}

auf 8 Threads gleichmäßig aufteile (der Code ist entsprechend angepasst) und die Ausführungszeit der Threads zusammenrechne, komme ich auf 1000-2000µs. Führe ich den Code dagegen so wie oben Singlethreaded aus, komme ich auf 15000-18000µs.
Das ist doch nicht normal? :face_with_raised_eyebrow: Wie ist das denn überhaupt möglich?

Und es wird sogar noch schlimmer, wenn ich die x und y Verschachtelung vertausche sind es sogar 600-1000ms (Singlethreaded war es bereits vertauscht). Meine ganze Erfahrung zerbricht vor meinen Augen… :pleading_face:

Da es mit dem Projekt etwas schleppend vorangeht, habe ich mich mal etwas mit dem Komponieren von Musik beschäftigt. Hier mal ein kleines Sample von mir:


Natürlich mit kräftiger Rechner-Unterstützung, schon Wahnsinn was heute alles möglich ist.

Bin mir nicht ganz sicher ob die Musik so passend für das “SciFi” Theme ist. Habe auch noch ein bisschen mit Synthesizern herumgespielt, aber das war nicht so gut.

2 „Gefällt mir“

Richtig schöne Hintergrundmusik!
Dachte dabei auch eher an Zelda, offene Welt und Sonnenschein.

Wie hast du sie erstellt? Mit welchem Programm/welcher Hardware? Möchte das auch gerne endlich mal angehen. =)

Ufff das ist komplizierter zu erklären, denn es gibt einen Faktor der die ganze Erklärung nochmals gänzlich durcheinander bringt. Ich bin natürlich weder Mozart noch hab ich ein Orchester. :smiley:

Das Komponieren selbst ist schon schwer genug aber man benötigt noch eine gute Composer Software und natürlich einen Synthesizer um die Musik überhaupt abzuspielen. Und die sind teuer. Ein Freund oder Bekannter mit einem kleinen Tonstudio ist von Vorteil.

Hier kommt der Faktor AIVA ins Spiel. Auch wenn es einem das Marketingmaterial auf YouTube zumuten will, AIVA ist kein Hans Zimmer. Sondern eine künstliche Intelligenz die Musikstücke komponieren kann von denen die meisten einem Katzengejammer am nächsten kommen. Aber wenn man nur genügend vielen Affen eine Schreibmaschine gibt kommt manchmal tatsächlich eine gute Anfangsmelodie heraus. Einem Anfänger wie mir gibt das einen unglaublichen Headstart an dem man basteln kann, sowie einen Einblick über den strukturellen Aufbau, von Anfang bis Ende, den Übergängen und den einzelnen Instrumenten.

AIVA kann die Musik auch direkt „Rendern“, also in hörbare Musik überführen - das ist in der Musikwelt weit weg von Selbstverständlich. Man kann die Instrumente und deren Spielart verändern und einzelne misslungene Abschnitte komplett neu generieren lassen. Ich habe relativ schnell die Tonleiter, was eine Oktave ist und den Unterschied zwischen Tremolo, Vibrato, Legato, Spiccato und weiteren kennen gelernt.

https://beta.aiva.ai/

Danach wird es aber komplizierter. Um die Musik gezielter zu komponieren, schiefe Töne zu entfernen, die Übergänge sanfter zu gestalten und das Stück allgemein auszuschmücken wird natürlich weiterhin entsprechende Composer Software und Synthesizer benötigt. Freeware gibt es dafür praktisch nicht.

Ich verwende Steinberg Nuendo. Teuer, aber zu meinem Glück ist mein früherer Mitbewohner Musikproduzent mit einem kleinen Studio. Nuendo kann natürlich auch überzeugende Musik erzeugen.

Hab die Tage mal ein bisschen die Grafik neu gezeichnet (modularisiert), inklusive dem Schadenmodell. Und die API der HiveAI hat gute Fortschritte gemacht, ist jetzt auch ein bisschen intelligenter.

Hier ein kleines Video zum aktuellen Stand. Leider stimmt etwas mit der Video Aufnahme Funktion nicht, weshalb leider gezwungenermaßen große schwarze Ränder zu sehen sind. Ich würde mich über den ein oder anderen Kommentar/Anregung freuen.

Ziemlich cool: Es gab einen Fehler im Renderthread und Umgang mit OpenGL, der dafür sorgte das ALLE Threads ungewöhnlich lange und unregelmäßig pausiert wurden, das hat das gesamte System geräteübergreifend betroffen. Jetzt läuft das Spiel selbst im Debugmodus geschmeidig wie Seide, das ist unglaublich! So sehr hatte ich mich daran gewöhnt.

Der eigentliche Grund des Fehlers ist nicht bekannt und trat auf allen Samsung Galaxy S5-S8 Modellen auf. Hat aber irgendetwas damit zu tun, in welcher Reihenfolge Arrays auf CPU Seite initialisiert und dann an die GPU übertragen werden.

// good
int[] array = new int[10];
int[] array2 = new int[10];
gpu.send(array);
gpu.send(array2);

// bad
int[] array = new int[10];
gpu.send(array);
int[] array2 = new int[10];
gpu.send(array2);
1 „Gefällt mir“

Ich habe die letzte Woche - und damit weit mehr als mir lieb ist oder ich öffentlich zugeben würde - damit verbracht mich vor Excel zu setzen und meinen Kalman Filter zu tunen, um Messwerte besser vor Ausreißern zu stabilisieren.

Und so sieht das in der Praxis aus:


In Blau sind die Messwerte+Rauschen / In Orange der gefilterte Wert, und ich finde er ist ziemlich gut. Die gemittelte Abweichung beträgt 0,07.

Die Problematik ist ziemlich einfach: Man misst etwas in Echtzeit, aber die Messung ist ungenau (+Rauschen), der reale Wert ist unbekannt. Für den Durchschnitt müsste man alle Werte vorher kennen. Das führt zum nächsten Problem: Was ist eine Veränderung des Realwertes und was darf weg?

Und jetzt zu dem was ich gemacht habe:
Für Beide Fälle gibt es bereits sehr gut dokumentierte und erprobte Lösungen: Der lineare und der nicht-lineare(/erweiterte) Kalman Filter.
Aber für den erweiterten Kalman Filter benötigt man eine mathematische Darstellung des Systems - macht das mal für Frames per Second :smiley: -, außerdem ist er sau kompliziert aufzusetzen und richtig zu kalibrieren. Für Java wird es da mit guten Bibliotheken auch knapp, weil Mathematiker nur Python oder Matlab können und ich kann kein Mathe :smiley:

Deshalb habe ich mir einfach gedacht ich nehme zwei lineare/einfache Kalman Filter, einen mit niedriger und einen mit hoher Genauigkeit (relativ zueinander), und beobachte wie ihre Werte auf Veränderungen des Realwertes vs Rauschen reagieren.
Z.B. hat jeder Filter einen angenommen Realwert und eine angenommene Toleranz in der sich der reale Realwert nach deren Vermutung befinden könnte. Wenn die Bereiche der zwei Filter nicht mehr überlappen, kann angenommen werden, dass der ungenaue Filter - der sich schneller neuen Werten anpasst - wahrscheinlich eine Veränderung des Realwerts erfasst hat. Und dann wird der genaue und träge Filter daraufhin korrigiert.

Das ganze hab ich dann den stabilen nicht-linearen Kalman-Filter genannt. Und er ist nicht fertig, aber ich hab schon viel zu viel Zeit darin investiert. :roll_eyes:

Ich hab eine interessante Entdeckung gemacht was die Multithreading Performance immens schädigt.

Unten sieht man 3 Bilder, der gleichen Szene, aber mit unterschiedlich vielen Kernen aktiviert und ihrer Ausführungszeit. Wenn man die Gesamt-Ausführungszeit zusammenrechnet kommt man auf folgendes:

  • 1 Kern(e): 246ms [246ms]
  • 3 Kern(e): 85ms [28ms]
  • 7 Kern(e): 353ms [50ms]
    [Schnitt]

Zwar sind 7+1 Kerne parallel immer noch schneller als 1+1 Kerne, aber langsamer als 3+1 Kerne. Weniger ist mehr!

Meine versuchte Begründung: Auf Android-Geräten kommen häufig ARM CPUs in der big.LITTLE oder einer ähnlichen Architektur zum Einsatz. Die Kerne der CPUs unterteilen sich dabei in unterschiedliche Leistungsklasse - das ist wie wenn die hälfte eines Desktop i7 aus einem mobile i7 „U“ bestehen würde, um Strom zu sparen wenn der Rechner gerade nicht ausgelastet ist.
Ich schätze dass die Kommunikation zwischen den unterschiedlichen Clustern der CPU einen immensen Overhead hat.

Wenn man jetzt bedenkt dass beim aktuellen Snapdragon 855 oder der Exynos 9 CPU (Samsung Galaxy S10) die 8 Kerne in 3 Leistungsklassen unterteilt werden, muss man ganz genau abschätzen ob Multithreading der Performance nicht sogar schadet. :anguished::fearful:



Zwar schrieb ich die erste Antwort in diesem Faden, aber zugegebenermaßen muss ich gestehen, länger nicht mehr in diesen Faden geschaut zu haben, und jetzt sehr angenehm überrascht zu sein, welche Fortschritte du gemacht hast, TMII! :slight_smile:
Ich werde diesen Faden auf jeden Fall weiter beobachten! :smiley:

Kennt ihr das, wenn man im Nachhinein ein Feature einbauen möchte, für die das bestehende System absolut nicht ausgelegt ist?
Ich überlege seit Tagen, wie ich ein möglichst kompatibles Beleuchtungssystem in mein Spiel bekomme.

Hat das Priorität? Nein.
Ist es notwendig? Nein.
Ist es sinnvoll? Nein.
Aber Spiele mit Beleuchtung sehen einfach stimmig aus.

Oh, Beleuchtung oder besser gesagt Shader-Programmierung ist gleichsam „ein Buch mit sieben Siegeln“ (aber hier überwiegend im Sinne von geheim oder geborgen). Soweit ich weiß, halten dies die Spielehersteller sehr geheim, und jeder „kocht“ mehr oder weniger „ein eigenes Süppchen“. - Also man wird wahrscheinlich nicht einfach so „gute“ Shader im Internet finden - wenn auch solche Sachen wie globale Modelle, Schatten u. v. m. hinzukommen. Die Namen Phon, Blinn, Cook + Torrance sollten ein Begriff sein, aber darüber hinaus wird es rar… Siehe auch: https://en.wikipedia.org/wiki/List_of_common_shading_algorithms .

Um hier mal etwas Staub zu wischen, teile ich mal mein Logo:

Das wurde von mir komplett in PaintDotNet gezeichnet. Die Planeten (und ein Haufen Weiterer) hatte ich eigentlich mal für ein anderes mobile game gezeichnet, aber die zwei hier fand ich sehr gut gelungen.
Die Schriftart ist von irgendeiner Font-Download-Seite.

3 „Gefällt mir“

Schaut echt gut aus und interessant was man mit PaintDOTNet so anstellen kann. Hab das bisher noch nicht wirklich versucht auszureizen.

1 „Gefällt mir“