は、ここに理由です:
SVGを操作するのはかなり簡単ですが、以下に示すように1つのライブDOM挿入を行うだけでも、SVGを描画するのは簡単に高価になります(this article, for example参照)。
function createSvgElement(tag, props) {
var el = document.createElementNS("http://www.w3.org/2000/svg", tag);
for (prop in props) {
el.setAttributeNS(null, prop, props[prop]);
}
return el;
}
var svg = document.getElementById('svg');
document.getElementById('input').onclick = function render() {
var start = new Date();
var fragment = document.createDocumentFragment();
for (var x = 0; x < 400; x++) {
for (var y = 0; y < 400; y++) {
var circle = createSvgElement('circle', {
'cx': x,
'cy': y,
'r': 0.2,
'fill': 'red'
});
fragment.appendChild(circle);
}
}
svg.appendChild(fragment);
var time = new Date() - start;
document.body.appendChild(document.createTextNode(time + 'ms'));
}
svg {
display: block;
}
<input id="input" type="button" value="render svg" />
<svg id="svg" width="400" height="400"></svg>
SVGとの主な問題は、関係なく、あなたがブラウザのために仕事を減らすために、あなたの側で行うどのくらい、最後に、DOMは、まだ要素の何千ものを持っていないだろうさブラウザはそれ自身でレンダリングする方法を理解しなければなりません。
キャンバスでの作業は、あなたが空想のスタイルをしたい場合は特に、あなたのために著しくより多くの仕事を意味しますが、レンダリングロジックのほとんどのブラウザを緩和する(そしてそれを自分で処理する)しているとして、それができますはるかに速くなります。
var canvas = document.getElementById('canvas');
document.getElementById('input').onclick = function render() {
var start = new Date();
var context = canvas.getContext('2d');
for (var x = 0; x < 400; x++) {
for (var y = 0; y < 400; y++) {
context.beginPath();
context.arc(x, y, 0.2, 0, 2 * Math.PI, false);
context.fillStyle = 'red';
context.fill();
context.closePath();
}
}
var time = new Date() - start;
document.body.appendChild(document.createTextNode(time + 'ms'));
}
canvas {
display: block;
}
<input id="input" type="button" value="render canvas" />
<canvas id="canvas" width="400" height="400"></canvas>
補遺:私は上記の書いたものを行うには良い方法があるかもしれないので、しかし、それは違いを説明するのに十分であろう多くの場合、キャンバスを使用しないでください。「異なる動作を」どういう
出典
2016-08-16 19:24:21
Nit
意味ですか?異なる形状/色/サイズ? –
はい。背景色とテキスト内部 – DinDan
私はあなたに答えを与えることができますが、私はあなたが配列を使用しているかを知る必要がありますか?あなたはそれを印刷するつもりですか?それとも画面に表示するだけなのですか? – Blindman67