Deswegen würde ich auch immer nur Spiele, bzw. Anwendungssoftware programmieren. Da ich programmiere ohne nachzudenken und dann darauf warte, bis das System irgendwo versagt um es an der Stelle dann zu reparieren, würde ich es als absolut fahrlässig ansehen, wenn diese Software für Dinge genutzt würde, die Lebewesen verletzen könnten. Bei Software, die für sowas eingesetzt wird, sehe ich Planung und präzises Vorgehen als absolute Notwendigkeit und das eine solche Software Jahre an Entwicklungszeit braucht, sehe ich als absolut legitim.
FredK hat geschrieben:Ach übrigens: Warum hattest du eigentlich dein Stonequest neu entwickeln müssen?
Also ich habe das alte Stonequest kurz bevor ich meinen Job bekommen habe angefangen. Während ich gearbeitet habe, hatte ich einfach keine Kraft, mich noch weiter auf das Projekt zu konzentrieren und es in die Ecke gelegt. Zudem kam, dass ich mit dem Multithreading Probleme hatte, da Delphi überall, wo Instanzen allokiert werden, und ich vermute auch, wenn sie freigegeben werden, eine Kritikal Section drum rum baut, was dann dazu führt, dass es trotz Multithreading, gehackt und gestockt hat. (Das ist jetzt immer noch der Fall, aber das hat im Moment den Grund, weil ich die Abarbeitung, die im Hauptthread geschieht direkt durchhaue, statt das in kleine Packete abzuarbeiten)
So, das Problem war nun, da ich die Engine über besagte Patterns realisiert habe, komplett umbauen müsste. Und da finde ich das Refactoren wesentlich aufwendiger, als das neu schreiben. Zumal man dann aus dem selbst angelegten Korsett kommt und das ganze nochmal grundlegend neu beleuchten kann.
Es waren auch viele Dinge in der Engine, die eigentlich unnötig sind (alles über GUID's zu realisieren).
Bei mir ist es so, dass ich das gesamte Konstrukt im Auge haben muss. Ich bin nicht in der Lage, einzelne Teile auszublenden (psychologisch). Also es ist nicht so, dass ich jede Codezeile im Kopf habe, aber ich eine eine Vorstellung vom gesamten Projekt ständig in meinem Cache (im Kopf). Wird das Projekt zu groß, scheitere ich definitiv. Hunderte Klassen kann ich nicht mehr überblicken. Eine handvoll Subsysteme schon.
Ich habe beruflich auch nicht allzu viel Erfahrung und kann mir kaum vorstellen, an einem Projekt zu arbeiten, wo ich nur einen Teilbereich überblicken kann (so wie das aber wohl in jedem Unternehmen der Fall ist).
Aber ich denke, an dieser Schwäche steckt auch eine große Chance. Dadurch das einem das ganze System ständig bewusst ist, kann man auch daraufhin optimieren. Und es lassen sich unglaublich viele Dinge zusammenführen.
Ich würde sagen, dass ich Enginemäßig schon jeden Bereich, der mir Bewusst ist, irgendwann mal implementiert habe. Und letztlich ist es alles das gleiche.
Ich kenne mich nicht sehr mit Sound aus. Aber auch zwischen Texturen und Sounds sehe ich starke parallelen. Die Datenaufteilung ist etwas anders, lässt sich aber auch hier auf einen gemeinsamen Nenner bringen. Ein Pixel im Bild ist die Summe aus Frequenzen, die letztlich die Farbe darstellen. Das ganze in einer Zweidimensionalen Matrix ergibt schließlich das Bild. Sounds hingegen sind eindimensional. Die Amplitude zu einem gewissen Zeitabschnitt ist letztlich auch die Summe der Frequenzen zu dieser Zeit... anders wie das Auge, dass bei einem Pixel die Farbe als Ergebnis aktzeptiert, wird vom Ohr eine Fouriertransformation gemacht. Diese entsteht einfach dadurch, dass die Härchen, die den Klang aufnehmen, verschieden lang oder positioniert sind (weiß das nur oberflächich und jemand kann hier garantiert alles im Detail wiedergeben, oder Wiki, oder Google, mir ist das Detail egal) direkt bei der richtigen Frequenz mitschwingen.
Datentechnisch gesehen ist ein Pixel im Bild wie die Amplitude in einem Sound, nur dass man hier nur einen Farbkanal hat. Man könnte vielleicht Stereo oder Dolby dann hier als verschiedene Kanäle betrachten. Statt nun das Bild als solches (und man kann ein 2D Bild ja genauso auf 1D runterbrechen) hat man letztlich einen Datenstrom. Beim Bild wird das ganze nun komplett angezeigt. Beim Sound wird immer ein Ausschnitt ausgegeben.
Naja, diese Erklärung war wohl etwas Konfus und ich hoffe, ihr zerreist mich jetzt nicht, wegen meiner Denkweise.
Ich versuche was ich meine noch an einem anderen Beispiel klar zu machen:
2D, 3D und 4D Vektoren werden (zumindest in einer Engine die nicht alles können muss) für ganz bestimmte Zwecke verwendet. Man könnte sie von den Daten her auf einen einzigen 4D-Vektor Typ abbilden. (Das mache ich aus Geschwindigkeitsgründen im Moment nicht so) Der Vorteil den ich darin sehe ist, dass man nur ein einziges Konstrukt hat. Viele Operationen lassen sich hier vereinheitlichen. Farben, die normalerweise als RGBA dargestellt werden, passen genauso schön in den 4D-Vektor und zudem hat man auch viele Operationen, die wieder identisch sind. Andere kommen hinzu, die dann speziell nur für Farben Sinn ergeben. Z.B. Umwandlung von Farbräumen wie RGB zu HSL.
Was ist eine Kugel? Im Endeffekt eine Position + Radius... 4 Komponenten, wobei die ersten drei ein einfacher Vektor darstellt, die vierte Komponenten tanzt etwas aus der Reihe... aber das tut der Alpha-Kanal bei den Farben auch... also hey, warum nicht zusammenlegen?
Quaternionen, die nun doch etwas spezieller sind haben genauso 4 Komponenten. Genau wie ein Plane.
So kann ich mit einem einzigen Record schon einiges abdecken... viele werden wohl nun sagen, nur weil es durch die gleichen Daten dargestellt wird, sind es ja dennoch verschiedene Dinge, auch wenn sie sich an einigen Punkten überschneiden. Aber ich will aus dieser Denkweise raus kommen und sehe es als Daten, die je nach Betrachtung unterschiedlich sein können.
Ob das ganze letztlich dienlich ist oder nicht, sei dahingestellt. Aber für mich fällt da wieder einiges an Code weg.
Bei Stonequest überlege ich im Moment, wie ich Lebewesen sinnvoll umsetzen soll. Die hardcore Softwaredesigner werden da wohl für jedes Tier eine eigene Klasse machen. Bei mir gibt es nur einen Actor, der über ein Enum bestimmt, um welchen Typ es sich handelt... die KI verzweigt sich dann je nach Art in einer einzigen Funktion (klar kann man das wieder ein wenig auslagern und wenn es zu unübersichtlich wird, mach ich das auch). Aber was ich im Moment wirklich überlege ist, ob ich jedem Tier ein eigenes Skelettsystem geben sollte und eigenes Modell... oooooooooooder ob es nicht viel besser wäre, einen gemeinsamen Nenner zu finden... Säugetiere und Vögel sind wohl immer viergliedrig. Also warum nicht ein Skelett, bei dem man bei jeder Tierart nur Proportionen ändert. Vielleicht könnte man das auf Skinning übertragen. Am Ende stände ein Generator für bestimmte Lebewesen, der durch ein paar Parameter das Aussehen eines Tieres bestimmen kann. Gestern fragte mich jemand auf dem Spieleentwickler-Treffen, was denn wäre, wenn man Drachen hätte. Finde ich eine berechtigte Frage, zumal ich Drachen auch sehr cool fände und die vielleicht ins Spiel finden. Warum nicht dem Skelett gleich die Möglichkeit für Flügel mit verpassen... wären also dann 6 Glieder. Bei Bedarf kann man das System halt stetig erweitern. Aber solange kein Bedarf ist, warum dann eine Ultimativlösung für alles machen, was die Komplexität am Ende wieder sprengt.
Übrigens ist das ganze Äquivalent zu meinem Baumgenerator.