Bandbreitenlimitiert

Aus DGL Wiki
Version vom 5. Juli 2006, 23:59 Uhr von I0n0s (Diskussion | Beiträge) (Rechtschreibung)

(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Wechseln zu: Navigation, Suche

Auch in Bezug auf Grafikkarten kann die Bandbreite, also die maximale Datenmenge welche pro Zeiteinheit zur Grafikkarte gesendet werden kann, der ausschlaggebende Faktor für die Framerate sein. Wenn eine Applikation bandbreitenlimitiert ist, so bedeutet dies, dass die Applikation zu viele Daten über den PCI oder AGP-Bus an die Grafikkarte sendet oder von ihr erhalten will.

Eine Grafikkarte ist sehr stark darauf ausgelegt, dass sie ausschließlich Daten erhält, wodurch die CPU nur selten auf die Grafikkarte warten muss (sie sollten möglichst parallel arbeiten). Hingegen dazu ist Feedback von der Grafikkarte nur selten gewünscht, wodurch Anfragen an die Grafikkarte (welcher Art auch immer) enorme Performance Einbußen nach sich ziehen können. Und obwohl derartige Probleme eher weniger mit der Bandbreite des Busses zu tun haben, werden sie häufig auch in diese Problemkategorie eingereiht. Aufgrund dessen muss man sehr stark unterscheiden zwischen Daten die an die Grafikkarte gesendet werden und denen die von der CPU verlangt werden. Man fasst also häufig Synchronisations-Probleme und Bandbreiten-Probleme zusammen.

Häufige Ursachen für Bandbreitenlimitierung:

  • Der Speicher der Grafikkarte muss teilweise auf den Hauptspeicher ausgelagert werden.
  • Zu viele Texturen werden erstellt oder verändert (beispielsweise mittels glTexSubImage)
  • Zu häufig (bzw. an zu viel verschiedenen Stellen) werden Daten von der Grafikkarte verlangt (Feedback-Buffer, glReadPixels, ...)
  • Zu viele Renderdaten werden an die Grafikkarte gesendet. Dies resultiert jedoch üblicherweise in einer Vertexlimitierung wenn die drei anderen Aspekte nicht zutreffen.

Die Bandbreite kann weniger beansprucht werden durch:

  • Weniger Texturen die häufig erstellt oder verändert werden.
  • glBindTexture nur dann wenn nötig (nach Texturen sortiert zeichnen) sofern die Texturen im Hauptspeicher ausgelagert werden.
  • Verwendung von Display Listen oder Vertex Buffer Objects, sofern der Grafikkartenspeicher nicht bereits überfüllt ist.
  • Weniger Anfragen an die Grafikkarte.
  • Verwendung von Synchronisations-Extensions wie GL_NV_fence wenn häufig Daten von der Grafikkarte angefordert werden.
  • Weniger Geometrie-Daten (zB. durch glMap2, Level of Detail, Frustum Culling, ... ).