Tengo una aplicación multiproceso, en la que yo estoy tratando de representar con diferentes hilos. Primero traté de usar el mismo Contexto de Representación entre todos los hilos, pero yo estaba NULL actuales contextos de otros hilos. He leído en internet que en un contexto sólo puede ser de corriente en un hilo a la vez.

Así que he decidido hacer algo diferente. Puedo crear una ventana, me da la HDC de ella y crear la primera RC. Después de eso, comparto este HDC entre los hilos, y en cada nuevo hilo, creo yo obtener una nueva RC de la misma HDC y yo la hago de la corriente para que el hilo. Cada vez que lo hago, el RC devuelto siempre es diferente (generalmente el valor anterior + 1). Puedo hacer una afirmación para comprobar si wglGetCurrentContext() devuelve un RC, y parece que vuelve a la que fue creado. Pero después de hacer la representación, no tengo de representación y si me llaman GetLastError() puedo obtener el error 6 (identificador no válido??)

Así que, ¿significa esto que, a pesar de que cada nueva llamada de wglCreateContext() me da un nuevo valor, de alguna manera, esto significa que todos estos diferentes valores son el mismo «canal de la Conexión» a las llamadas a OpenGL?

¿Significa esto que voy a tener siempre para no válido el anterior Contexto de Representación en un hilo, y que se active en el nuevo? Realmente tengo que hacer esta sincronización de todo el tiempo o hay alguna otra manera de trabajar alrededor de este problema?

busqué en google de 2 páginas que podrían ayudar: higherorderfun.com/blog/2011/05/26/… y opengl.org/discussion_boards/showthread.php/…
bueno, yo estoy haciendo algo muy similar a eso, pero me estoy poniendo las 6 de Error después de la llamada wglShareLists
Creo que la pregunta debería leer también como «Desde multiproceso DirectX 11 representación es más rápido que el de un único hilo, puede que el controlador de traer las mismas mejoras de llamadas a OpenGL así ?»

OriginalEl autor filipehd | 2012-06-19

4 Comentarios

  1. 46

    Tengo una aplicación multiproceso, en la que yo estoy tratando de representar con diferentes hilos.

    NO!!!

    Usted ganará nada tratando de multithread de su procesador. Básicamente, usted está corriendo en una gran condición de carrera y el conductor acaba de ser ocupado la sincronización de los hilos para hacer de alguna manera el sentido de la misma.

    Para obtener el mejor rendimiento de la representación de mantener todos OpenGL operaciones de un solo subproceso. Todos paralelización sucede de forma gratuita en el GPU.

    Ok yo no me expreso correctamente. No significa que será a la vez la representación en la pantalla. En realidad no. Un hilo se basa en el backbuffer, y copia su contenido a una textura. El otro simplemente «Volcados» la Textura en la pantalla. Esto significa que el subproceso de trabajo puede representar en el backbuffer otras cosas complejas.
    «Un hilo se basa en el backbuffer, y copia su contenido a una textura. El otro simplemente «Volcados» la Textura en la pantalla». Whyy? ¿No debería ser simplemente el intercambio de la parte trasera y delantera búferes cuando quieres presentar?
    Incluso entonces, el uso de múltiples hilos no tiene sentido. El «blitter» hilo tendría que esperar a que el «renderer» hilo para finalizar. El punto entero de multithreading es mantener las cosas funcionando simultanously; los que no.
    Aunque ustedes son de la derecha, que no responde a mi pregunta de por qué hago 6 de error después de hacer wglShareLists(). Aún así, esto significa que para hacer lo que quiero necesito auxiliar búferes como los explotadores de empresas alimentarias o PBuffer?
    Bien, compartir (es decir, con el contexto de estar activo en varios hilos al mismo tiempo) un contexto que no es posible, pero pasando a lo del hilo de rosca es posible. Sin embargo: Usted debe evitar la re-creación de hilos y contextos todo el tiempo. Crear un grupo de subprocesos exactamente una vez y se adhieren a ella. Mismo para los contextos, aunque me desaconseja el uso de múltiples contextos a lo largo de varios hilo. Tiene uno dedicado OpenGL hilo, las cosas se ponen mucho más fácil, y también más eficiente de esa manera.

    OriginalEl autor datenwolf

  2. 14

    Sugiero leer el siguiente artículo de wiki de la OpenGL Consorcio.

    http://www.opengl.org/wiki/OpenGL_and_multithreading

    En palabras simples, depende mucho de lo que significa para multi threading, en lo que respecta a OpenGl, si usted tiene un subproceso que realiza la prestación parte, y uno (o más) haciendo otros trabajos (es decir, la IA, la Física, la lógica del juego, etc) es perfectamente correcto.

    Si usted desea tener varios hilos de cachondeo con OpenGL, no se puede, o mejor, se puede, pero lo que realmente le dará más problemas que ventajas.

    Intente leer el siguiente FAQ en paralelo OpenGL uso para tener una mejor idea sobre este concepto:

    http://www.equalizergraphics.com/documentation/parallelOpenGLFAQ.html

    pero esa es exactamente la idea de mi aplicación Diferentes hilos cuidar de una lógica diferente – Lo que no puedo entender es por qué recibo el 6 de error después de llamar a wglShareLists. Tal vez estoy llamando a esta función demasiado tarde? Voy a tratar de usar la idea escrita en el primer enlace que me dio para comprobar cómo funciona.
    Diferente de la lógica de los medios, de los diferentes subsistemas. Un subproceso para la red, una para la entrada del usuario, uno para todo OpenGL, etc. Realmente, no trate de propagación de gráficos de salida a través de varios subprocesos. Es un lío enorme. También la «fusión» de la operación (el dibujo de una textura quad), que la totalidad de la sobrecarga de cambiar a otro hilo hará que más tiempo consume, que la «fusión». También la GPU es un recurso exclusivo, no puede tener varios hilos de utilizar la GPU en el mismo momento, por lo que el blitter hilo tendría que esperar para cualquier otra operación en la GPU para terminar de todos modos.
    Este es de hecho el caso. ¿Por qué habrían de multithread de la representación de los comandos de todos modos? La paralelización sucede en la GPU, que tiene un gran lote de primitivas geométricas, procesos en paralelo (vertex shader), determina la cubierta de fragmentos y los procesos de los fragmentos en paralelo (fragment shader).
    Ahora piensa en lo que pasaría si en realidad envió dos lotes de primitivas geométricas para la GPU en paralelo: Se terminaría en una condición de carrera, debido a que ambos (muy probable) toque los mismos fragmentos. Esta es una condición de carrera que sólo puede ser resuelto mediante la sincronización de los dos lotes, que puestos de venta la canalización de procesamiento, por lo tanto, causando un grave impacto en el rendimiento.
    También todos motor de juego en existencia hará todo lo posible, para mantener todo el renderizador de operaciones no sólo en un hilo, pero también en el mismo núcleo de la CPU. Haciendo todo en un solo hilo es para evitar errores en el driver (no sé de ningún controlador de OpenGL en todo, que no tiene algún tipo de problemas de subprocesamiento múltiple; sólo recientemente NVidia había algunos). Y para mantener las cosas en un núcleo es mejorar la caché de la localidad.

    OriginalEl autor Maurizio Benedetti

  3. 5

    En algunos casos, puede tener sentido para el uso de varios de representación de los contextos en los diferentes hilos. He utilizado este tipo de diseño para cargar los datos de la imagen de sistema de archivos y el empuje de los datos en una textura.

    Sería mejor para cargar las texturas (todos los no-OpenGL cosas) en otro hilo y, a continuación, actualizar la textura en el hilo que posee en el contexto.
    ¿Crees contexto compartir ralentiza el GL conductor? La actualización de texturas es una de las funciones que consumen la mayoría del tiempo, por lo que en mi humilde opinión haciendo en este hilo separado ahorra un montón de tiempo en el hilo principal. Por supuesto que sólo es válido para los datos que no se necesitan de inmediato.
    También he aplicado la textura de la transmisión de una vez. Contexto compartir es realmente malo si utiliza el contexto de varios hilos al mismo tiempo. Pero yo no soy lo rápido que es cuando se puede garantizar que NUNCA se utilicen. No creo que sería lento. Pero si funciona, entonces funciona. Btw: Si usted necesita asincrónica textura de la carga, utilice PBOs.
    «Pero no estoy SEGURO* ¿cómo de rápido es» no ver ese error…
    Estoy de acuerdo, cuando se trata de que en diferentes plataformas, el rendimiento no fue bueno en todos ellos. También estoy de acuerdo con que es sólo adecuado para los datos que se prefetched en segundo plano y no se utiliza en activo subproceso de representación.

    OriginalEl autor JoR

  4. 0

    OpenGL en Mac OS X es de un solo hilo de seguro; para habilitarlo:

    #include <OpenGL/OpenGL.h>
    
    CGLError err = 0;
    CGLContextObj ctx = CGLGetCurrentContext();
    
    //Enable the multi-threading
    err =  CGLEnable( ctx, kCGLCEMPEngine);
    
    if (err != kCGLNoError ) {
         //Multi-threaded execution is possibly not available
         //Insert your code to take appropriate action
    }

    Ver:
    La simultaneidad y OpenGL – Desarrollador de Apple

    Y:
    Técnica de la P&UN QA1612: OpenGL ES multihilo y …

    ¿Por qué el voto?
    La pregunta es acerca de Windows. No aparece en las etiquetas, pero HDC y GetLastError haga evidente.
    Si eres un Windows persona… yo no soy… Además OS extensiones específicas, a menudo, no OS GL específicos de liberación.

    OriginalEl autor geowar

Dejar respuesta

Please enter your comment!
Please enter your name here