2010-07-13 40 views
14

Esto probablemente se ha preguntado una y otra vez, pero no pude encontrar nada útil así que aquí va de nuevo ...Ajuste del rendimiento de OpenGL para el rendimiento de la geometría

En mi aplicación tengo que rendir una malla bastante grande (una un par de millones de triángulos o más) y estoy teniendo algunos problemas para obtener tasas de fotogramas decentes. La CPU está bastante inactiva, así que definitivamente estoy vinculado a la GPU. Cambiar la resolución no afecta el rendimiento, por lo que no está unida a fragmentos o ráster.

La malla es dinámica (pero localmente estática) por lo que no puedo almacenar todo en la tarjeta de video y procesarla con una sola llamada. Por razones específicas de la aplicación, los datos se almacenan como un octárbol con voxels en las hojas, con lo que obtengo el descarte de frustum básicamente gratis. Los datos de los vértices consisten en coordenadas, normales y colores; no se utilizan texturas ni sombreadores.

Mi primer enfoque fue simplemente renderizar todo desde la memoria usando un gran STREAM_DRAW VBO, que resultó ser demasiado lento. Mi idea inicial fue que quizás estaba sobrecargando el bus (empujando ~ 150 MiB por cuadro), así que implementé un esquema de almacenamiento en caché que almacena la geometría utilizada recientemente para representar el objeto en VBO estáticos en la tarjeta gráfica, con cada VBO almacenando un par de 100 KiB a un par de datos de MiB (almacenar más por VBO da más cacheo, por lo que aquí hay una compensación). La siguiente imagen es un ejemplo de cómo se ven los datos, donde todo lo que se colorea en rojo se extrae de las VBO almacenadas en caché.

Example of the rendered data http://gimaker.users.sourceforge.net/0010.png

Como los números siguientes muestran, no veo un aumento espectacular en el rendimiento cuando se utiliza la memoria caché. Para una malla totalmente estática de aproximadamente 1 millón de triángulos I obtener los siguientes valores de frecuencia:

  • Sin caché: 1,95 Hz
  • almacenamiento en caché utilizando matrices de vértices: 2.0 Hz (> 75% de la malla se almacena en caché)
  • almacenamiento en caché utilizando STATIC_DRAW OISCIV: 2,4 Hz

Así que mi pregunta es ¿cómo puedo acelerar esto? Es decir .:

  • ¿Cuál es el formato de vértice recomendado para obtener un rendimiento decente? Uso el almacenamiento intercalado con posiciones y normales como GL_FLOAT y GL_UNSIGNED_BYTE para los colores, con un byte de relleno para obtener la alineación de 4 bytes (28 bytes/vértice total).
  • Si usar el mismo búfer para las normales para todos mis cuadros podría ser útil (todas las casillas están alineadas con el eje, así puedo asignar un búfer normal al tamaño de la entrada de la memoria caché más grande y usarlo para todas).
  • ¿Cómo puedo saber qué parte de la tubería es el cuello de botella? No tengo una tarjeta de video espectacular (Intel GM965 con controladores Linux de código abierto) por lo que es posible que llegue a su límite. ¿Cuánto rendimiento puedo esperar del hardware típico (gráficos integrados de 2 a 3 años, gráficos integrados modernos, gráficos discretos modernos)?
  • ¿Alguna otra sugerencia sobre cómo podría hacer frente a esto, trampas, etc.

No estoy interesado en las respuestas que sugieren LOD (ya probado esto), consejos específicos del proveedor o el uso de funciones de OpenGL de cualquier cosa más adelante que 1.5.

+0

¿Sus primitivos consisten solo en cajas alineadas con el eje? – Stringer

+0

@Stringer Bell: Sí (pero no necesariamente alineado con los ejes del mundo). – Staffan

+1

No estoy seguro, pero supongo que tocas el límite de la tarjeta gráfica. He buscado en Google un poco y parece que Intel GM965 tiene un rendimiento bastante bajo, especialmente para juegos. (El tuyo no es un juego pero parece bastante "difícil" de renderizar). Nvidia tiene una lista de cuántos triángulos pueden mostrar sus tarjetas/segundo: tal vez pueda categorizar su tarjeta con esta lista para averiguar el límite "teórico". – InsertNickHere

Respuesta

5

Es probable que no le va a gustar esta respuesta ....

que he encontrado el problema: Intel GM965 con los controladores de Linux de código abierto

Si bien mi trabajo actual no alcance su volumen de datos, hemos renderizado varios millones de vértices en VBO e Intel hardware/controladores de gráficos han demostrado ser inútiles. Búscate una tarjeta NVidia (y deja de tener que usar el controlador binario, simplemente funciona) y estarás listo. Ni siquiera tiene que ser una generación actual, aunque un Quadro de gama alta (si el trabajo está pagando) o una serie GTX 400 de gama alta (si está pagando o simplemente tratando de ahorrar algo de dinero en el trabajo) debería funcionar bien con la última versión conductores. También podría tratar de encontrar una máquina con este hardware para probar si la actualización de su máquina no es una opción.

+0

Parece que tienes razón. Probé en una máquina con mejores gráficos, no un Quadro pero mejor, sin embargo, y obtuve 15 Hz con almacenamiento en caché y la otra mitad sin él. Es más un inconveniente que un problema ya que solo soy el desarrollador y no (actualmente) el usuario principal de él. – Staffan

+0

@Staffan: no significa que usted tenga un máximo de su GMA 965 para mí. Tal vez solo estás haciendo algo malo por las actuaciones. Francamente, consideraría darle una oportunidad a Intel Media Accelerator Profiler (si su aplicación es portátil, por supuesto). No olvides que GMA son renderizadores basados ​​en mosaicos. – Stringer

+0

@Stringer Bell: Parece que realmente es la tarjeta de video/controladores que establecen el límite. Después de un ajuste de mi mecanismo de almacenamiento en caché consigo ~ 28 millones de triángulos/s en una GeForce 3 Ti200, no hay especificaciones oficiales sobre cuántos triángulos puede empujar, pero parece que podría estar razonablemente cerca del límite. – Staffan

0

Utilizaría un analizador de rendimiento primero (como gDEBugger), para que pueda averiguar si es vértice, fragmento o bus limitado, etc.Es difícil adivinar qué optimizaciones realizar en un caso tan particular (controladores de fuente abierta Intel +).

¿Has probado también el modo VA? ¿Estás usando glDrawElements? glDrawArrays? ¿Son los datos vértices-caché amigables (antes y después de la transformación)?

+0

Bell: Utilizaría un analizador de OpenGL si hubiera un código abierto (o gratuito) para Linux (ver [mi otra pregunta] (http://stackoverflow.com/questions/3235864/open-source-opengl-profiler- for-linux)). Los controladores de fuente abierta son los controladores oficiales desarrollados por Intel, pero supongo que ya lo saben. Estoy usando glDrawArrays ya que no puedo compartir datos entre vértices (todos los vértices tienen diferentes normales o posición). ¿Qué es el modo VA? Los datos son compatibles con caché AFAICT, es decir, almacenamiento entrelazado (no estoy seguro de cómo las transformaciones afectarían eso). – Staffan

+0

Probé gDEBugger a pesar de ser una fuente cerrada, y no funciona para mí (me da un contexto indirecto y luego causa un SIGSEGV). – Staffan

+0

El modo VA es simples matrices antiguas de 1.1 vértices. Las cachés de post transformación se usan solo si tiene índices (consulte http://www.opengl.org/wiki/Post_Transform_Cache). ¿Usas GL_QUAD o GL_TRIANGLES para renderizar tus cajas? – Stringer

0

No sé tu "malla" pero parece que son todos cubos. Si es posible para usted, renderice un solo cubo de unión a una lista de visualización y represente una versión escalada de esa lista de visualización. Eso a menudo da una aceleración de 10x, ya que el bus no se bombea con datos de vértice o la memoria de video está agotada.

Por supuesto, eso depende de su capacidad para cambiar los datos. Puede que no sea el caso si realmente no es como en la imagen.

+0

Todos son cuboides, sí. Como describí en el OP, utilizo un caché con VBO para evitar sobrecargar el bus, no hubo llamadas glVertex3() involucradas en la generación de la imagen de arriba. – Staffan

+0

Pero VBO! = Lista de visualización ... La diferencia es que VBO todavía usa un LARGE ARRAY, incluso si está en la memoria de video. En la mayoría de los casos, para configuraciones como esa, recibo la mayor parte de un dinero llamando a 10000 x una DL con 10000 cubos en una matriz de vértices. – rioki

Cuestiones relacionadas