JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.phpMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Verbesserung der Performance

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
User_User
JLI'ler



Anmeldedatum: 05.08.2004
Beiträge: 137

Medaillen: Keine

BeitragVerfasst am: 28.03.2006, 03:53    Titel: Verbesserung der Performance Antworten mit Zitat

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. Question
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 28.03.2006, 08:29    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 28.03.2006, 18:19    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 28.03.2006, 18:35    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 28.03.2006, 19:02    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 28.03.2006, 19:16    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 28.03.2006, 20:13    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
User_User
JLI'ler



Anmeldedatum: 05.08.2004
Beiträge: 137

Medaillen: Keine

BeitragVerfasst am: 28.03.2006, 21:11    Titel: Rendergeschwindigkeit bei Dreiecken Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 28.03.2006, 21:17    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 28.03.2006, 21:20    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
KI
JLI Master


Alter: 39
Anmeldedatum: 04.07.2003
Beiträge: 965
Wohnort: Aachen
Medaillen: Keine

BeitragVerfasst am: 28.03.2006, 21:33    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 29.03.2006, 18:01    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 30.03.2006, 13:25    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
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

Impressum