2011-10-21 5 views
8

Abrí este matrix multiplication benchmarks y mi navegador (Firefox 7.0.1) se congeló hasta que terminaron los puntos de referencia (abrí la página en un viejo Asus EeePC 1000H).Uso de WebGL desde dentro de un trabajador web: ¿es posible? ¿Cómo?

Escuché que los trabajadores de la web se inventaron para separar el procesamiento de la visualización de las páginas web. ¿Es posible utilizar Web Workers API para que WebGL no bloquee todo el navegador web?

+0

En otras noticias de ese punto de referencia es antiguo (utiliza versiones antiguas de las distintas bibliotecas de la matriz), mal y no válido (no se molestó en comprobar si las funciones que se llaman fueron en realidad el cálculo de las mismas cosas). Aquí hay uno que no está roto http://stepheneb.github.com/webgl-matrix-benchmarks/matrix_benchmark.html – gman

+1

Aún no. Pero solo busque WebGL en WebWorker y verá que está en proceso. – abergmeier

Respuesta

22

En aras de la claridad: el punto de referencia al que se vinculó no utiliza WebGL en absoluto. (Debería saberlo, lo escribí). Y en el caso de ese punto de referencia en particular, absolutamente podría ejecutarlo en un Trabajador web ahora y estaría perfectamente bien.

(Dato curioso - Web trabajadores no apoyaron TypedArrays cuando el punto de referencia fue construido, y ya que la mayoría de las bibliotecas de la matriz se basan en que no era práctico para ejecutarlo en un trabajador en ese momento que ya se ha solucionado..)

De todos modos, para responder a su pregunta original: No, WebGL no se puede ejecutar en un trabajador. El principal bloqueador de esto es que para obtener un contexto WebGL debe llamar al getContext en un elemento canvas. Los Trabajadores Web explícitamente no permiten el acceso a DOM (¡lo cual es bueno, por cierto!) Y como tal, nunca podrás acceder a WebGL de un trabajador.

Pero eso no es tan malo como se podría pensar. Por un lado, considere que la mayoría de todas las representaciones 3D en realidad están sucediendo en un hilo diferente de todos modos. Específicamente, un conjunto completo de subprocesos que se ejecutan en su GPU. La única parte que tiene el navegador es decirle a su controlador de gráficos "¡Hey! ¡Comience a renderizar algunos triángulos usando esta información!" y luego se mueve sin esperar a que los triángulos realmente sean renderizados. Como tal, aunque los comandos de dibujo se deben ejecutar desde el proceso principal, el tiempo que pasa bloqueando ese proceso es (por lo general) muy poco.

Por supuesto, eso no es lo que va a consumir mucho de su tiempo si estuviera programando un juego en tiempo real. Tienes animaciones, física, inteligencia artificial, detección de colisión, detección de caminos ... hay muchas tareas no gráficas involucradas que comerán tu CPU con vida si las permites. En algunos casos (animación), usualmente son solo gilipollas de matemática matricial, ¡justo como el punto de referencia al que se vincula! Afortunadamente para nosotros, sin embargo, ese tipo de procesamiento PUEDE hacerse en un trabajador, y todo lo que necesitamos comunicar al hilo principal son los datos necesarios para representar la escena.

Sí, esto presenta algunos desafíos en términos de sincronización y transferencia de datos, pero en general será mucho más preferible bloquear su navegador mientras tratamos de simular esas 500 cajas colisionando.

+0

Oh ... Dado que esos scripts se llaman glMatrix y CanvasMatrix, asumí que aprovecharon WebGL para multiplicar matrices ... –

2

De manera predeterminada, no puede usar WebGL en un trabajador web como explicó Toji.

Puede consultar WebGLWorker que es una biblioteca que le permite hacer cosas WebGL en un Trabajador Web, al transmitir de forma transparente comandos al hilo principal. Aquí hay una buena blog post que explica cómo funciona.

Cuestiones relacionadas