# 3d Game Engine : PERFORMANTE Räumliche Verdeckung



## CreepyPvP (28. Dez 2017)

Zurzeit schreibe ich eine 3d Game engine in Java ohne LWJGL, Vulcan oder OpenGL. Nun suche ich einen Weg , räumliche Verdeckungen zu* PERFORMANT *zu Berechnen. Mein erster Ansatz war, vor dem Rendern alle Punkte (Vertices) an der Z-Achse zu Sortieren. Das funktioniert nun aus Performance Gründen nicht mehr. Ich wäre für Lösungsvorschläge sehr dankbar. Grüsse Creepy


----------



## thecain (28. Dez 2017)

Mit einem Z-Buffer https://de.m.wikipedia.org/wiki/Z-Buffer


----------



## CreepyPvP (28. Dez 2017)

thecain hat gesagt.:


> Mit einem Z-Buffer https://de.m.wikipedia.org/wiki/Z-Buffer


Ich habe die Engine so implementirt , dass man jeden Vertex in einen 2d vector umwandelt und man danach jedes Mesh mit der AWT-Klasse Polygon in belibiger Reinfolge zeichnet. Kann man da noch was benutzen oder ist alles für die Tonne? Grüsse Creepy


----------



## thecain (28. Dez 2017)

Das kannst du bestimmt umbauen, aber Sinn wird es trotzdem nicht viel machen. Du wirst nie richtig performant werden ohne Grafikkarte. Siehe dein letzter Thread.


----------



## CreepyPvP (28. Dez 2017)

Vielen , vielen Dank thecain.


thecain hat gesagt.:


> Du wirst nie richtig performant werden ohne Grafikkarte


 Das war mir durchaus bewusst. Ich habe mich davor (3d-Programmierung) nur mit OpenGL beschäftigt. Ich wollte verstehen was hinter der 3d Programmierung steckt, denn darauf zu warten , bis ich so alt bin , dass ich studieren kann dauerts noch ein paar Jahre  .  Grüsse Creepy


----------



## JuKu (29. Dez 2017)

@CreepyPvP Leider ist das alles gar nicht so einfach, wie du dir das vorstellst. Da haben sich schon seeehr viele Leute (z.B. die "Erschaffer von OpenGL" - die Khronos Group oder Nvidia) sehr viele Gedanken gemacht, wie man das effizient hinbekommt.

Der entscheidende Punkt ist aber der:
Eine moderne CPU hat im Durchschnitt vllt. 8 Kerne (Cores). Eine moderne Grafikkarte (GPU) wie die Nvidia GTX 1080 hat 3584 Cores, also 448x mal so viele Cores, wie eine CPU! Dazu kommt, dass die GPU speziell auf die mathematischen Berechnungen optimiert wurde und somit viel effizienter mit Matrizen, Vektoren usw. umgehen kann, als die CPU.
Bei jedem Frame (60 FPS = 60 Frames per Second) wird jeder Pixelpunkt einzeln berechnet. Gehen wir mal von einem Bild mit 800x600 Pixeln aus, das sind dann insgesamt 480.000 Pixel. Wenn du jetzt eine CPU mit 8 Cores nimmst, brauchst du *60.000 CPU Cycles, um einen einzigen Frame zu berechnen*! Da wird es wahrscheinlich schon schwer 1 - 5 FPS mit der CPU zu bekommen, weil sie so viel Last erhält.
Wenn du dagegen die GPU mit 3584 Cores nimmst, sind das lediglich 134 GPU Cycles. Merkst du den Unterschied?
134 vs. 60.000 Cycles sind einfach ein sehr drastischer Unterschied, den du bei der Performance sehr deutlich zu spüren bekommst. Deshalb ist es einfach nahezu unmöglich eine 3D Engine zu schreiben, welche nur die CPU nutzt. Und ehrlich gesagt halte ich das auch für Quatsch.

Bei Bedarf kann ich dir dazu unsere Vorlesungsmaterialien zukommen lassen, schicke mir dazu einfach eine PN mit deiner Mailadresse.

EDIT:
Ich habe das Beispiel stark vereinfacht, bei 800x600 Pixeln könnte eine Nvidia GPU z.B. gar nicht alle Kerne voll ausschöpfen, weil z.B. bei Nvidia jede GPU Unit aus 32x32 Pixeln besteht (the "power of 2") und 600 nicht ganzzahlig durch 32 teilbar ist. Allerdings ist der Unterschied so klein, dass er hier vernachlässigt werden kann. Das nur so als Anmerkung, bevor hier jemand das Beispiel in Frage stellt.


----------

