[Projekt] Weltenmaschine II
Verfasst: 10.01.2014, 12:11
Hallo!
Ich hab die 'Weihnachtsferien' genutzt, und weil's so gut kommt, den "Weltenmotor" von Vorne begonnen. Das war http://zfx.info/viewtopic.php?f=10&t=54 ... eltenmotor, eine prozedurale Rendererengine, bei dem der komplette Content parametrisiert im Code steckt.
Die Funktionsfülle vom alten Teil hab ich natürlich nicht so schnell wieder eingeholt, dafür ist die Technik jetzt deutlich solider. Ich habe jetzt C++ statt Java verwendet, und arbeite aggressiv auf dem Stack. In der alten Version hatte ich große Probleme mit der Verwaltung großer Zahlen vernetzter Objekte, der Garbage Collector läuft da schnell heiss.. Nun berechne ich einzelne Werte lieber mehrmals, anstatt sie für spätere Verwendung aufzubewahren. Dadurch ist die Vernetzung der Objekte größtenteils beseitigt, und sie können hierarchisch durch Rekursion auf dem Stack verwaltet werden.
Erst bei einer endgültigen Auswertung von Objekten, zum Beispiel Geometrie-Rendering, werden Daten in den Heap gefüllt. Dort liegen sie dann in großen schlichten Containern, z.B. große float-Buffer mit Vertex-Daten. Diese Container werden im Moment durch normale STL-Container realisiert, der Allozierungs-Overhead ist im Moment so klein dass das erstmal so bleiben kann.
Im Idealfall halten diese Buffer einige Sekunden, z.B. wenn sie Geometrie enthalten die sich nicht groß beweget und ausreichend detailiert ist. Dafür werden ein paar Metadaten gespeichert, zum Beispiel die verwendete Kamera-Transformation, so kann man die Differenz zur aktuellen Kamera-Transformation berechnen und die Daten auch bei Kamerabewegung wiederverwenden, bis sie dann z.B. durch unpassenden Detailgrad oder Verlassen der Sicht unbrauchbar werden.
Im Moment kann ich damit bei langsamen Kamerabewegungen spieletaugliche Framerates erreichen bei einem akzeptablen Detailgrad. Bei schnellen Bewegungen, bzw. wenn ein beliebiger Ausschnitt zum ersten Mal gerendert wird, fällt es im Moment auf wenige FPS. Bei reduzierten Detailgrad a la Minecraft ist das auch in Echtzeit möglich.
Ich dachte, ich poste das jetzt mal um mich motivieren zu lassen auch nach den Ferien daran zu Arbeiten...
Ich hab die 'Weihnachtsferien' genutzt, und weil's so gut kommt, den "Weltenmotor" von Vorne begonnen. Das war http://zfx.info/viewtopic.php?f=10&t=54 ... eltenmotor, eine prozedurale Rendererengine, bei dem der komplette Content parametrisiert im Code steckt.
Die Funktionsfülle vom alten Teil hab ich natürlich nicht so schnell wieder eingeholt, dafür ist die Technik jetzt deutlich solider. Ich habe jetzt C++ statt Java verwendet, und arbeite aggressiv auf dem Stack. In der alten Version hatte ich große Probleme mit der Verwaltung großer Zahlen vernetzter Objekte, der Garbage Collector läuft da schnell heiss.. Nun berechne ich einzelne Werte lieber mehrmals, anstatt sie für spätere Verwendung aufzubewahren. Dadurch ist die Vernetzung der Objekte größtenteils beseitigt, und sie können hierarchisch durch Rekursion auf dem Stack verwaltet werden.
Erst bei einer endgültigen Auswertung von Objekten, zum Beispiel Geometrie-Rendering, werden Daten in den Heap gefüllt. Dort liegen sie dann in großen schlichten Containern, z.B. große float-Buffer mit Vertex-Daten. Diese Container werden im Moment durch normale STL-Container realisiert, der Allozierungs-Overhead ist im Moment so klein dass das erstmal so bleiben kann.
Im Idealfall halten diese Buffer einige Sekunden, z.B. wenn sie Geometrie enthalten die sich nicht groß beweget und ausreichend detailiert ist. Dafür werden ein paar Metadaten gespeichert, zum Beispiel die verwendete Kamera-Transformation, so kann man die Differenz zur aktuellen Kamera-Transformation berechnen und die Daten auch bei Kamerabewegung wiederverwenden, bis sie dann z.B. durch unpassenden Detailgrad oder Verlassen der Sicht unbrauchbar werden.
Im Moment kann ich damit bei langsamen Kamerabewegungen spieletaugliche Framerates erreichen bei einem akzeptablen Detailgrad. Bei schnellen Bewegungen, bzw. wenn ein beliebiger Ausschnitt zum ersten Mal gerendert wird, fällt es im Moment auf wenige FPS. Bei reduzierten Detailgrad a la Minecraft ist das auch in Echtzeit möglich.
Ich dachte, ich poste das jetzt mal um mich motivieren zu lassen auch nach den Ferien daran zu Arbeiten...