2011-09-11 21 views
1

私はjavascript、CSS、HTMLを使って画面を描画しています。forループを使用して画面幅と高さを16X16の間隔で繰り返します。キャンバスや機能のいくつかのJavaScriptやJavaScriptとCSSのブレンドのいずれかを使用して画面にすべてのこれらのタイルを描画するためのより高速な方法はありHTML5で描画する最も速い方法は何ですか

{ 
     div = document.getElementById('mainView'); 
     while (div.children.length > 0) 
      div.removeChild(div.children[0]); 

     for (y = this.y; y < this.y + this.height; ++y) 
     { 
      for (x = this.x; x < this.x + this.width; ++x) 
      { 
       toAppend = document.createElement('div'); 
       viewCoords = this.convertWorldToView(x, y); 
       toAppend.style.top = viewCoords[1] * 16 + 'px'; 
       toAppend.style.left = viewCoords[0] * 16 + 'px'; 
       mainViewDiv.appendChild(toAppend); 
       if (fullMap[y][x] == TILE_WATER) 
       { 
        startTile = Math.round(Math.random() * 3) + 1; 
        toAppend.className = "Water" + startTile + "Tile"; 
       } 
       else 
       { 
        toAppend.className = typeClassDecoder[fullMap[y][x]]; 
       } 
      } 
     } 
    } 

:ここに私のループは、現在のように見える何ですか?

+0

を私はそれを正しく取得する場合は、そのすべての内容を削除した後にタイル張りのやり方でdivを追加しています。 –

+0

完全なコードとマークアップ/ CSSなしで何が起こっているのか理解することは難しいです。私はあなたのコードをjsfiddle(http://jsfiddle.net/)に入れ、リンクを提供することをお勧めします。 –

+0

jsfiddleでの同様のクエストの例:http://jsfiddle.net/robhawkes/cV3Rr/ –

答えて

3

このようにして、過剰な量のリフロー/レイアウトイベントを作成しています。すべてのアイテムを削除してから再度追加します(どちらも費用がかかります)。すべてのアイテムを一度追加するだけです。常に同じ順序になっているため、既存のアイテムを更新してください。

また、divをすばやくクリアするには、div.innerHTML = '';を実行します。多くのアイテムを追加する場合は、それらをダミーdivに追加してから、ダミーdivを実際にDOMに接続されたdivに追加します(たとえば、document.getElement ??? functionsを使用してクエリを実行することができます)。 INITで

div = document.getElementById('mainView'); 
for (y = this.y; y < this.y + this.height; ++y) 
{ 
    for (x = this.x; x < this.x + this.width; ++x) 
    { 
     toAppend = document.createElement('div'); 
     viewCoords = this.convertWorldToView(x, y); 
     toAppend.style.top = viewCoords[1] * 16 + 'px'; 
     toAppend.style.left = viewCoords[0] * 16 + 'px'; 
     mainViewDiv.appendChild(toAppend); 
    } 
} 

では、レンダリング:

div = document.getElementById('mainView'); 
var i = 0; 

for (y = this.y; y < this.y + this.height; ++y) 
{ 
    for (x = this.x; x < this.x + this.width; ++x) 
    { 
     toAppend = div.children[i++]; 
     if (fullMap[y][x] == TILE_WATER) 
     { 
      startTile = Math.round(Math.random() * 3) + 1; 
      toAppend.className = "Water" + startTile + "Tile"; 
     } 
     else 
     { 
      toAppend.className = typeClassDecoder[fullMap[y][x]]; 
     } 
    } 
} 
+0

スピードを上げてくれてありがとう、ありがとう。あなたはキャンバスを使う方が速いと思いますか?それとももっと速くなるようなタイルを描く方法は他にありますか? – vternal3

+0

キャンバスは速くすることができますが、私はすぐにそれに賭けることはありません。結局のところ、クラスの切り替えは、javascriptコード+キャンバスが必ずしも一致しない最新のブラウザでは、ネイティブレンダリングの最適化を使用します。私はいくつかの簡単なベンチマークを行います。原則として、最適化は常にテストに従うべきです。上記のケースでは、私はすでにこれらのケース(要素の作成、添付ファイルなど)をテストしていましたが、私はキャンバスのタイルケースを自分でテストしていません。 – Sajid