Wie schon oben beschrieben,
jeder hat andere Vorstellungen Wünsche und Anregungen an die Engine.
Die Diskussion zeigt das wieder mal deutlich.
Um aber das ganze wieder auf den Tread-Titel zurückzubringen.
Mir geht es hauptsächlich um die Performance, was natürlich auch
das Memmory-Management mit sich bringt.
Meine Tests haben bis her ergeben das die Engine selber,
wenn mal die Map läuft, nicht wirklich Performance Probleme hat.
Das meiste geht zu lasten des hohen Speicherverbrauches,
und der langen Ladezeiten.
Andere Engines haben das bereits erkannt und laden, bzw. zeigen auch nur die Objekte,
die gerade gebraucht werden.
Obwohl mir bei den neuesten Spielen aufgefallen ist, das Shader jetzt meistens beim (erstmaligen-) Start
vorkompelliert und in die Grafikkarte geladen werden, was auch ewig dauert, und nicht alle gebraucht werden.
Um das mal vorstellbar zu machen ein kleines Rechenbeispiel.
Wir nehmen an wir machen einen Wald (zufallsgeneriert, oder nicht) mit 1000 Bäumen.
Der Baum(direct.x) hat z.B.: bei pine01 32 kb (~32.768 byte)
Als .dbo Datei 184kb (~188.416 byte)
Diffuse Textur 513kb (~528.384 byte)
Normal Map 257kb (~266.240 byte)
Specular Map 65kb (~69.632 byte)
Ich nehme mal die dbo Datei, weil da warscheinlich alle Eigenschaten zusammen drinnen sind excl. Texturen
Somit hätte der Baum:
A) Mesh: 0.18 MB
B) Texturen 864256 byte (~0.83 MB)
Für den 1. Baum benötigt man Metadaten, die beim Game-guru folgende wären
x, y, z, anglex, angley, anglez,
(scaleX, scaleY, scaleZ) sind offizell nicht angegeben, müssten aber auch dabei sein.
object, active, activated, collected,
haskey, plrinzone, entityinzone,
plrvisible, health, frame, plrdist,
avoid, limbhit, limbhitindex
Welche rund 100 Byte belegen. Kommt darauf an wie diese gespeichert werden.
Wieso man im Game-guru all diese Daten bei jedem Baum diese Daten benötigt, entzieht sich meiner Kenntniss.
Für alle weitern Bäume würde man nur Position, Rotation, Scale und die MeshID(object) benötigen,
Welche rund 60Byte benötigen würden.
Also gehen wir mal von den 100 Byte aus
C) Metadaten: ~0,1kb -- 0,0001MB
Wie der Game-guru das Terrain behandelt weiß ich leider (noch)nicht.
Wenn ich alle dafür benötigten Informationen zusammenkratze (Texturen, highmap, Vegitationsmap, Skybox, Gras-Mesh, usw.)
komme ich auf gute 90MB.
Ich nehmen hier mal einen Wert von 100MB an, was meiner Meinung nach schon sehr hoch ist.
D) Terrain: 100MB
Natürlich fehlen noch Informationen über den Spieler, Startpunkt, Skripte, Shader, Lightmap, Physik, usw..
Ich werde das mal beiseite lassen.
Jetzt rechnen wir mal was der Game-guru an Daten im Speicher braucht um unseren Wald darzustellen.
A (0.18MB) * 1000 = 180MB -- für 1000 Bäume
+ B (0.83MB) = 180.83MB -- Texturen werden nur 1x geladen
+ C (0.0001MB) * 1000 = 180.93MB -- für jeden Baum Metadaten
+ D (100MB) = 280.93MB -- Terrain-Daten
-------------------------------------------------
Wie Ihr erkennen könnt, benötigen die Bäume fast die Hälfte des Speicherverbrauches.
Und die Metadaten nur 1 Promille an Speicherinformation.
Wäre es dann nicht besser mehr über die Metadaten abzubilden?
Wenn man das Instanzing in der Grafikkarte verwendet,
benötigte man nur einmal das Mesh (0.18MB) und man würde sich 179.82MB an Speicher sparen.
Ihr könnt euch selbst ausmalen was passiert, wenn wir jetzt noch 500 andere Bäume, 700 Büsche, 350 Steine, usw. einbauen.
So wie oben angesprochen, das Objekte auch ausgeblendet werden können,
bringt in diesem Fall nicht viel, weil der Game-Guru diese nicht aus dem Speicher entfernt.
Sie werden halt von der Engine nicht angezeigt.
Auch jeder Game-Loop überprüft trotzdem immer alle Objekte.
Würde man jedem Objekt eine Gruppe ("sichtbar", "nichtsichtbar") zuteilen,
bräuchte der Game-Loop nur die Gruppe, bzw. die Objekte in der Gruppe "sichtbar" prüfen.
Alleine das würde schon einiges an Performance bringen.
===============================
Kommen wir zum Speicher-Verhalten.
Ein etwas ältere SATA Festplatte kann rund 150MB pro Sekunde lesen.
Die neueren Platten und vor allem SSD Laufwerke ein Vielfaches davon.
Würde das oben angeführte Beispiel 1:1 auf die Platte geschrieben,
bräuchte man im schlimmsten Fall 2 Sekunden zu Laden der Map.
Da die Daten aber Komprimiert abgelegt werden,
wird weniger Zeit zum laden oder Speichern gebraucht, als zum Komprimieren und Dekomprimiren.
Hinzu kommt das die Engine die ganze Map aufbauen muss (Mesh + Metadaten) bevor diese angezeigt wird.
Shader kompelliert, Texturen in den Grafikspeicher verschieben usw.
Meiner Meinung nach braucht der Game-Guru viel zu lange dafür.
Deshalb mein 2. Ansatz:
Wir lassen von der Engine nur eine Map mit einem Baum speichern.
Und speichern zusätzlich die Meterdaten aller andern Bäume (1kb) in eine oder mehrere Textdateien.
Somit würde das Laden und Speichern der Map um ein vielfaches beschleunigt.
Weiters würden wir nur die Metadaten laden die gerade
für den Angegebenen(sichtbaren-) Bereich des Spielers gelten, laden,
den Baum Instanzieren und die Position, Rotation, Scale auf der Map setzten.
Zum kaschieren, so das der Spieler den Aufbau nicht sieht, können auch angrenzende (nicht sichtbare) Bereiche,
mit geladen werden.
Bei einer Ladegeschwindigkeit von 150 MB / Sekunde, und einer Dateigröße von 1kb,
kann sich jeder mal ausrechnen wie lange das dauern würde.
Außerdem wäre es möglich in einem Bereich der Map,
unterschiedliche Daten zu laden, und so ein endloses Open World zu simulieren.
Und das ganze ohne den Hauptspeicher Rahmen zu sprengen.
============================
Kommen wir zum 3. Punkt
Das in voran gegangenen Beiträgen als "Witz" bezeichnete Einwand:
Soll dem Entwickler die Macht, das zu tun gegeben werden?
Das ist auch die Negativ-Seite des ganzen.
Die Spiele-Engine geht jetzt von einer konstanten Anzahl an Objekten aus.
Somit weiß sie wie lange sie für Physik Berechnung, Schatten, Berechnung, Shader, Speicherverbrauch usw. benötigt.
Damit kann sie eine relativ konstante FPS Rate, und eine gewisse Stabilität für die Anzeige halten.
Prüfungen auf Vorhandensein von Texturen, Shader, Meshes, usw.
entfallen während des Spielens, und finden nur beim Start statt.
Wenn nun dynamisch Objekte hinzugefügt oder entfernt werden.
Muss das die Engine mitbekommen, und muss deshalb mehr Prüfungen machen.
Das ganze kann die Stabilität der Engine ins Wanken oder auch zum Absturz bringen,
wenn der Entwickler vergisst der engine die neuen Objekte mitzuteilen.
Außerdem funktioniert das LightBacking nicht mehr so wie vorgesehen.
Und so wie ich die Skript-Kenntnisse der meisten GemGuru Anwender einschätze,
ist das eine erhebliche Fehlerquelle.
So etwas muss gut durchdacht und "deppensicher" vorbereitet werden.
Deshalb meine Bedenken (kein Witz).
Ich weiß ja jetzt nicht, ob sich jemand die Mühe macht das ganze durchzulesen.
Aber ich hoffe das für den einen oder Anderen neue Erkenntnisse dabei waren.