vorab, dachte für den Einstieg wäre eine Art Minecraft Clone recht einfach. Naja jetzt sehe ich, dass es doch nicht so leicht wird.
Wie verwaltet man die Objekte die gezeichnet werden sollen? Durch einfache Techniken (Octree / Frustum / Occlusion Culling etc.) kann man ja schon viel ausschließen. Aber gerade bei Minecraft sind viele Blöcke vorhanden. Angenommen ich habe 100.000 Blöcke, was ja eigentlich nicht viel ist (für das Spiel). Der Octree geht ja noch recht schnell, aber das sortieren für so viele Blöcke dauert recht lange (ich verwende hier den Bubbelsort, gibt bestimmt auch effizientere).
Mein Idee für meinen Minecraft Clone. Dachte mir, man erstellt eine Liste wo alle Objekte enthalten sind. Dann gibt es einen Thread der sich um das Frustum kümmert und schaufelt die Objekte von A nach B die sich im Sichtbereich befinden. Anhand der Frustum Liste, erstellt der nächste Thread einen Octree. Der Octree rendert die Daten dann per Culling. So in der Art habe ich mir das ganze vorgestellt .
Wie wird so was in er Regel bewerkstelligt? Ich denke das verschiedene Threads im Hintergrund die Arbeit erledigen müssen.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Bubblesort. Das ist O(n²). Such dir mal einen Sortieralgorithmus, der besser zu deinem Problem passt, Quicksort ist erstmal eine generische Antwort. Je nach dem kann auch Merge- oder Heapsort besser sein. Die sind alle O(n log n), und damit deutlich effizienter. Besonders bei vielen Blöcken.
grüße
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Registriert: Sa Aug 18, 2007 18:47 Beiträge: 694 Wohnort: Köln
Programmiersprache: Java
Der Kollege hier hat einen schönen Artikel über seine Erfahrungen mit einem Minecraft Klon geschrieben. Habe mir da auch einiges abgeschaut. Sein Fazit: Octree taugt für diesen Anwendungsfall kein Stück. Das Rendern war super fix, aber der Zugriff auf einzelne Blöcke hat dem ganzen recht schnell das Genick gebrochen.
Ich mache es ziemlich genau so wie es bei Minecraft gemacht wird. Ich packe 16x16x16 Blöcke zusammen in eine Displayliste/VBO. Diese Strucktur nenne ich Slice. Je nach Höhe der Welt werden mehrere Slices vertikal angeordnet und bilden einen Chunk, der alle Blockinformationen vorhält und für das Laden/Speichern zuständig ist. Die Klasse World hat eine HashMap, die über einen Hash der X und Z Koordinaten indiziert wird und die Chunks beinhaltet. Wenn nun ein Block geändert wird, wird der entsprechende Slice zum Neuerstellen vorgemerkt und in einem der nächsten Frames erstellt. Sobald er valide ist wird die alte Displaylist durch die Neue ersetzt und die alte freigegeben.
_________________ Es werde Licht. glEnable(GL_LIGHTING); Und es ward Licht.
Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Registriert: Mi Apr 13, 2011 22:05 Beiträge: 218
Programmiersprache: Lazarus/FPC
Wenn du einen Minecraft-Klon programmieren willst:
Ich kann dir den sourcecode von meinem alten Projekt "mina" zur Verfügung stellen wenn du willst, ich hab ein Octree-System zur Datenverwaltung benutzt und praktisch alle nötigen Funktionen und Codes zum Editieren der Landschaft bis zur Texturverwaltung eingebaut. Vielleicht findest du da den ein oder anderen nützlichen Codeblock.
Hier mal der Link zum Projekt. Fals Intresse besteht...jederzeit =D
_________________ Ich teile manchmal heimlich durch Null. - Alber Einstein
Hey Ida, wäre echt cool wenn ich dort mal einen Blick reinwerfen könnte. Nicht um den Code zu kopieren sondern eher zu schauen wie du das ganze umgesetzt hast.
Mitglieder in diesem Forum: 0 Mitglieder und 7 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.