Bueno, después de mirar mi código y el tuyo me he quedado bastante mosca. Pues en mi caso, al igual que tú, sólo hago una pasada para leer y otra para escribir en el array. Por otro lado, no esperaba que la sobrecarga por intermediar con funciones supusiera un coste tan elevado de tiempo. Así que el problema debía ser justamente dentro de los ciclos de las funciones forEach y map que he implementado. He querido hacerlas con la misma lógica que sus gemelas en la clase Array. Es decir, que el callback aceptara los típicos argumentos elem, index y array donde elem en este caso se correspondería con el color rgba, index, con el offset de data, y array, con el mismo data.
Esto me ha llevado a realizar cosas tan debora recursos como estas en map:
Código Javascript
:
Ver originalvar color = new Uint8ClampedArray( 4 );
var offset = i*w+j;
// construir color
color = new Uint8ClampedArray( 4 );
for( var k = 0; k < 4; ++k )
color[k] = this.data[4*offset+k];
//pasarlo al callback
var newcolor = callback( color, offset, this.data );
// modificar el pixel en la posicion offset a newcolor
for( var k = 0; k < 4; ++k )
this.data[4*offset+k] = newcolor[k];
Por eso antes dudaba si esa era la mejor manera de manipular los Uint8ClampedArrays. Pues hubiera estado bien extraer de un plumazo los 4 bytes como un entero de 32 bits. getImageData no me ha convencido para ello. Al final he encontrado el concepto de
ArrayBufferView que me ha permitido tener una vista del buffer data como si fuera un Uint32Array. Para mi sorpresa, las operaciones con estos elementos también han resultado ser costosas.
Así que al final he optado por llegar a un compromiso entre reutilización y rapidez. Para ello, en los callbacks de forEach y map sólo he pasado el offset y el data y la rapidez a mejorado mucho. Luego he cambiado el diseño de la clase Rectangle para reducir el número de operaciones dentro de los bucles y, así, ha quedado:
http://jsfiddle.net/jefebrondem/745Ds/2/ Cita: Y ahora no sé si poner otro ejercicio, esperar mas respuestas, o esperar mas tiempo. Me lo pensaré.
Ahora que lo pienso, para no cansarnos estaría bien dosificar y, por ejemplo, hacer uno por semana. El problema de ello es que el hilo baja muy rápido y posibles nuevos participantes no lo verían. Pero esto ya depende de los moderadores.
Un saludo!