ランダム ノイズを含むキャンバスを生成しようとしましたが、60 fps でランダム ピクセルのキャンバス全体を生成する余裕がなかったため、最終的にメモリ内の一時キャンバスを使用して小さな 64x64 タイルを生成し、コンテキスト フィルを使用しました。パターンを繰り返し、javascript エンジンを使用する代わりに、ブラウザーがそれらのバイトを画面にプッシュできるようにします。
それははるかに高速で、フルスクリーンでも iOS デバイスで 60 fps を確保できましたが、数分後には fps が低下し、非常に遅くなることに気付きました。
このフィドルでは、60Hz に制限する必要がある requestAnimationFrame を使用していません。代わりにカスタム ループを使用しています。Macbook では、500Hz 前後で開始し、問題を強調するために急速に減速します。
http://jsfiddle.net/Victornpb/m42NT/2/
function loop(){
drawNoise();
}
function drawNoise(){
var context = canvas.getContext("2d");
var pattern = context.createPattern(generatePattern(), "repeat");
context.rect(0,0, canvas.width, canvas.height);
context.fillStyle = pattern;
context.fill()
}
//create a on memory canvas to generate a tile with 64x64 pixels of noise and return it
function generatePattern(){
var canvas = document.createElement("canvas");
canvas.width = 64;
canvas.height = 64;
var context = canvas.getContext("2d");
var image = context.getImageData(0, 0, canvas.width, canvas.height);
var imageData = image.data; // here we detach the pixels array from DOM
var p;
var pixels = canvas.width*canvas.height;
while(pixels--){
p = pixels*4;
imageData[p+0] = Math.random() >= 0.5 ? 255 : 0; // Red
imageData[p+1] = Math.random() >= 0.5 ? 255 : 0; // Green
imageData[p+2] = Math.random() >= 0.5 ? 255 : 0; // Blue
imageData[p+3] = 255; // Alpha
}
image.data = imageData;
context.putImageData(image, 0, 0);
return canvas;
}