 |
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
User_User JLI'ler
Anmeldedatum: 05.08.2004 Beiträge: 137
Medaillen: Keine
|
Verfasst am: 28.03.2006, 03:53 Titel: Verbesserung der Performance |
|
|
Ich habe ein paar Fragen zur Performancesteigerung:
1) Ich habe mehrere gleichartige 3D-Objekte. Die Vertex-Daten für ein einzelnes Objekt halten sich in Grenzen. Leider weiß ich nicht, ob die Vertex-Daten einmal oder mehrmals (für jedes Objekt) übertragen werden. Lohnt sich da ein Indexbuffer?
2) Ich hatte vor, nur die sichtbare Vorderseite der Objekte zu übergeben. Der entstandene Code ist recht umfangreich geworden. Leider bin ich nicht in der Lage, abzuschätzen, ob meine Grafikkarte nicht sichtbare Dreiecke schneller verwirft, als ich durch meine Code eingespart habe.  |
|
Nach oben |
|
 |
Christian Rousselle Site Admin

Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 28.03.2006, 08:29 Titel: |
|
|
Ohne wirklich zu wissen, was du vorhast:
1. Ein Indexbuffer lohnt sich, wenn in dem Modell Vertices für mehrere Dreiecke verwendet werden.
2. Normalerweise ist die Grafikkarte schneller, wenn es darum geht zu entscheiden, ob ein Dreieck sichtbar ist, oder nicht. Das lohnt sich nicht, selber zu machen. Was zu testen solltest, ist, ob das ganze Objekt sichtbar ist.
C. |
|
Nach oben |
|
 |
Jonathan_Klein Living Legend

Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 28.03.2006, 18:19 Titel: |
|
|
Zum Thema Vertexdaten übertragen: Normalerweise hast du die Vertexdaten in Vertexbuffer. Diese befindne sich auf der Grafikarte, also werden die Daten nur beim erstellen übertragen.
Wenn du für jedes der Objekte einen eigenen Vertexbuffer erstellst, ist das verschwendung. Du kannst einen einzigen benutzen und ihn hundermal rendern, mithilfe der Matrizen an jeder beliebigen Stelle. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
 |
DirectXer Dark JLI'ler

Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 28.03.2006, 18:35 Titel: |
|
|
wenn wir grad schon beim thema sind, ich hätte da auch noch ne frage:
sagen wir mal ich habe ein Objekt (hier Linie), das aus 2 Punkten besteht. Wenn einer der beiden Punkte bewegt wird, muss die ganze Matrix der Linie neu berechnet werden, also der Winkel für den Rotationsteil, die Komponenten für die neue Skalierung und die Verschiebung. Das ist dann für jeden Frame, wo der User einen Punkt bewegt sehr rechenaufwändig. Könnte man anstatt jedes mal die Transformationsmatrix neu zu berechnen, net einfach nur diesen einen Punkt in dem Vertexbuffer ändern? Also nur ein vb->Lock(); verts[1] = P; vb->Unlock(), oder würde dieser Zugriff schon mehr wegnehmen als die komplette Matrixberechnung inkl. den Matrixmultiplikationen?
Gruß DXer |
|
Nach oben |
|
 |
Christian Rousselle Site Admin

Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 28.03.2006, 19:02 Titel: |
|
|
Verstehe ich nicht. Es wird doch nur der eine Punkt neu berechnet?! Wieso sollte das schneller gehen, wenn du das "von Hand" auf der CPU machst? |
|
Nach oben |
|
 |
DirectXer Dark JLI'ler

Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 28.03.2006, 19:16 Titel: |
|
|
Also, ich beschreib das ganze mal mal genauer^^
Ich hab ne Linie, eine LINELIST aus 2 Punkten in einem Vertexbuffer. Im Vertexbuffer hat diese die Koordinaten { -0.5, 0.5 } damit ich den Betrag = 1 und die Ausrichtung fest habe. Die ganze Transformation, wie der User diese Linie mit Hilfe der zwei Punkte, die sie aufspannen, handhabt, wird in einer Matrix zusammen gefasst (seperat könnte ich auch für rotation, skalierung und translation 3 machen, aber das is nur nebenbei)
Also dann müssen in der Matrix folgende Sachen zusammengefasst sein:
Code: |
1. Skalierung, die Komponenten _11, _22 müssen an die Länge der neuen Linie, also der, dessen Punktkoordinaten der User grad verändert, angepasst werden
2. Rotation, der Ortswinkel der Linie im VB ist 0°, die Rotationsmatrix muss den Winkel zwischen der neuen und der stdlinie erhalten
3. Translation, die Linie ist ja net immer im Ursprung |
Anstatt die jeweiligen Matrizen immer wieder neu zu berechnen, müsste es doch schneller sein, einfach den VB { -0.5f, 0.5f } zu sperren, den neuen Punkt, wie der Benutzer in verschiebt, durch den betreffenden Punkt im VB zu ersetzen und den VB dann wieder entsperren, oder? Oder nimmt ein einfacher Zugriff auf den VB so viel Zeit mit sich?
Gruß DXer |
|
Nach oben |
|
 |
Jonathan_Klein Living Legend

Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 28.03.2006, 20:13 Titel: |
|
|
naja, kommt darauf an, wo du den Buffer erstellt hast. Du kannst natürlich auch direkt aus dem Hauptspeicher zeichnen, bei 2 Punkten muss da ja kuam was an die Grafikkarte übertragne werden. Das sollte relativ schnell sein.
Wenn du viele Linien hast, ist es natürlich besser alle in einem rutsch zu berechnen und zu rendern, als 10.000 mal immer nur 2 zu rendern. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
 |
User_User JLI'ler
Anmeldedatum: 05.08.2004 Beiträge: 137
Medaillen: Keine
|
Verfasst am: 28.03.2006, 21:11 Titel: Rendergeschwindigkeit bei Dreiecken |
|
|
Nochmals zu den Indexbuffern:
Indexbuffer reduzieren die Datenmenge - aber auch die Geschwindigkeit?
Ich schreibe gerade ein Programm, welches Moleküle darstellen soll. Die Größe des Vertex-Buffer für ein Atom (eine Kugel) ist recht gering. Mit Indexbuffer könnte ich die Datenmenge auf ca. 30% reduzieren.
Wenn Indexbuffer die Geschwindigkeit beeinflussen, dann heißt dies doch, dass sie auch die Rendergeschwindigkeit beeinflussen. Aus den durch Indexbuffer eingesparten Daten müssen doch schließlich wieder die "ursprünglichen" Vertex-Daten gewonnen werden (um eben diese darstellen zu könnnen).
Deshalb ging ich davon aus, dass meine Grafikkarte eine feste Anzahl an Dreiecken pro Takt rendern kann und die Indexbuffer sich nur auf den Speicherbedarf auswirken.
Bedeutet halbe Datenmenge doppelte Geschwindigkeit, oder kann man hier einen groben Wert für die Beziehung
Renderleistung = Umrechnungsfaktor / Datenmenge in Byte
angeben? |
|
Nach oben |
|
 |
Christian Rousselle Site Admin

Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 28.03.2006, 21:17 Titel: |
|
|
Der Indexbuffer ist für den Vertexcache der Grafikkarte hilfreich. Der Vertexcache der Grafikkarte kann eine bestimmt Anzahl von transformierten Vertices aufnehmen. Die Grafikkarte speichert den Index und den zugehörigen Vertex. Wenn die Grafikkarte nun den Index ließt und merkt, dass sich der Vertex bereits im Cache befindet, muss Sie nicht mehr transformieren. Die bringt nat. nur dann Vorteile, wenn sich Vertices wiederholen, d.h. häufiger verwendet werden.
In deinem Fall würde ich davon ausgehen, dass es schneller wird -> ausprobieren.
C. |
|
Nach oben |
|
 |
Jonathan_Klein Living Legend

Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 28.03.2006, 21:20 Titel: |
|
|
auf keinen Fall. Das rendern an sich ist recht komplex und kann schwer vorhergesagt werden.
Zuerst müssen alle Daten transformiert werden. Dann fallen durch das Culling shconmal meist ne ganze Menge Dreiecke raus. Dann müssen die Dreiecke noch gezeichnet werdne. Je größer sie sind, desto länger duaert logischerweise auch das zeichnen. Wenn ein Pixel hinter einem andern lieg,t muss nicht erst ein Farbwert berechnet werden, wenn er den alten überschreiben soll müssen 2 Farbwerte berechnet werden (ok, ich weiß nicht ob die GraKa die eine überflüssige Berechnung wegoptimiert, wäre aber denkbar).
Daher sind Indexbuffer zwar sicherlich eine Optimierung, wie viel sie aber im einzelnen bringen muss man einfach austesten. Wenn die Datenmenge auf 30% reduzeit wird, sollte man aber schon etwas merken können, schließlich müssten nur 30% der Vektoren transformiert werden. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
 |
KI JLI Master

Alter: 39 Anmeldedatum: 04.07.2003 Beiträge: 965 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 28.03.2006, 21:33 Titel: |
|
|
Guck dir mal das an: General Performance Tips
Das meiste davon ist recht brauchbar.
Soweit ich weiß sind Zugriffe auf den Vertexbuffer vergleichsweise sehr rechenintensiv. Am besten macht man auch einen statischen Vertexbuffer.
Ich würde nicht in den Vertexbuffer schreiben DirectXer. Mach diesen lieber nicht LOCKABLE und verchieb die Punkte per Matrixtransformation.
Aber bei 2 Punkten ist es eigentlich egal. Da wirst du keinen messbaren Geschwindigkeitsvorteil haben. Mach es vielleicht einfach so wie es am bequemsten ist. |
|
Nach oben |
|
 |
DirectXer Dark JLI'ler

Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 29.03.2006, 18:01 Titel: |
|
|
KI hat Folgendes geschrieben: |
Ich würde nicht in den Vertexbuffer schreiben DirectXer. Mach diesen lieber nicht LOCKABLE und verchieb die Punkte per Matrixtransformation.
Aber bei 2 Punkten ist es eigentlich egal. Da wirst du keinen messbaren Geschwindigkeitsvorteil haben. Mach es vielleicht einfach so wie es am bequemsten ist. |
also, in den VB schreiben muss ich sowieso öfters mal, wenn ich die Farbe ändere. Aber, ich hätte 2 Möglichkeiten:
Entweder benutze ich für jede Linie (die hängen ja net zusammen) jeweils einen VB mit den transformierten Daten
oder
ich behalte für jede Linie die Matrizenlösung bei, so dass jede Linie ihre eigene Matrix, in der alles steht, hat, und benutze dann für alle Linien einen und denselben VB. Da ich meistens nur 2 versch. Farben brauche, näml. weiß und grün, könnte ich 2 "lokale" VBs erstellen, die alle verwenden, nur jede mit ihrer eigenen matrix. Das würde vllt bei ca. 10 Linien durchschnittlich schon was bringen...
Was meint ihr? |
|
Nach oben |
|
 |
Fallen JLI MVP


Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 30.03.2006, 13:25 Titel: |
|
|
Hi, wenn du viele linien hast. Wäre es evtl besser einen grossen Buffer zu haben mit transformierten Punkten so kannst du mit einem Rendercall (DrawXXX) alle auf einen rutsch rendern und ersparst dir die Zeit die du brauchst um den DrawCall sowie die Renderstates und Matritzen states zu setzen. Besonders die DrawStates und das einzelne zuweisen der nötiogen Streams ist recht Kostenintensiv, in der DX Doku gibt es sogar eine Liste der Dauer in Zyklen der einzelnen Befehle.
Also unter umständen wäre in solchen Fällen das vortransformieren fixer. _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|