我试图生成一个带有随机噪声的画布,但我无法以 60fps 生成整个随机像素画布,所以我最终使用内存中的一个临时画布来生成一个小的 64x64 平铺,然后使用上下文填充重复该模式,并让浏览器将这些字节推送到屏幕上,而不是使用 javascript 引擎。
它要快得多,即使在全屏下,我也可以在 iOS 设备上获得稳定的 60fps,但我注意到几分钟后 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;
}