我有两个JS Fiddles,都有10,000个雪花在移动,但使用了两种不同的方法。
第一个fiddle: http://jsfiddle.net/6eypdhjp/
使用fillRect
和4x4白色正方形,每秒提供大约60帧@ 10,000个雪花。
所以我想知道能否改进这一点,并在HTML5Rocks网站上找到了一些关于画布性能的信息。其中一个建议是将雪花预先渲染到画布上,然后使用drawImage
绘制画布。
建议在此处http://www.html5rocks.com/en/tutorials/canvas/performance/,即在标题Pre-render to an off-screen canvas下。使用Ctrl + f查找该部分。
所以我尝试了他们的建议,使用这个fiddle:http://jsfiddle.net/r973sr7c/
然而,当有10,000个雪花时,我只能得到大约3帧每秒。这非常奇怪,因为jsPerf甚至显示在使用相同方法时性能有所提升http://jsperf.com/render-vs-prerender
我用于预渲染的代码在这里:
//snowflake particles
var mp = 10000; //max particles
var particles = [];
for(var i = 0; i < mp; i++) {
var m_canvas = document.createElement('canvas');
m_canvas.width = 4;
m_canvas.height = 4;
var tmp = m_canvas.getContext("2d");
tmp.fillStyle = "rgba(255,255,255,0.8)";
tmp.fillRect(0,0,4,4);
particles.push({
x : Math.random()*canvas.width, //x-coordinate
y : Math.random()*canvas.height, //y-coordinate
r : Math.random()*4+1, //radius
d : Math.random()*mp, //density
img: m_canvas //tiny canvas
})
}
//Lets draw the flakes
function draw() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
for(var i = 0; i < particles.length; i++) {
var flake = particles[i];
ctx.drawImage(flake.img, flake.x,flake.y);
}
}
所以我想知道为什么我的帧率这么低?有没有更好的方法在屏幕上移动更多的粒子同时保持60帧每秒?
mp
的 for 循环仅在 windows.onload 时运行。这只是为了设置粒子。 - Sir