2010-12-29 13 views
14

Gibt es bei der Entwicklung eines OpenGL-Programms eine Möglichkeit, vom System abzufragen, wie viele Megabyte zum Speichern von Texturen usw. verfügbar sind?Ermitteln des verfügbaren Videospeichers

Oder ist der Standardansatz in diesen Tagen nur Speicher zuordnen und alles vergessen?

Antwort

12

OpenGL gibt Ihnen diese Informationen nicht. Und ehrlich gesagt: Es bringt nur wenig, nur weil wir heute Multitasking-Betriebssysteme haben. Der OpenGL-Treiber ist dafür verantwortlich, Texturdaten in/aus dem Systemspeicher auszutauschen, wenn Bedarf besteht.

Was OpenGL für Sie tun kann, ist zu sagen, ob die Texturen, die Sie hochgeladen haben, noch im schnellen Speicher resident sind. Die Funktion heißt "glAreTexturesResident". Sie können damit schrittweise Daten auf die GPU hochladen, bis Sie den Speicher der GPU gefüllt haben. Bedenken Sie jedoch, dass Sie nicht der einzige Nutzer der GPU sind.

+6

Fügen Sie es einfach hier hinzu, damit andere, die hier sind, wissen: 'glAreTexturesResident' ist im Kernprofil veraltet, daher ist es nicht ratsam, sie in einem modernen OpenGL-Programm zu verwenden. – legends2k

39

Obwohl die offizielle Haltung "du musst es nicht wissen, du willst es nicht wissen, und es würde dir sowieso nicht helfen", haben glücklicherweise mindestens zwei IHVs in letzter Zeit ein wenig mehr Einsicht gezeigt und bieten Erweiterungen an diese Informationen abfragen:

eine nette Sache über diese Erweiterungen ist, dass sie einen kleinsten gemeinsamen Nenner haben, die genau das, was die meisten Leute brauchen, und Sie brauchen nicht Abfragen Erweiterung Unterstützung oder etwas Besonderes, wie sie beide über glGetIntegerv arbeiten.

Im einfachsten Fall können Sie einfach ein Array von 4 ganzen Zahlen auf Null initialisieren (oder einen minimalen Standardwert, den Sie annehmen, falls die Erweiterungen nicht funktionieren), dann rufen Sie zweimal glGetIntegerv (mit GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX und TEXTURE_FREE_MEMORY_ATI) und schließlich glGetError aufrufen, um den Fehlerzustand zu löschen. glGetIntegerv ändert den Speicher, auf den verwiesen wird, nicht, wenn er fehlschlägt, noch stürzt er ab oder andere schlechte Sache - es setzt den Fehlerzustand einfach auf GL_INVALID_ENUM.

Beide Erweiterungen geben einen Wert in der ersten Array-Position zurück, die ATI gibt auch einige Werte in den anderen 3 zurück.

n.b .: glAreTexturesResident wurde seit fast einem Jahrzehnt auf der Mainstream-Hardware nicht mehr unterstützt, in gleicher Weise wie Texturprioritäten. Das allgemeine Mantra ist, dass der Fahrer Schriftsteller sowieso viel besser als Sie weiß.

+0

Warum finde ich diese Erweiterungen nicht? Ich benutze den letzten JOGL ... – elect

+0

Ich benutze JOGL nicht, also würde ich nicht wissen, aber es gibt mindestens eine plausible Erklärung in der Dokumentation für die GL2 und GL3 Schnittstellen: _ "unterstützt die meisten davon [sic ] Erweiterungen, die zum Zeitpunkt dieser Spezifikation definiert wurden "_. Das sind September 2004 und August 2008, die die beiden oben genannten Erweiterungen (März und Dezember 2009) ausschließen. Wenn Sie also eine dieser beiden Schnittstellen verwenden, wäre das eine plausible Erklärung (eine andere ist, dass Ihr Grafiktreiber die Erweiterungen wirklich nicht unterstützt). – Damon

+2

Wie auch immer, Sie brauchen nicht wirklich "Unterstützung" für die Erweiterungen. Wie oben erwähnt, verwenden sie 'glGetIntegerv' - verwenden Sie einfach die Konstanten (die in den Spezifikationsdateien enthalten sind). Es wird funktionieren, oder es wird nicht funktionieren. Wählen Sie einen vernünftigen Standardwert, und das ist so gut wie möglich. – Damon

Verwandte Themen