2013-04-13 12 views
20

rectlineなどの単純なオブジェクトを配置する場合は、transform属性またはx属性とy属性を使用する必要がありますか?in svg:translate vs position xとy

// this 
d3.selectAll('rect') 
    .attr('x', Number) 
    .attr('y', 0) 

// or this? 
d3.selectAll('rect') 
    .attr("transform", function(d) { return 'translate(' + d + ', 0)' }); 

パフォーマンスの違いは何ですか?

+0

個別に各要素を動かすよりも少ない処理集中的になり、それは、ブラウザを強制的に変換することと言われていますものをレンダリングするためにgpuを使用する。私はtransform3dを使用して、アンドロイドブラウザの目立つ違いを観察しました。しかし、他の人とのパフォーマンスは同じでした。 –

+3

@ParthikGosar SVGで 'transform3d'要素を使うことはできません。 – Duopixel

答えて

17

SVG transformでは、ハードウェアアクセラレーションされていません。彼らは(私の経験では)単一の要素についてほぼ同じ性能を持っています。 SVGでないすべての要素がxまたはy属性を持つ、考える...

<line x1="0" y1="0" x2="100" y2="100" /> 
<circle cx="100" cy="100" r="100" /> 
<path d="M 0 0 L 100 100" /> 
<rect x="0" y="0" width="100" height="100" /> 

ので、あなたが使用していない場合は、私の周りのものを移動するtransform以上を使用しますが、これらの要素ごとに異なる実装を記述する必要がありますtransform。あなたが持っている場合transformは確かに高速である一つの領域は、多数の素子を移動さ...

<g transform="translate(100, 100)"> 
    <line x1="0" y1="0" x2="100" y2="100" /> 
    <circle cx="100" cy="100" r="100" /> 
    <path d="M 0 0 L 100 100" /> 
    <rect x="0" y="0" width="100" height="100" /> 
</g> 

それは

+1

私は物事を動かすために 'トランスフォーム 'を使うことを勧めます。別の小さなことは、2つの属性を1つの属性に変更することです。私はsvgの変換に関連する特定のものを最適化する少なくとも1つの実装について知っています。 –

+0

css transformを使用すると、ゲインがフェッチされるのか、それとも同じですか?私はすべてのマウスホイールのマウスポイントをズームして、ビューポート全体を再ペイントするアプリケーションを持っています。私はハードウェアアクセラレーションでいくつかの利点を得ることができるかどうかを見ていますが、 – themanwhosoldtheworld