Hey,
ich versuche in letzter Zeit ein Spiel im Weltraum zu entwickeln, in dem man durch das Sonnensystem (ca. bis zum Mars) reisen können soll. Dabei sollen nicht nur die einzelnen Planeten dargestellt werden, sondern man soll sich auch überall sonst bewegen können. Zusätzlich soll das Spiel online sein, sodass man sich auch gegenseitig sehen kann.
Das Problem (könnt ihr sicher alle erahnen):
Die Unreal Engine ist nicht dafür vorgesehen, eine Welt mit ca. 50.000.000 - 300.000.000 km darzustellen, sondern nur Welten von ein paar Kilometern. Außerdem werden es sehr viele Objekte, da dort dann allein ein paar Millionen Meteoriten bzw. Asteroiden geladen werden müssten.
Dafür hatte ich mir eigentlich eine - dachte ich zumindest - gute Lösung überlegt.
Leider hatte ich da ein paar Sachen nicht bedacht (ist mir leider erst nach ca einem Monat Programmierung aufgefallen), für dessen Behebung ich viel von der UE4 im Source Code umschreiben müsste und das ist mir zu aufwendig.
Z.B. gibt es ein paar Performance Probleme serverseitig, da manches doppelt berechnet wird (bei 10 mio Asteroiden bzw. anderen Objekten mit 3x64 bit Koordinaten (ist bei der Größe von Koordinatensystem notwendig) wären es 30 mio unnötige Berechnungen ≙ 1,92 mrd. Herz (1,92 GHz) und das nur bei Koordinaten-Berechnungen; es kommen noch sehr viele andere Bereiche dazu).
Deswegen habe ich mich jetzt entschieden, es doch mit World Composition zu versuchen.
Dafür wollte ich ein leeres Child-Level (Größe 5x5x5 km) erstellen und ein Parent-Level.
In dem Parent Level sollen dann überall, wo Objekte sind, Child-Level gespawnt werden (sozusagen ein 3d-Chunk-System mit Chunks mit 5x5x5 km, jedoch sollen nur in Chunks, in denen Objekte sind, ein Level gespawnt werden). Da die meisten Chunks leer sind, werden schätzungsweise maximal 1 mio Level geladen.
D.h. der Server soll beim Starten im Savegame alle Objekte haben, die gespawnt werden sollen. Dann soll abgefragt werden, in welche Chunks Level gespawnt werden sollen (bzw. in welchen Chunks Objekte sind) und dann sollen die Level natürlich noch geladen werden.
Da ich mich mit World Composition nicht wirklich auskenne (habe bisher ein kleines Spiel als Test mit World Composition gemacht), frage ich diesmal lieber ein paar Sachen:
- Wie viel RAM/Speicher und CPU Leistung nutzt ein leeres Level ungefähr (ohne Objekte), das in World Composition geladen wird? Muss der Server da nur den Namen, Position usw. speichern oder wird da aktiv was berechnet, wenn in dem Level nichts verändert wird?
- Habe ich irgendwas übersehen, weswegen das nicht funktionieren wird?
- Hat vielleicht jemand eine viel bessere Möglichkeit, mein Vorhaben umzusetzen?
- Hat jemand sonstige Kritik/Vorschläge?
- Gibt es eine Funktion, die per Blueprint oder C++, während des Laufen des Servers, Level ins World Composition lädt/entlädt oder muss ich mir da selber was zusammen schreiben?
Ich weiß, dass das Vorhaben auf einem/mehreren sehr performanten Servern laufen müsste und sehr viele Ressourcen in Anspruch nehmen würde, jedoch ist mein Vorhaben eigentlich nur eine Herausforderung an mich und wird wahrscheinlich nie wirklich genutzt.