2016-08-16 5 views
1

に非常に大きな行列を構築することができます私はキャンバス/ SVGで10000X10000のマトリックスを構築する必要があります。各セルで私は四角形を作成する必要があります。私はそのような2つのループにキャンバスでそれを実行しようとしました:はどのように私はSVG

for(i=0; i<10000; i++){ 
 
    for(j=0;j<10000; j++){ 
 
    /*some code of drwing*/ 
 
    console.log(i,',',j); 
 
    } 
 
}

しかし、このループは、多くの時間がかかります。どのようにして大きなマトリックスを良いパフォーマンスで描くことができますか?あなたが最も可能性の高い最高のキャンバスを使用して、図面をやってオフにしている (私は行列内のすべてのセルが、私は、データベースから取得したオブジェクトのマトリックスに応じて異なる動作をすることを必要とする)

おかげ

+1

意味ですか?異なる形状/色/サイズ? –

+0

はい。背景色とテキスト内部 – DinDan

+0

私はあなたに答えを与えることができますが、私はあなたが配列を使用しているかを知る必要がありますか?あなたはそれを印刷するつもりですか?それとも画面に表示するだけなのですか? – Blindman67

答えて

1

は、ここに理由です:

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>

補遺:私は上記の書いたものを行うには良い方法があるかもしれないので、しかし、それは違いを説明するのに十分であろう多くの場合、キャンバスを使用しないでください。「異なる動作を」どういう

+0

Opは1億個のアイテムをレイアウトして描画するよう求めています。これはどの家庭のPCの範囲をも超えているので、あなたの答えはまったく参考になるとは言えません。解決策は、ディスプレイ媒体が何であるかに依存しています。 – Blindman67

+0

@ Blindman67質問に 'html5'と' canvas'というタグが付いているとすれば、意図した媒体が画面であることは明らかです。ビューにトリミングされたアイテムだけを描画し、そのオブジェクトの量を視覚化することは、それを正しく行うと問題になることはありません。この答えは正確にその問題に対処し、正しい方法で対応します。説明されたシナリオでは、SVG上でキャンバスを使用することで、パフォーマンスが大幅に向上します。 – Nit

+0

質問にはSVGが含まれているため、これは画面に対してのみ意図されているという推論は与えられていません。私はあなたの答えをもう一度読んできましたが、あなたはビジュアルパーツのレンダリングだけを意図していることを明確に示していませんし、ビジュアルセクションを効果的に見つけてレンダリングする方法も示していません。あなたの答えの必要性はすべて、そのようなことが問題の答えであることを意味すると思っています(実際には内容が表示専用である場合) – Blindman67