【发布时间】:2014-12-24 00:54:11
【问题描述】:
我有两个 JS Fiddles,都有 10,000 片雪花在四处移动,但有两种不同的方法。
第一把小提琴:http://jsfiddle.net/6eypdhjp/
将 fillRect 与 4 x 4 白色正方形一起使用,在 10,000 个雪花下提供大约 60 帧/秒。
所以我想知道是否可以改进这一点,并在 HTML5Rocks 的网站上找到了一些关于画布性能的信息。其中一个建议是将雪花预渲染到画布上,然后使用 drawImage 绘制画布。
这里的建议是 http://www.html5rocks.com/en/tutorials/canvas/performance/,即标题为Pre-render to an off-screen canvas。使用 ctrl+f 找到该部分。
所以我用这个小提琴尝试了他们的建议: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 帧?
【问题讨论】:
-
我可能是错的,但是创建 1000 个
canvas元素对我来说并不合适。document.createElement('canvas')应该运行 1000 次吗? -
@JamesTaylor 好吧,这就是我解释 html5Rock 示例的方式。我可能会误解?
-
如果你汇集并创建了 15 种粒子,然后只使用 15 个画布进行预渲染,这是有道理的 - 否则,不要预渲染
-
@topheman 所以预渲染只在某些情况下?
-
不,但在 html5rocks 示例中,他们在画布上预渲染了 1 张图像,然后重复使用该相同的图像作为指针来创建他们的场景。你应该做同样的事情(我怀疑你需要 10 000 种粒子,如果只有半径在 1 和 4 之间变化)你的例子的陷阱是你随机改变颜色,所以很难统一粒子
标签: javascript html canvas