Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 00:07

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 19 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
BeitragVerfasst: Do Jun 14, 2007 10:43 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hi,

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... :roll:

Aya~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jun 14, 2007 11:12 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
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.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jun 14, 2007 11:19 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hi,

TAK2004 hat geschrieben:
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

Aya~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jun 14, 2007 11:20 
Offline
DGL Member
Benutzeravatar

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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jun 14, 2007 11:36 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Lossy eX hat geschrieben:
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 =^.^=

Aya~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jun 14, 2007 11:56 
Offline
DGL Member
Benutzeravatar

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. :D


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jun 14, 2007 12:15 
Offline
DGL Member
Benutzeravatar

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

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jun 14, 2007 13:40 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hi,

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?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jun 14, 2007 14:38 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 03, 2002 15:08
Beiträge: 662
Wohnort: Hamburg
Programmiersprache: Java, C# (,PhP)
Hmm, die Unreal Engine 3 kann (meine ich jedenfalls) ~>20Millionen Triangles pro Szene flüssig darstellen sofern die Hardware das mitmacht.

_________________
(\__/)
(='.'=)
(")_(")


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jun 14, 2007 14:44 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Evil-Devil hat geschrieben:
Hmm, die Unreal Engine 3 kann (meine ich jedenfalls) ~>20Millionen Triangles pro Szene flüssig darstellen sofern die Hardware das mitmacht.

Pro Scene (wo dann immer nur 5-10% zu sehen sind) oder pro frame?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jun 14, 2007 17:03 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 03, 2002 15:08
Beiträge: 662
Wohnort: Hamburg
Programmiersprache: Java, C# (,PhP)
Pro Bildausschnitt. Eine Map hat einige Hundert Millionen Tries im extremfall.

http://www.unrealtechnology.com/html/te ... ue30.shtml

Physikalisch existierende Polys/Tries sind natürlich geringer, aber der hochrechnen muss die Graka es ja trotzdem.

_________________
(\__/)
(='.'=)
(")_(")


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jun 14, 2007 17:37 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hi,

laut der url die du gepostet hast:

Zitat:
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 :)

Aya~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jun 14, 2007 17:40 
Offline
DGL Member
Benutzeravatar

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.

G80 Instancing CPU
G80 Instancing GPU

Allerdings ist die Auflösung alles andere als Aussagekräftig. 640x480


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jun 16, 2007 12:08 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
Aya hat geschrieben:
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jun 16, 2007 15:26 
Offline
DGL Member
Benutzeravatar

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.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 19 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

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.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 17 Queries | GZIP : On ]