Vertex/face-Anzahl in Spielen.



  • Guten Tag.
    Seit kurzem habe ich mich dem 3D-Bereich zugewandt unter der Verwendung von Direct3D (+ d3dx-hilfsbibliotheken) und komme auch ganz gut voran.
    Bis jetzt habe ein ein kleines Fahrzeug und eine ebene Rennstrecke auf der man rumdüsen kann (keine Kollision, sieht nur so aus als fahre das Fahrzueg wirklich auf der Strecke).

    Die Frage die ich jetzt habe wäre, wie viel Vertices/Faces man pro Frame so zeichnen kann ohne es zu übertreiben.
    Was sich da auf meinem Bildschirm tummelt ist wirklich nicht komplex( Selbst dann, wenn man diesesn Kram nicht mit kommerziellen, modernen Vollpreisspielen vergleicht).
    Halt nur die rennstrecke und ein Fahrzeug sowie eine Lichtquelle die das ganze beleuchtet.

    Das Fahrzeug hat dabei 15328 Vertices / 7552 Faces

    Die Rennstrecke hat 72 Vertices / 36 Faces

    Wenn ich mich jetzt nicht vertuh, hat das Fahrzeug 9 Subsetzs (hab dafür keine Texturen, dafür dann verschiedenfarbige Materialien für jür jedes Subset)
    Die Rennstrecke hat 3 Subsetzs, wobei 2 verschiedene Materialien verwendet werden.

    Wenn ich diesen Kram jetzt auf dem Bildschirm ausgebe, hab ich durchschnittlich 70 FPS(FPS werden nur jede Sekunde aktualisiert, nicht in jedem Frame).
    Ob ich die Rennstrecke nun mitrendere oder nicht, ändert nicht besonders viel an der FPS-zahl, wenn ich jedoch das Fahrzeug zweimal zeichne oder ein weiteres Mesh mit dem gleichen Fahrzeugmodell rendere, fallen die FPS sofort runter auf 30-39 FPS.

    Ok, für mich klingen 15 000 vertices schon recht viel, doch bei modernen Spielen werden doch sicherlich um einiges mehr verwendet.

    Und mit einem
    AMD Athlon X2 6000+ Windsor 2x3.0 Ghz
    2 GB Ram und einer Saphire HD 3780 mit 512 MB sollte sowas doch klappen oder?

    Also benutze ich tatsächlich zu viele Vertices/Faces ?
    Oder sind so viele Subsets (9 stück beim Fahrzeug) das Problem?
    Oder liegt es daran, dass ich das X-Format verwende?
    Auch wenn ich es mir nicht vorstellen kann, einmal geladen ist das ja in einem Meshobjekt, wo auch andere Formate landen würden ... schätze ich mal.

    Wie gesagt, ich verwende die D3DX-Hilfsfunktionen, womit dann auch das Mesh geladen wird.

    Wenn ich übrigens eine leere Szene Zeichne, also nur den Hintergrund lösche und sonst nichts, hab ich ebenfalls um die 70 FPS, genauso viele FPS wie mit Fahrzeug + Rennstrecke, schrumpfen tut die zahl erst beim zweiten Auto (dann natürlich etwas mehr als 30 000 Vertices bei 21 Subsets (je 9 pro Fahrzeug und 3 für die Rennstrecke).

    und da mein eventuelles Spielchen auch auf langsameren Rechnern, doch zumindest schonmal auf meinem :/, laufen soll hab ich jetzt einfach mal nachgefragt.

    Da hätte ich auch noch eine kleine etwas abweichende Frage, welchen Nachteil haben X-Files (lässt man mal die Dateigröße beiseite) ?
    Also warum sollte man sich ein eigenes Format schreiben?
    Oder kann man solches Gerede getrost iggnorrieren?


  • Mod

    Moderne Spiele haben so 500 000 bis 2 000 000 vertices pro frame, bei ca 1500 bis 3000 drawcalls.

    dass du 70fps hast wenn du nichts zeichnest liegt daran dass du vsync an hast. in der doku stehen die einzelnen buffer flip modes beschrieben.

    bitte, bevor du irgendwelche optimierungen machst, finde erstmal raus wo das problem ist. sonst optimierst du hier wild rum und am ende siehst du 0% unterschied, so wie es schon manchen hier passiert ist.

    1. lad dir den AMD Codeanalyst. profile damit waehrend das spiel laeuft. dann siehst du ob die meiste zeit in treiber dlls oder doch in deinem programm verbraten werden. wenn es im treiber haengt, ist es wohl die graphik die langsam ist, dann kannst du mit AMD/ATI GPU PerfStudio weiter schauen woran es liegen koennte.

    2. wenn es an deiner applikation liegt, klick dich weiter durch, die langsammsten dinge sind oben gelistet bei codeanalyst.

    btw. vergiss nicht das spiel im release und nicht im debug mode zu bauen.



  • Also 15000 Vertices für ein Auto in einem Echtzeitspiel ist finde ich schon ein klein bisschen übertrieben, wenn es viele werden sollen. 9 Subsets ebenfalls, denke ich. 😮
    An deiner Stelle würde ich Texturen verwenden, und die Vertexanzahl stark reduzieren, denn bei Rennspielen mit hohen Geschwindigkeiten ist eine hohe FPS-Zahl nicht verkehrt, und der Ottonormalspieler betrachtet ja den Gesmateindruck und nicht jedes einzelne Detail deines Autos.

    Ich würde sagen, in kommerziellen Spielen wird da viel getrickst: LOD, Culling, ...
    So werden nur nahe Objekte detailreich dargestellt, der Rest ist detailärmer, man bemerkt es bloß nicht, denn man ist ja fasziniert von den Details im Vordergrund 😮 😉

    Das ist aber eine komplizierte Sache, die man als Anfänger (zu denen ich auch gehöre 😃 ) besser noch nicht vertiefen sollte.

    Ein Demo-Renderer für Fahrzeuge ist aber auch nicht schlecht 😉



  • Blaze schrieb:

    So werden nur nahe Objekte detailreich dargestellt, der Rest ist detailärmer, man bemerkt es bloß nicht, denn man ist ja fasziniert von den Details im Vordergrund 😮 😉

    oder man bemerkt es bloß nicht, weil genau berechnet wird, wie detailreich man zeichnen muss, sodass ungenauigkeiten erst im Bereich von < 1 Pixel entstehen (und einen Bildschirm, der höher als 1 Bildpunkt pro Pixel auflöst, habe ich bisher auch noch nicht gesehen 🤡 )



  • 15328 Vertices / 7552 Faces

    ungewoehnliches verhaeltnis.
    koennte mir vorstellen, dass da etliche vertices (unnoetig) doppelt vorhanden sind.



  • Danke für die Antworten.
    Ich habe auch gleich mal den CodeAnalyst runtergeladen und geschaut wo die meiste Zeit verbracht wurde.

    Den Löwenanteil an zeit hat Amdk8.sys (31 161 timersamples), die d3d9.dll und ati3duag.dll (jeweils um die 3000, d3d9, etwas mehr, ati etwas weniger)

    Also das sollte wohl glaub ich auch so sein, hat ja alles mit dem Graphikgedöns zu tun (sofern es nötig/wichtig ist, dass das programm so lange/oft in diesen Dateien verbringt, kenne mich da nicht aus).
    Es gibt zwar auch noch 2-3 weitere Dateien die recht viel Zeit verbraucht haben die ich nicht kenne, doch da sich die timer samples bei denen jeweils unter 500 und weiter absteigend befinden wohl nicht so tragisch.

    Also liegt das wohl an meinem Programm, das hatte ich dann auch mal getestet. nachdem meine erwähnten 9 Subsets zu großen Augen geführt hatten 😮,
    habe ich das Modell mal zu einem Subset zusammengefügt und die verschiedenen Materialien auf Vertexgruppen aufgetragen.

    Und schon lief das um einiges besser, hätte nie erwartet, dass 9 Subsets viel sind.

    Um jetzt überhaupt erstmal eine Frameratenänderung zu bemerken (Vsync hatte ich nicht ausgeschaltet gehabt) kann ich das Fahrzeug schon 17 mal zeichnen und bei den 35-39 Frames komme ich erst an wenn ich das Ding 35 mal zeichne.
    von um die 30 000 Vertices auf über 500 000 ist ja schonmal eine gute Verbesserung.

    ungewoehnliches verhaeltnis.
    koennte mir vorstellen, dass da etliche vertices (unnoetig) doppelt vorhanden sind.

    Also dieses 15000 / 7000 Verhältniss sagt mir DirectX mit der GetNumVertices/GetNumFaces - Funktion des Meshobjekts, vor kurzem hatte ich jedoch herausgefunden wo man das in meinem Moddelierungsprogramm (Blender) sehen kann 🙂 (jaja, bin halt kein Graphiker und kenne mich nicht aus) und dort steht das Modell hätte blos um die 3500 Vertices und ebenso viele Faces 😕 (was ich auch seltsam finde, müssten doch zwangsläufig mehr Vertices als Faces da sein, da ja ein Face durch mehrere Vertices erzeugt wird oO Edges gibt es da schon mehr als 7000. Alles seltsam (sofern es sich bei diesen Werten, die ich als Vertex/Face-Anzahl interpretiere überhaupt um diese Angaben handelt) ... also laut Blender).

    Danke auf jeden Fall für die Hilfe.


  • Mod

    Kahino schrieb:

    Den Löwenanteil an zeit hat Amdk8.sys (31 161 timersamples), die d3d9.dll und ati3duag.dll (jeweils um die 3000, d3d9, etwas mehr, ati etwas weniger)

    jap, eindeutig treiber. dass 50% bei amdk8 drauf gehen heisst wohl nur dass ein idle thread laeuft (du hast ja dualcore).

    Um jetzt überhaupt erstmal eine Frameratenänderung zu bemerken (Vsync hatte ich nicht ausgeschaltet gehabt) kann ich das Fahrzeug schon 17 mal zeichnen und bei den 35-39 Frames komme ich erst an wenn ich das Ding 35 mal zeichne.
    von um die 30 000 Vertices auf über 500 000 ist ja schonmal eine gute Verbesserung.

    damit siehst du dass die vertexangabe in diesem fall voellig irrelevant waren. was wirklich 'teuer' war, war was auch immer du zwischen den subsets gemacht hast. vielleicht shader geaendert, oder texturen etc.
    es kann immer noch sein dass du da viel zu viel machst und es jetzt nur noch 'ertraeglich langsam' ist.



  • Blender [...] dort steht das Modell hätte blos um die 3500 Vertices und ebenso viele Faces 😕

    Blender sagt Dir wahrscheinlich, wieviele Polygone (hauptsaechlich Vierecke) es sind, waehrend Direct3D alles in Dreiecke zerlegt (daher doppelt so viele).
    Weiterhin weisst Blender zusaetzliche Attribute (Farbe, Textur-Koordinaten, Normalenvektor) dem Polygon zu, waehrend diese bei Direct3D pro Vertex gespeichert werden. Fallen unterschiedliche Attribute auf einen Eckpunkt wird dieser dupliziert und dadurch die Vertexanzahl erhoeht. Im schlimmsten Fall ergibt das 3 Vertices pro Dreieck.
    Je nach Mesh kann das notwendig sein (viele Shading-Kanten) oder auch nicht...


Log in to reply