2010-12-29 17 views
14

Al desarrollar un programa OpenGL, ¿hay alguna manera de sondear el sistema para averiguar cuántos megabytes hay disponibles para almacenar texturas, etc.?Determinación de la memoria de video disponible

¿O es el enfoque estándar en estos días simplemente asignar memoria y olvidarse de todo?

Respuesta

12

OpenGL no le da esta información. Y francamente: solo hay un pequeño beneficio, simplemente porque hoy tenemos sistemas operativos multitarea. El controlador OpenGL es responsable de intercambiar datos de textura a/desde la memoria del sistema, si hay demanda.

Lo que OpenGL puede hacer por usted, es decir, si las texturas que ha subido todavía son residentes en la memoria rápida. La función se llama "glAreTexturesResident". Puede usar esto para cargar cosas gradualmente a la GPU hasta que haya llenado la memoria de la GPU. Pero tenga en cuenta que no es el único usuario de la GPU.

+6

Solo agréguela aquí para que los que visiten aquí sepan: 'glAreTexturesResident' está en desuso en el perfil principal, por lo que no es prudente utilizarlos en un programa OpenGL moderno. – legends2k

39

Aunque la postura oficial sigue siendo "no necesitas saber, no quieres saber, y de todos modos no te ayudaría", afortunadamente al menos dos IHV han mostrado un poco más de conocimiento últimamente y ofrecen extensiones para consultar esa información:

lo bueno de estas extensiones es que tienen un mínimo común denominador, que es justo lo que la mayoría de la gente necesita, y que no es necesario para consultar soporte de extensión o hacer algo especial, ya que ambos trabajan a través de glGetIntegerv.

En el caso más sencillo, puede inicializar una matriz de 4 números enteros a cero (o algún valor mínimo predeterminado que asumirá en caso de que las extensiones no funcionen), luego llama a glGetIntegerv dos veces (con GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX y TEXTURE_FREE_MEMORY_ATI, respectivamente), y finalmente llame al glGetError para borrar el estado de error. glGetIntegerv no modifica la memoria apuntada si falla, ni se cuelga o cualquier otra cosa mala - simplemente establece el estado de error en GL_INVALID_ENUM.

Ambas extensiones devuelven un valor en la primera posición de la matriz, la ATI también devuelve algunos valores en las otras 3.

n.b .: glAreTexturesResident no se ha admitido durante casi una década en hardware convencional, de la misma manera que las prioridades de textura. El mantra común es que el guionista sabe mucho mejor que usted de todos modos.

+0

¿Por qué no encuentro estas extensiones? Estoy utilizando el último JOGL ... – elect

+0

No estoy usando JOGL, así que no lo sé, pero hay al menos una explicación plausible en la documentación para las interfaces GL2 y GL3: _ "admite la mayoría de su [sic] ] extensiones definidas en el momento de esta especificación "_. Eso significa septiembre de 2004 y agosto de 2008, respectivamente, que excluye las dos extensiones anteriores (marzo y diciembre de 2009). Por lo tanto, si usa una de estas dos interfaces, esa sería una explicación plausible (otra es que su controlador de gráficos realmente no admite las extensiones). – Damon

+2

De todos modos, realmente no necesita "soporte" para las extensiones. Como se indicó anteriormente, usan 'glGetIntegerv' - simplemente use las constantes (que se encuentran en los archivos de especificaciones). Funcionará, o no funcionará. Elija un valor predeterminado razonable, y eso es lo mejor que puede obtener. – Damon

Cuestiones relacionadas