2011-09-11 6 views
1

나는 for 루프를 사용하여 16X16 간격으로 화면 너비와 높이를 반복하여 자바 스크립트, CSS 및 HTML을 사용하여 웹 화면을 그립니다. 캔버스 또는 기능의 일부 자바 스크립트 또는 자바 스크립트와 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를 빠르게 지우려면 div.innerHTML = '';을 수행하십시오. 많은 항목을 추가하는 경우 더미 div에 추가 한 다음 더미 div를 실제로 DOM에 연결된 div에 연결하십시오 (예 : document.getElement ??? functions를 사용하여 쿼리 할 수있는 항목). 초기화에서

:

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

캔버스는 더 빨라질 수 있지만 즉시 걸지는 않습니다. 결국 클래스 전환은 자바 스크립트 코드 + 캔버스가 반드시 일치하지는 않는 최신 브라우저에서 기본 렌더링 최적화를 사용합니다. 나는 빠른 벤치 마크를 할 것이다. 일반적으로 최적화는 항상 테스트를 따라야합니다. 위의 경우, 필자는 이미 이러한 요소 (예 : 요소 생성, 첨부 파일 등)를 테스트했지만 캔버스 타일 사례를 직접 테스트하지 않았습니다. – Sajid

관련 문제