2010-10-08 21 views
5

In un semplice test su tela creato per scopi di misurazione delle prestazioni e della qualità, un canvas è dipinto con colori e immagini casuali durante un periodo illimitato.Tela HTML5: lo stesso codice genera risultati diversi in browser diversi

Un campione è mostrato qui: http://litterific.com/minisite/

Attenzione: aperto solo questo a Opera o Chrome, lo script è piuttosto pesante in grado di riagganciare su computer lenti, non lasciare lo script in esecuzione, mentre si stanno prendendo il caffè;)) È solo un prototipo approssimativo e non l'ha ottimizzato.

Quello che ho notato è che i risultati come dipinto dallo script (js/asset.js) sono diversi in vari browser. Soprattutto in Opera c'è molto di più "verde" nel dipinto che in Chrome

alt text

codice si trova qui: http://litterific.com/minisite/js/asset.js

La mia domanda è:

Come questo è causato . Semi casuali diversi? Arrotondamenti diversi o comportamento di colore diverso in Opera?

Nota: è esattamente lo stesso script in entrambi i browser, quindi potresti dargli un'occhiata sia in Chrome che in Opera.

+0

La prima cosa che vorrei provare è utilizzare un generatore di numeri casuali alternativo per il quale è possibile fornire un seme o semplicemente utilizzare la stessa matrice di numeri pre-generata, in modo che entrambi i browser ottengano lo stesso input. – RoToRa

+0

Ho provato questo in Firefox 3.6. La performance non è * too * bad - balbetta un po '(sto indovinando la garbage collection), ma ci sono risultati, ed è piuttosto rossastro, con un po' di nero, come Chrome. http://dl.dropbox.com/u/1722364/Screenshot-3.png –

risposta

6

Non è numeri casuali che causano i problemi, è dati dei pixel "divertenti". Ecco la modifica:

for (i = 0, n = pixels.data.length; i < n; i += 4){ 
    pixels.data[i + 0] = Math.max(0, Math.min(255, Math.floor(r * f))); 
    pixels.data[i + 1] = Math.max(0, Math.min(255, Math.floor(g * f))); 
    pixels.data[i + 2] = 0; 
    pixels.data[i + 3] = pixels.data[i + 3]; 
} 

Se si assicura che i valori dei pixel siano numeri interi nell'intervallo corretto, Opera funziona correttamente.

Oh anche, e questo è probabilmente ovvio, va molto più veloce se si sollevano quelle moltiplicazioni fuori dal giro.

+0

Sospettavo qualcosa del genere. ciò significa che tutti i valori sopra 255 in pixels.data [0] sono messi in pixels.data [1] (e moltiplicati per 255)? quindi {pixels.data [0] = 300} sarebbe uguale a {pixel.data [0] = 255, pixels.data [1] = 45}? Questo ha senso dal momento che Javascript non conosce i tipi numerici tra 0 e 255 ma solo "interi". (nel caso dell'opera che rende l'array abbastanza inutile, dal momento che in Opera solo il primo pixeldata deve essere riempito, un po 'come i colori in C# o PHP.) ma è un po' "risolto" in Chrome. Ho anche scaricato questa domanda all'Opera, forse è una sorta di problema incompiuto. –

+0

Non sono sicuro di cosa succede; potresti avere ragione che il valore "si rovescia" in altre celle di colore, ma è difficile dire esattamente. (Suppongo che tu possa capirlo con la sperimentazione.) – Pointy

+0

sì, hai ragione, si occuperà di questo. grazie comunque per i tuoi sforzi, molto apprezzato. L'ho provato un po 'e hai confermato il mio sospetto. La taglia si applicherà tra 17 ore a partire da ora;) –

1

Come hai indovinato, Math.random inizia con un seme diverso in ciascun caso. Purtroppo non c'è modo di fornire un seed fisso alla funzione Math.random. Se hai davvero bisogno di questo, dovrai trovarne uno o implementarlo da solo.

Ho notato che diverse implementazioni di canvas variano leggermente quando si disegnano oggetti parzialmente opachi, ma si tratta di un problema minore rispetto alle sequenze casuali differenti!

Btw, lo script fa produrre bel uscita cercando :)

+0

Ho provato con numeri semplici ... producendo ancora l'output in modo diverso, anche in un loop. –

+0

Grazie per il test comunque;) –

Problemi correlati