En MacOS X, puede representar OpenGL en cualquier objeto NSView
de su elección, simplemente creando un NSOpenGLContext
y llamando al -setView:
. Sin embargo, solo puede asociar una vista con un solo contexto de OpenGL en cualquier momento. Mi pregunta es, si quiero rendir OpenGL a dos puntos de vista diferentes dentro de una sola ventana (o posiblemente dentro de dos ventanas diferentes), tengo dos opciones:Cambiar los contextos de OpenGL o cambiar el destino de procesamiento de contexto en su lugar, ¿qué es preferible?
Crear un contexto y siempre cambiar la vista, llamando
setView
según corresponda, cada vez que quiera mostrar a la otra vista. Esto incluso funcionará si las vistas están dentro de diferentes ventanas o en diferentes pantallas.Crea dos objetos
NSOpenGLContext
y asocia una vista con una de ellas. Estos dos contextos podrían compartirse, lo que significa que la mayoría de los recursos (como texturas, búferes, etc.) estarán disponibles en ambas vistas sin desperdiciar el doble de memoria. En ese caso, sin embargo, tengo que seguir cambiando el contexto actual cada vez que quiero renderizar en la otra vista, llamando al-makeCurrentContext
en el contexto correcto antes de realizar cualquier llamada OpenGL.
he utilizado, de hecho, cualquiera de las opciones en el pasado, cada uno de ellos trabajaron bien para mis necesidades, sin embargo, me preguntaba, ¿qué camino es mejor en términos de rendimiento, compatibilidad, y así sucesivamente. Leí que el cambio de contexto es realmente terriblemente lento, o al menos solía ser muy lento en el pasado, podría haber cambiado mientras tanto. Puede depender de cuántos datos se asocian con un contexto (por ejemplo, recursos), ya que al cambiar el contexto activo se pueden transferir datos entre la memoria del sistema y la memoria de la GPU.
Por otro lado, la conmutación de la vista también puede ser muy lenta, especialmente si esto puede hacer que cambie el renderizador subyacente; p.ej. si sus dos vistas son parte de dos ventanas diferentes ubicadas en dos pantallas diferentes que son manejadas por dos adaptadores gráficos diferentes. Incluso si el renderizador no cambia, no tengo idea de si el sistema realiza una gran cantidad de instalación/limpieza de OpenGL caros al cambiar una vista, como crear/destruir objetos render-/ framebuffer, por ejemplo.
Los 50 ms, ¿se refieren a la conmutación de GLContext o a la conmutación de destino? Y si se refieren al primero, ¿se compartieron o dejaron de compartir los contextos? – Mecki
Los contextos fueron compartidos (obligatorios), la sobrecarga fue más o menos estable y provino de hacer diferentes pares de ventanas y renderizar contextos actuales, independientemente de cuál sea el cambio. Esta medición no puede ser una verdad general, ya que no midí la sobrecarga de conmutación sin datos compartidos o sin llamadas pendientes. Es posible que pueda medir las diferencias para ambos enfoques en su caso específico (con o sin sorteo). – Sam
Bueno, traté de comparar la sobrecarga de conmutación de contexto mediante un punto de referencia sintáctico, utilizando contextos no compartidos con solo un recurso (una textura muy grande) en cada uno de ellos y sin llamadas de dibujo pendientes. El resultado fue que aproximadamente 50,000 conmutaciones de contexto por segundo son posibles. Esto suena muy bien, pero debe tomarse con un grano de sal, ya que, sinceramente, ¿cuán realista es este punto de referencia? ¿Qué aplicación tendría esos pequeños recursos o nunca hay llamadas de dibujo pendientes? Entonces su número es probablemente mucho mejor que el mío, al menos más realista. – Mecki