ich bastel z.Z. mal wieder an meiner Engine ein wenig rum und hab grad überlegt wieviel millionen triangles wohl eine aktuelle engine heutzutage pro sekunde schaffen sollte, mit schönem look (=shading, animation etc)
Gestern hab ich mal einen test gemacht und eine Scene mit 4 mio Triangles geladen (bestand aus knapp 2000 VBOs), die hat dann mit 5-6 fps vor sich hingeruckelt (GeForce 7800GTX)...zwar waren 3 Lichter in der Scene und nen Post-Blur Filter-Shader drauf, aber irgendwie schien mir das trotzdem ein wenig langsam.. denn selbst ohne Shader kam es nur auf knapp 9fps..
als letztes hatte ich mich dann noch drauf beschränkt wirklich nur die VBOs zu zeichnen, und garnichts sonst zu machen (= cpu war sehr entlastet), selbst da kam es nur auf 9-10fps (ohne shader etc)..
Ist das normal so? Weil, das würde ja bedeuten das die GraKa nur ca. 35 mio triangles / sec. schafft... dachte immer da ginge viel mehr..?
Oder kann es sein das ich bei der generierung der VBOs was verkehrt mache (benutze GL_STATIC_DRAW_ARB, ist doch das schnellste, oder?)
Ah und ich verwende recht oft Low() und High() um Arrays zu durchlaufen.. weiß jemand ob das evtl sehr langsame befehle sind? (Wobei sich das auch nicht so stark auswirken dürfte eigentlich)
Oder ist das alles richtig von der geschwindigkeit so? Immerhin sind es ja auch fast 2000 VBOs gewesen...
Ich würde die Anzahl der VBOs reduzieren(mehr Verts in ein VBO) und wenn Texturen im Spiel sind, dann auch die vbos nach den Texturen sortieren.
Texturen habe ich absichtlich weggelassen bei dem test
Weniger VBOs ist schon richtig.. die scene war auch keine für eine engine optimierte scene, sondern ein ausschnitt aus meinem diplomfilm = sehr highpoly und viele objekte :p Wollte es halt nur testen... und frage mich halt, ob das ergebnis so richtig ist, oder ob ich evtl irgendwo nen patzer drin hab
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Low/High also bei dynamischen Arrays wird zwar bei High eine Methode aufgerufen aber das ist eine Assemblermethode die nicht weiter macht als an der Adresse des Arrays -4 einen Integerwert auszulesen. Ähnlich wie das bei Longstrings der Fall ist. Und selbst in einer Schleife wird der Wert den High zurückliefert in ein Register gepackt und dort verarbeitet. Da würde ich mir eher Sorgen um harmloser aussehende Stellen machen. Ständiges String/Speicherresizen. Also so was wie SetLength. Aber dazu solltest du mal einen Profiler befragen.
Zu den VBOs. Hast du wirklich 2000 grundgetrennte VBOs? Also wenn ja würde ich das evtl ändern. Also so, dass die sich ein paar VBOs teilen. Dazu gibt es aber ein Dokument von NVidia. Solltest du dir in jedem Fall mal zu Gemühte führen. Nico oder Lars. Einer von Beiden hatte auch mal ein Testprgramm geschrieben. Damit konnte man auch verschiedene Konstellationen testen. Aber frag mich nicht wie das hieß und wo man das gleich noch mal finden konnte. Bzw kannst du auf Saschas Seite auch eine Demo finden.
Zu den VBOs. Hast du wirklich 2000 grundgetrennte VBOs? Also wenn ja würde ich das evtl ändern. Also so, dass die sich ein paar VBOs teilen. Dazu gibt es aber ein Dokument von NVidia. Solltest du dir in jedem Fall mal zu Gemühte führen. Nico oder Lars. Einer von Beiden hatte auch mal ein Testprgramm geschrieben. Damit konnte man auch verschiedene Konstellationen testen. Aber frag mich nicht wie das hieß und wo man das gleich noch mal finden konnte. Bzw kannst du auf Saschas Seite auch eine Demo finden.
Im moment sind es 2000 grundgetrennte VBOs, ja.. Es müßte also rein theoretisch wesentlich schneller gehen, wenn ich alle 2000 VBOs in einen einzigen zusammenstecke und dann via glDrawArrays(vbo, start, end) einfach nur immer den teil zeichne den ich brauche, ja? probier ich heute abend mal aus =^.^=
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Ja das sollte sich in jedem Fall bemerkbar machen. In dem pdf steht auch, dass du eher glDrawRangeElements statt glDrawElements benutzen sollst (denke mal tust du ja) und glVertexPointer sparsam benutzen, da dort das alles initialisiert wird. Vor allem steht da auch, dass du glVertexPointer als letztes aufrufen sollst. Normalenpointer etc vorher setzen. Denke aber mal das sind eher so die letzten Optimierungen. Aber schau dir das pdf selber mal genau an.
PS: Wäre nett du dann auch die Results von deinen Änderungen postest. Also was die Veränderungen gebracht haben.
Registriert: Di Mai 18, 2004 16:45 Beiträge: 2623 Wohnort: Berlin
Programmiersprache: Go, C/C++
All so viel sollten allerdings die ganzen fixes nicht bringen, meine r9800 hat seine grenze bei ~60Millionen Tris die sek.
Neue Karten liegen auch nicht viel höher, in der Regel ändert sich nur der Pixeldurchsatz und die Shadergeschwindigkeit.
Auf der Offiziellen NVidia und ATI seite konnte ich die Tris/s grenze für die neuen Karten nicht finden.
_________________ "Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren" Benjamin Franklin
hab das ganze eben mal schnell probiert, allerdings hab ich hier grad nur ne recht kleine scene mit 100.000 Triangles in knapp 50 Objekten.
Da hat das ganze eigentlich keinen unterschied gemacht... es pendelte so im 5 fps unterschied bereich, wobei auch nur jedes 2te oder 3te mal wo ich das programm gestartet hab, also kann auch normale abweichung sein. Werd es aber heute abend mal mit der 4 mio scene testen wie's da aussieht..
Aya~
PS: Gibt es ne grenze wieviele vertices maximal in nen VBO passen? wahrscheinlich Integer-limit, oder?
EDIT: Eine sache die mich schon lange nervt... man könnte ja ewig viele vertices sparen im VertexBuffer, wenn man einfach via IndexBuffer sagt welches Vertex zu welchem Triangle gehört, so das sich mehrere triangles auch mal nen vertex teilen.
Da ist aber das problem, das geht nur solange wie die ganzen vertices auch immer nur eine uv-koordinate haben... ne möglichkeit für Vertex/Normal Buffer nen anderen IndexArray als für den UV Buffer zu nehmen gibt es nicht, oder?
Environments Typical environments contain 1000-5000 total renderable objects, including static meshes and skeletal meshes. For reasonable performance on current 3D cards, we aim to keep the number of visible objects in any given scene to 300-1000 visible objects. Our larger scenes typically peak at 500,000 to 1,500,000 rendered triangles.
Die zahl die du da hattest ist die, die die objekte haben bevor sie als normal map konvertiert werden, also hat eine "large scene" bis zu 1.5 Mio Triangles
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Ja aber ich denke Unreal 3 sollte nicht als Maßstab für eine private Engine gelten. Ich denke mal die könnten damit jedes System in die Knie zwingen.
Ich habe mal geschaut. 3DMark05 hat 1.8 Miollionen Polygone und 3DMark06 hat 5.4 Millionen pro szene. Und irgendwo habe ich mal gelesen, dass Stalker mit dem DX9 Rendere bis zu 1 Mio bei einigen Szenen hat. Und ich denke das ist auch durchaus ein maß was halbwegs realistisch ist.
Im moment sind es 2000 grundgetrennte VBOs, ja.. Es müßte also rein theoretisch wesentlich schneller gehen, wenn ich alle 2000 VBOs in einen einzigen zusammenstecke und dann via glDrawArrays(vbo, start, end) einfach nur immer den teil zeichne den ich brauche, ja? probier ich heute abend mal aus =^.^=
Aya~
Irgendwo bei nvidia hab ich aber auch mal gelesen, dass ein Auruf maximal 64k Dreiecke enthalten soll, alles drüber wird nur wieder langsamer. Also macht es keinen Sinn, alles in ein VBO zu stopfen.
Wichtig ist auch, dass mehrfach genutze Vertices auch in "zeitlich enger Reihenfolge" benutzt werden, um so den Puffer der Graka gut zu nutzen.
_________________ __________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Pellaeon: Ich denke du verdrehst da etwas. Ein VBO würde nur bedeuten, dass man sich einen gro0en Speicherbereich holt um dort seine Daten abzulegen. Das bedeutet natürlich nicht, dass dieser auch auf einmal gezeichnet werden muss. Bei glDrawRangeElements kann man einen Start und einen Count angeben. Und wenn die Vertieces alle die gleichen Komponenten beinhalten, müsste man nichts weiter machen als 100 Mal ein anderes Offset angeben. Wärend man bei 100 VBOs jedes mal die kompletten Einstellungen wieder vornehmen müsste. Bzw müsste die Karte jedes mal "umdenken"/anders initialisieren.
Mitglieder in diesem Forum: Bing [Bot] 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.