Schnellstes Streaming zur GPU

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
dronus
Establishment
Beiträge: 114
Registriert: 11.01.2010, 01:53

Schnellstes Streaming zur GPU

Beitrag von dronus »

Ich will in jedem Frame vollkommen neues rendern. Was ist die schnellste Art, Daten auf die GraKa zu pumpen, oder ist die Methode egal, weil eh alle die max. Bus-Bandbreite oder sowas erreichen?

Die Geometrie kann ich mit Vertex/Geometrie-Shader bearbeiten, also ist eigentlich egal wie die Daten in die GraKa kommen. In OpenGL habe ich bisher die simple glVertex4f(..) Methode versucht, und Vertex-Arrays, die geben sich nicht viel, vielleicht erreicht beides die maximale Bandbreite?

VBO's sollen ja toll sein, aber vor allem wenn man den Kram auf der Graka speichern will, will ich nicht...

Die Frage ist ob Texturen schneller übertragen würden? Ich könnte die Daten ja im Vertexshader aus der Textur fitzeln. Das ist bloß ein großer Umbau, hat da jemand Erfahrungen mit, auch hinsichtlich ATI vs. Nvidia?
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: Schnellstes Streaming zur GPU

Beitrag von Aramis »

glVertex4f hat einen katastrophal hohen CPU-Overhead (ein voller, externer Funktionsaufruf pro Vertexkomponente -- die CPU wird bei großen Datenmengen der limitierende Faktor sein, nicht die Bandbreite des PCI-Express/PCI/AGP Busses).
VBO's sollen ja toll sein, aber vor allem wenn man den Kram auf der Graka speichern will, will ich nicht...
Soweit ich weiß optimieren die meisten OpenGL-Treiber komplett auf VBOs. Es gibt ein STREAM-Flag für VBOs, das genau dafür gedacht ist ständig neue Daten hochzuladen. Ich würde also sagen, dass du dich wohl oder übel mit VBOs anfreunden solltest wenn du maximale Bandbreite willst.
dronus
Establishment
Beiträge: 114
Registriert: 11.01.2010, 01:53

Re: Schnellstes Streaming zur GPU

Beitrag von dronus »

Aramis hat geschrieben:glVertex4f hat einen katastrophal hohen CPU-Overhead (ein voller, externer Funktionsaufruf pro Vertexkomponente -- die CPU wird bei großen Datenmengen der limitierende Faktor sein, nicht die Bandbreite des PCI-Express/PCI/AGP Busses).
Ok, dann scheint es mir aber einen anderen Flaschenhals zu geben. Denn auch Vertexarrays waren nicht schneller als der Vertex4f Haufen. Naja, aus jedem Vertex mache ich ein texturiertes, rotiertes Quad auf der Graka, und noch allen möglichen anderen Kram, vermutlich ist die GPU ausnahmsweise mal beschäftigt.

Dank erstmal.
Benutzeravatar
Schrompf
Moderator
Beiträge: 4884
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: Schnellstes Streaming zur GPU

Beitrag von Schrompf »

VBOs sind was anderes als Vertex Arrays. Google mal danach, genaueres kann ich Dir mangels OpenGL-Kenntnissen auch nicht sagen.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: Schnellstes Streaming zur GPU

Beitrag von kimmi »

Hier kannst du beispielsweise etwas dazu finden:
http://nehe.gamedev.net/data/lessons/le ... ?lesson=45

Gruß Kimmi
Benutzeravatar
Lynxeye
Establishment
Beiträge: 145
Registriert: 27.02.2009, 16:50
Echter Name: Lucas
Wohnort: Hildesheim
Kontaktdaten:

Re: Schnellstes Streaming zur GPU

Beitrag von Lynxeye »

dronus hat geschrieben: Ok, dann scheint es mir aber einen anderen Flaschenhals zu geben. Denn auch Vertexarrays waren nicht schneller als der Vertex4f Haufen. Naja, aus jedem Vertex mache ich ein texturiertes, rotiertes Quad auf der Graka, und noch allen möglichen anderen Kram, vermutlich ist die GPU ausnahmsweise mal beschäftigt.

Dank erstmal.
Die GPUs haben leider keine eigene DMA Engine. Das heißt, wenn die GPU mit vielen anderen Sachen beschäftigt ist, wirst du nie an die Bandbreite des PCIe Busses herankommen.
dronus
Establishment
Beiträge: 114
Registriert: 11.01.2010, 01:53

Re: Schnellstes Streaming zur GPU

Beitrag von dronus »

Aramis hat geschrieben: Soweit ich weiß optimieren die meisten OpenGL-Treiber komplett auf VBOs. Es gibt ein STREAM-Flag für VBOs, das genau dafür gedacht ist ständig neue Daten hochzuladen. Ich würde also sagen, dass du dich wohl oder übel mit VBOs anfreunden solltest wenn du maximale Bandbreite willst.
Hab mich angefreundet aber keine Dankbarkeit... brachte auch keinen merklichen Vorteil. Wenn man statische Geometrie rendert, mag das alles anders sein, aber solange alle Daten nur einmal gerendert werden habe ich dieselbe Performance mit VBOs, VertexArrays und Vertex4f-Aufrufen. Der Overhead scheint also klein genug zu sein, und das trotz Java (jeder Vertex4f Aufruf wird noch zweimal weitergereicht.). Letztlich wird per Geoshader aus jedem Vertex4f ein komplettes Quad, ich vermute das die Rasterung oder Texturierung die Geschwindigkeit begrenzen.
Jörg
Establishment
Beiträge: 296
Registriert: 03.12.2005, 13:06
Wohnort: Trondheim
Kontaktdaten:

Re: Schnellstes Streaming zur GPU

Beitrag von Jörg »

Lynxeye hat geschrieben:Die GPUs haben leider keine eigene DMA Engine. Das heißt, wenn die GPU mit vielen anderen Sachen beschäftigt ist, wirst du nie an die Bandbreite des PCIe Busses herankommen.
Das kann ich so nicht stehen lassen. Zumindest alle NVIdia-GPUs mit CCC > 1.1 (CUDA compute capability) haben die Moeglichkeit, einen DMA-Transfer parallel zur Berechnung auszufuehren. Nativ. Unter CUDA zunächst. Ob ein OpenGL-Treiber davon gebraucht macht...mhmmm, keine Ahnung ;) Leider ist die DMA-Engine etwas beschnitten und kann keine "scattered"-Daten in einem Rutsch kopieren, aber fuer Vertexbuffer im Allgemeinen sollte das schon gehen.
Die Fermi-Generation soll ja sogar mit 2 DMA-Engines kommen, laut http://www.hpcwire.com/features/NVIDIA- ... 00147.html zumindest.
Antworten