Consejos de optimización de OpenGL [cerrado]

26

¿Qué consejos o trucos tienes para hacer que OpenGL sea más eficiente?

descuento
fuente

Respuestas:

16

Use VBO en lugar de glStart () / glEnd (). Esto ahorra ciclos al transferir los datos a la memoria de la GPU.

Mr Valdez
fuente
77
Más que eso, glBegin y glEnd quedaron en desuso en revisiones posteriores y se eliminaron por completo (y, por lo tanto, no funcionarán) en las versiones 3.xy superiores. Si solicita un contexto OpenGL 3.x, no podrá utilizarlos por completo.
Slurps Mad Rips
DirectX realmente te impone esto, no tiene un equivalente de glStart()/glEnd().
knight666
@SAHChandler No lo sabía. No me di cuenta de que estaba en desuso.
MrValdez
3
@SAHChandler: ¡Eso apesta! Aprendí todo mi dibujo con glBegin () y glEnd (). Noooo !!!
8

La punta estándar de perfil, perfil, perfil se aplica igual de bien aquí, aunque las herramientas son ligeramente diferentes.

gDEBugger es excelente para ayudarlo a ver exactamente lo que sucede debajo del capó. Sin embargo, es caro.

Tétrada
fuente
2
Solo quería agregar que ahora es gratis.
DMan
8

Estas son referencias de documentación de Apple en OpenGL, pero cada poquito ayuda, ¿verdad? ;)

Optimización del rendimiento de OpenGL: conceptos básicos
Optimización del rendimiento de datos de OpenGL en OS X

(Esta última es una aplicación de muestra)
Optimización de vértices

También hay una gran cantidad de videos disponibles sobre el tema (también de Apple) que hablan sobre las extensiones de OpenGL. Algunos de ellos son específicos de OS X, pero algunos otros están más generalizados y probablemente podrían aplicarse a Windows y Linux.

Puedes encontrar los videos aquí . Sin embargo, necesita iTunes y una cuenta de Apple para verlos (¡pero son gratis!: D)

Slurps Mad Rips
fuente
7

Bueno, realmente depende de lo que planeas hacer, pero aquí están los conceptos básicos:

  • Su CPU es muy valiosa, mientras que su GPU es una bestia hambrienta. Desplaza todo lo que puedas a la GPU. Hoy en día puedes hacer esto con excelentes bibliotecas como OpenCL, CUDA y Thrust.

  • Enciende tu iluminación en un sombreador. Esto no solo ayudará a retener su cordura, sino que le permite cosas muy interesantes como sombreadores de toon e iluminación diferida .

  • Las partículas apestan. Incluso cuando se usan sprites de punto OpenGL.

caballero666
fuente
6

Minimiza tus cambios de estado. En muchas plataformas, cada cambio de estado potencialmente vacía la tubería. Es mucho mejor agrupar elementos similares y cambiar el estado una vez.

Dennis Munsie
fuente
4
glEnable(GL_CULL_FACES);

Un forro simple que aplica el sacrificio de la cara posterior. Esto es excelente para recortar el recuento de polígonos. Observe también el sacrificio de Frustum / Occlusion para reducir los recuentos de poli.

Otra cosa a tener en cuenta es SIMD para sus vectores y cuaterniones (utilizados principalmente en rotaciones de cámara). Si no desea meterse con ASM, consulte libSIMD, que es una excelente biblioteca para manejar SIMD en C.

Krankzinnig
fuente
4

No use glGet * cuando pueda acceder a variables locales, por ejemplo:

  • No consulte el tamaño de las texturas desde OpenGL, guárdelas al cargar variables
  • No consulte los anchos de línea / tamaños de puntos de OpenGL cuando pueda almacenar los cambios en su aplicación

Estas llamadas son realmente lentas

Mueva cosas no utilizadas fuera de glBegin - cláusula glEnd (ya sea glColor o glNormal o cualquier otra cosa) si no cambia en su interior. OpenGL es una máquina de estados, utiliza el último valor.

Kromster dice que apoya a Mónica
fuente
3

Minimizar los comandos de OpenGL es la clave. Por lo tanto, debe agrupar todos los comandos de dibujo. Para los juegos en 2D, es una buena idea usar Altas Texture y dibujar todos los sprites que compartan la misma textura en un comando opengl.

Ellis
fuente
Ten cuidado. Son útiles lotes menores y mayores, pero dependiendo de la plataforma objetivo, los lotes "demasiado grandes" disminuirán el rendimiento.
Andreas
3

¡Lote, lote, lote! (Ab) use la GPU para renderizar tanto como sea posible en cada llamada de sorteo. Los juegos están principalmente limitados por la cantidad de cambios de estado, no tanto por la cantidad de triángulos.

Hannesh
fuente