你做的很漂亮!
嗯,所以有很多因素会导致性能不如您想要的那么出色。
- 可绘制区域的大小
<svg />
很重要(即: or<canvas />
元素)。区域越大,要渲染的像素就越多。
- 添加到 DOM 的元素数量。是的,有 100 个点,但每个点都由许多元素组成。
- 在这些元素中,元素在任何给定帧上的变化量。
- 最后,改变多少操作的元素(即:
opacity
、、、scale
等translation
)
这些考虑因素在大多数计算机生成的图像中复合,以影响实时渲染。目标基本上是减少任何一个维度的负载,看看它是否足以为您提供您正在寻找的性能。你必须要有创意,但有很多选择。以下是我想到的一些事情,你可以做一些事情来加快速度:
- 减少形状的数量会使其运行得更快^^
- 对于这样的事情
Two.Types.canvas
可能是最快的。
- 不是移动每个点,而是将它们
translation
分成 2 或 3 组,然后根据容器组移动它们。有点像前景和背景视差。
- 如果您坚持
Two.Types.svg
尝试在任何给定帧上只为少数几个点设置动画。这样,您就不会在每一帧都对整个场景进行整个遍历,并且每个点也不会在每一帧都设置动画。
伪代码可能如下所示:
// ... some array : dots inferred ... //
var now = Date.now();
var index, length = 12;
two.bind('update', function() {
for (var i = index; i < Math.min(index + 12, dots.length); i++) {
var dot = dots[i];
dot.scale = (Math.sin(now / 100) + 1) / 4 + 0.75;
}
index = (index + 12) % dots.length;
});
- 如果这些都没有给你任何你正在寻找的实质性东西,那么我强烈建议将每一个都
Dot
变成纹理并直接通过canvas2d
或使用WebGL
库来绘制这些纹理。Three.js将能够渲染数十万个:http ://threejs.org/examples/#webgl_particles_sprites您将不得不重新考虑很多纹理本身是如何生成的,以及线条之间的不透明度如何变化和当然,它看起来会与您在问题中描述的略有不同。位图与矢量不同>_<
希望这可以帮助!