Draw calls

  • Hi, habe gemerkt, dass ich für mein Sumpfgebiet 60 Bäume habe , ohne Pflanzen. Das Gebiet ist ca. 10% der gesamten Map, die ziemlich groß ist. Ich weiß irgendwie nicht ob ich aus Krampf Bäume löschen soll. Kann mir kurz jmd erklären, was es bei drawcalls zu beachten gilt? Bei den Themen im Inet lese ich von mehreren tausenden drawcalls. Geht es dabei um alle Objekte in einem Spiel oder so?


    Edit: hab bisschen reverchiert. Diese Bäume haben zB fast alle die selbe Rinde/Blätter, dann sollte das kein Prob sein oder?

    • Offizieller Beitrag
    • Hilfreich

    Großes Thema das wird viel Text;

    Ein Drawcall ist eine Berechnungsaufgabe die die CPU an die GPU (Grafikarte) sendet um etwas auf deinem Bildschirm zu zeichnen.


    Entscheidet dabei ist nicht wie viele Objekte, Texturen, Lichter etc du in deinem Spiel hast, sondern wie viele Objekte im Extremfall auf einmal vom Player gesehen werden können. (Frame per Second = FPS)


    Werden zum Beispiel zu viele Gegner auf einmal gespawnt werden mehr Drawcalls (Rechenaufgaben) an die Grafikkarte gesendet und da die Berechnungen eine gewisse Zeit dauern, sinkt die Anzahl deiner Frames und deine FPS geht nach unten. Das sind die unbeliebten Lags in Spielen wenn die FPS sinkt.


    Unreal hat eine Reihe von Prozessen eingebaut die die Drawcalls niedrig halten soll.

    Dazu gehören:


    1.Das Camera Occlusion Culling. Blendet alle Meshes aus die nicht im Sichtbereich sind. Deswegen ist es auch relevant wann wie viele Meshes zu einem bestimmten Zeitpunkt gesehen werden.


    2.Das Backface Culling. Dabei werden die Rückseiten von Flächen nicht gezeichnet. Das problem kennt man wenn die Normals gedreht sind und man durch Objekte hindurchsehen kann. Bei Bäumen speziell bei den Blättern wird das Backface Culling aber deaktviert damit man nicht durch die Rückseiten der Blätter sehen kann. Das macht das Leaf Material automatisch.


    3.Das Distance Volume Occlusion (So ähnlich heißt das glaube ich) Blendet Objekte aus die in einem gewissen Abstand zum Player liegen. Das kennt man von spielen wenn man läuft und im Hintergrund langsam die Gebäude eingeblendet werden.


    4.Das Frustum Culling. Unter Frustum versteht man den Sichtbereich des Players. Man kann die Kamera unterschiedlich einstellen und damit das Frustum unterschiedlich definieren. Hierzu gehört beispielweise: DIe Near Clipping Plane was angibt wie weit das Frustum von der Kamera entfernt sein soll. Objekte die zwischen er Kamera und dem Frustum liegen werden somit nicht angezeigt, Man ist quasi kurzsichtig.

    Das Far Clipping beschreibt wie weit du sehen kannst. Alle Objekte die außerhalb des Far Clippings liegen werden nicht gezeichnet. (Du bist weit sichtig). Das hat im im Prinzip den selben Effekt wie das Distance Culling. Der Unterschied ist, das man beim Distance Culling das pro Objekt unterschiedlich einstellen kann. Das Far Cliiping gilt für absolut alles.


    5.LODs. Wie bereits oben beschrieben ist es relevant wie viele Objekte auf einmal gesehen werden können.

    Müssen beispielsweise auf einen Schlag sehr viele Objekte mit hohem Polycount gezeichnet werden, ist das schlecht für die Performance.

    Deswegen macht es Sinn wenn Objekte die weiter weg sind einen niedrigen Polycount haben und wenn man nähe dran ist, geht man im Polycount nach oben. (LOD Wechsel)

    Als Beispiel: Du hast aus 1km Entfernung einen Polycount von 5 Millionen. Das Verkraftet die Grafikkarte und sollte performant laufen. Kommst du nähe, sind weniger Objekte im Sichtbereich, es müssen weniger Meshes berechnet werden und dein Polycount sinkt sofern nicht weitere Objekte eingeblendet werden.

    Du kannst aus 1k Entfernung bei einen Niedrigen LOD Stufe einen Polycount von 5 Millionen haben und wenn du näher dran bist trotzdem den selben Polycount. Dein Spiel läuft Stabil.


    Wichtig ist:


    1.Jedes Mesh verursacht einen Drawcall

    2.Jedes Material verursacht mindestens einen Drawcall das kann aber je nach Shader auch mehr sein. Tesselation wird mit Sicherheit weit mehr Drawcalls verursachen da deutlich mehr berechnet werden muss.

    3.Die Skybox versucht mindestens einen Drawcall.

    4.Lichtberechnungen verusrchen Drawcalls auch die müssen berechnet werden. (Deswegen Light Baking)

    5.Schattenberechnungen verursachen mindestens einen Drawcall. Je nach wie wie komplex die Echtzeiteinstellungen sind.

    Schatten und Lichtberechnungen haben insgesamt Auswirklungen auf alle Meshes auf die Licht und Schatten fällt. ( Das muss alles berechnet werden)


    Soweit mal das technische Verständnis.



    Nur wie kann man die Drawcalls optimieren ?


    Das geht im grunde nur wenn man die Culling Metoden richtig einsetzt,


    Nehmen wir als Beispiel mal ein Haus: Das besteht im Normalfalls aus sehr vielen Elementen. Sinnvoll wäre es deswegen wenn das Haus aus sehr weiter Entfernung nur aus einem Mesh besteht um im besten Fall nur aus einem Material.

    Kommst du näher wird das Dach und die Mauern ein Extra Mesh. (2 Meshes = 2 Drawcalls Theoretisch) Werden zwei Materalien verwendet, kommen nochmal mindestens zwei Drawcalls oben drauf,

    Nun kommst du noch näher und dein Haus besteht nun aus deutlich mehr Objekten mit mehr Materialien dadurch kannst du weniger andere Meshes sehen, da sie außerhalb des Frustums (sichtbereich) liegen) aber dein Haus kann aus mehr Gebäudeteilen bestehen. Du kannst jetzt auch höher aufgelöse Materallien verwenden.

    Auch hier ist die Frage was wird wann gesehen ? Wenn dein Haus eine Inneneinrichtung hat, macht es keinen Sinn wenn diese mit dem Haus eingeblendet werden. (Wenn Haus und inneneinrichtung ein einziges verscholzenesMesh ist)

    Dann beispielsweise das gesamte Wohnzimmer aus einem Mesh, so dass wenn man durchs Fenster schaut das Wohnzimmer sieht die anderen Räume aber im Prinzip leer sind.

    Ist man im Raum, können die Schränke auch einzelne Meshes sein.


    Du kannst die Drawcalls senken:

    1.In dem du weniger Meshes im Sichtbereich hast. (Culling)

    2.Die Meshes einen nicht so hohen Polycount haben (LODs)

    3.Deine Meshes weniger Materallien haben.

    4.Deine Meshes weniger hochauflösende Materallien haben.


    Dabei kannst du die oben genannten Methoden verwenden um mehr rauszuholen.

    • Offizieller Beitrag

    Der Workflow ja folgender:


    1. Du importierst ein Mesh

    2.Du Importierst eine Textur

    3.Du erstellst ein Material und haust dort die Texturen rein. Das Material ist quasi ein Kontainer wo alle Texturen zusammenlaufen.

    4.Das Mesh ziehst du in den Viewport und machst das Material drauf.


    Dadurch dass du das Mesh von Content Browser in den Viewport ziehst, hast du schonmal automatisch eine Instanz erstell. Das Haupt Mesh ist das was sich im Content Browser befindet.

    Das macht man im Normalfall automatisch richtig.

    Schlecht wäre: Du hast ein Tisch mit 6 Stühlen und du würdest den Stuhl 6 mal importieren mit dem Tisch hättest du dann 7 unterschiedliche Objekte.

    Durch die Instanzen hast du nur zwei unterschiedliche Objekte das macht man wie gesagt instinktiv richtig.

    10 mal zu verwenden anstatt 10 verschiedene,

    Das macht definitiv Sinn.

    Mit angenommen, dass die Meshes alle auf die selbe Textur zugreifen.

    Material meinst du ? Eine Textur könnte nämlich auch in mehreren Materialien verwendet werden. Umso weniger Materalien du verwendest umso besser. Umso niedriger die Auflösung der Materialien die du verwendest, umso besser. Wenn du von allem so wenig wie möglich verwendest, bist du auf dem richtigen Weg.

  • Macht es irgendwie generell einen Sinn, ein Mesh 10 mal zu verwenden anstatt 10 verschiedene, wenn das optische Ergebnis das selbe ist? Mit angenommen, dass die Meshes alle auf die selbe Textur zugreifen.

    In der Regel macht man es so. Entweder mit Splines, was ja auch nichts anderes ist als eine Aneinanderkettung mehrerer Meshes entlang einer Linie ist.


    Es kommt aber halt auch immer darauf an was du machst. Bei deinen Wegen ergibt es halt schon Sinn.


    Auch bei komplexen Gebäuden, selbst wenn sie einmalig sind und nicht aus einem Mauerbausatz bestehen, versuchst du halt das Ganze in Einzelteile zu zerlegen und nicht ein großes Modell in das Spiel zu setzen. Also da ist dann halt der Eingang ein Modell, eventuelle Zäune/Zaunteile usw.


    Hintergrund ist, Gegenstände die nicht gesehen werden, die werden auch nicht von der Grafikkarte berechnet. Wenn du jetzt ein ganz großes Haus hast, in einem Stück, und du siehst nur eine Ecke davon im Sichtfeld, dann wird es auch komplett berechnet, auch wenn es nicht zu sehen ist.


    Also ist es eigentlich sogar positiv, wenn man mehrere kleine Meshes benutzt. Und wenn es halt ausreichend ist es so zu machen, dann mach es halt.

  • https://docs.unrealengine.com/…ncedStaticMesh/index.html

    Externer Inhalt www.youtube.com
    Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.
    Durch die Aktivierung der externen Inhalte erklären Sie sich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.
    Externer Inhalt www.youtube.com
    Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.
    Durch die Aktivierung der externen Inhalte erklären Sie sich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.