# Minecraft Nur sichtbare Objekte rendern



## lord239123 (7. Sep 2014)

Hallo Leute, 

ich stehe diesmal vor einem scheinbar schwer zu lösendem Problem:
Ich bin gerade dabei, ein Minecraftartiges Spiel(= Welt besteht aus Blöcken) mithilfe der JMonkeyEngine 
zu entwickeln.
Eine Welt besteht dabei aus mehreren Chunks(Container, welcher Blöcke beinhaltet), welche die Maße 50*256*50(x, y, z) besitzen.
Nun habe ich aber das Problem, dass die JMonkeyEngine alle Blöcke, auch die nicht sichtbaren, rendert, was die FPS-Zahl nur unnötig drosselt.
Ihr könnt euch vorstellen, was dabei an Rechenleistung drauf geht: 
Ein Chunk kann aus bis zu 640.000 Blöcken bestehen, von denen gerade einmal mind. 2500 Blöcke sichtbar sind.
Bestimmt gibt es für das Problem eine einfache Lösung, allerdings kenne ich mich mit der JMonkeyEngine noch nicht so gut aus.

Vielen Dank schon mal für die Hilfe. :rtfm:


----------



## Sogomn (7. Sep 2014)

Naja, es gibt doch bestimmt eine x- und eine y-Position der "Kamera". Beim rendern prüfst du einfach, ob sich die Blöcke im Sichtfeld (also gößer als der Kameranullpunkt und kleiner als der Kameranullpunkt + Größe des Spielfeldes) befinden und maximal so-und-so-weit entfernt sind.


----------



## lord239123 (8. Sep 2014)

Danke.
Ja, es gibt eine Koordinate für die Kamera, aber das löst leider nicht das Problem.
Vielleicht habe ich das Problem auch etwas ungenau erklärt:
Es werden auch die Blöcke gerendert, die durch andere Blöcke verdeckt werden und somit nicht sichtbar sind.
Da immer nur ein Bruchteil der vorhandenen Blöcke sichtbar sind, macht das einiges an Rechenleistung aus.
Trotzdem vielen Dank.


----------



## JavaMeister (9. Sep 2014)

Sorry, aber wieso löst das nicht das Problem????

Zwischen Punkt Der Kamera und dem zu rendernden Objekt darf sich kein Block befinden. Oder nur eben ein Block.

Trivial ist das Problem nicht. Aber  die Antwort von sogonm ist korrekt.


----------



## Sogomn (9. Sep 2014)

Dazu müsstest Du dann irgendwie prüfen, ob sich zwischen Spieler und dem Block noch etwas befindet. Wenn ja, dann wird der Block nicht gerendert. Für die Umsetzung hab' ich leider keine Idee.


----------



## Gucky (10. Sep 2014)

In Minecraft sind manchmal weite Teile nicht sichtbar, weil unterirdisch. Vielleicht kannst du raitracing mäßig den Chunk in Kuben einteilen. Du "umrandest" sozusagen die nicht sichtbaren Blöcke mit einer Schicht sichtbarer Blöcke. Damit würdest du schon mal die weiten unterirdischen Teile eliminieren.

Auch möglich wäre es, nur die Blöcke zu rendern, neben denen Luft ist.

Oder eine Kombination aus Beidem.


PS für alle Anderen egaler Geistesblitz: du lädst den Chunk ein mal ein, baust alles auf und schmeißt dann alles aus dem Speicher, was nicht benötigt wird. An anderer Stelle ist der gesamte Chunk im Speicher und dem kannst du Datenbankmäßig drei ints übergeben und der gibt dir dann den Block. Z.B. wenn ein Block abgebaut wird wird ein Anderer sichtbar. So kannst du diesen darstellen. (dll ?)


----------

