2013-05-19 4 views
4

내 응용 프로그램에서 LINE_STRIP 플래그를 사용하여 WebGL의 drawarrays에 대한 단일 호출로 약 800 만 개의 정점을 그립니다. 실제로 하나의 긴 선을 원하지는 않습니다. 약 200k 개의 짧은 선이 필요합니다. 따라서 모든 짧은 선을 여분의 꼭지점으로 채우고 정점 셰이더에게 선 뚜껑을 음수 z로 "밀어 넣고"보이지 않는 다리를 만듭니다. 렌더링은 준 정적입니다 (사용자가 다시 렌더링을 트리거하는 여러 가지를 클릭 할 수 있으므로) 초고속 일 필요는 없지만 근대 컴퓨터에서는 200ms 미만이 걸릴 것으로 기대했습니다. 내 노트북에왜 WebGL 렌더링 속도가 일치하지 않습니까?

[UPDATE : Win7에가 GPU에 대한 자사의 CPU와 같은 몇 인텔 i7s과 통합 된 HD 그래픽 4000을 사용하여 실행] 나는 선한, 크롬에서 약 100ms로 얻을. 이상하게도 Firefox는 1-2 초 정도 걸립니다. 내 삼성 Chromebook 550에서는 600ms에서 2 초가 지나면 빨리 시작한 다음 렌더링이 느려지지만 속도가 빨라질 수도 있습니다.

질문 : 내 크롬 북에 렌더링 속도의 변화를 일으키는 원인이 될 수 무엇

  • ?
  • Firefox가 내 노트북의 Chrome보다 속도가 훨씬 느린 이유는 무엇입니까?
  • 지출 속도가 빨라지므로 가치가 있습니까? (즉, 많은 개선이 기대 되나요?) 어떤 팁?

주 : 크롬 북

  • 가 테스트 렌더링 반복 렌더링간에 일어나는 유일한 (텍스처로 구현)를 균일 한 컬러 팔레트 사이를 전환하도록 변경된다. Chrome 개발자 도구는 테스트 중에 페이지의 메모리 사용량에 큰 변화가 없다고 생각하는 것 같습니다.

  • 나는 렌더링이 얼마나 오래 걸리는지 확인하기 위해 gl.finish와 console.time을 사용하고 있습니다. 디버깅시 제외

  • , 나는 고아 캔버스에 렌더링하고 페이지 UPDATE에 다양한 작은 캔버스에 결과의 섹션을 복사의 drawImage을 사용하여 (첫 번째 인수로 WebGL을 캔버스로). 이것은 아마도 약간의 시간이 걸릴 것입니다. 그러나 위에서보고 된 수치는 복사 작업의 유무에 관계없이 그리고 페이지 본문에 첨부 된 webgl 캔버스가 있는지 여부에 따라 많이 달라지지 않는 것 같습니다.

  • UPDATE :이 내 노트북이 한 번에 렌더링 얼마나 많은 정점에 한계가 있지만, 한계가 당신이 그때는 아무것도 렌더링하지 않는 제한을 초과하는 경우, 시시각각 변동하는 것 같다. 이 숫자는 8 백만 표 정도이지만 때로는 11 백만 건 이상을 기쁘게 생각합니다. 한 번에 2 백만 개를 배치했습니다. 흥미롭게도 Chromebook의 속도가 빨라지는 것 같지만 일관성이 없어서 확신 할 수 없습니다.

  • 업데이트 : DEPTH_TEST와 BLEND를 사용하지 않도록 설정 했으므로 필요하지 않습니다. 나는 그것이 어떤 차이를 만들었다 고 확신하지 않는다.

  • 업데이트 : 나는 LINES 대신 POINTS로 렌더링을 시도했다. 내 크롬 북에서는 0 점 크기 (즉, 렌더링 없음)로 약 1 초가 걸린 것처럼 보였습니다. 그런 다음 포인트 크기를 1,2와 5로 늘리면 1.5-2 초 정도 걸렸습니다.

  • UPDATE : 더 속도를 변경하지 않는 것은 z = 0면에 모든 것을 유지는, 어쩌면 그것은을 통해 얻을 수있는 더 많은 픽셀이 있기 때문에 내가 기대하는 (조금 느리게 간다 조각 쉐이더는 조각 쉐이더가 gl_FragColor로 다양하게 직선적으로 퍼널됩니다). 일반 (좋은) 조언을 각 그리기 요청에 가능한 한 많은 렌더링하는 것이지만

+0

(1) 나는 저가형 GPU에서 오프 스크린 향하고 라인의 나쁜 처리 보았다. 라인 캡 꼭지점을 제거 (예 : 무의미한 방식으로 연결되도록)하고 어떤 효과가 있는지 확인하려고합니다. (2)'gl.finish'를 사용하지 마십시오; 일을 측정하기가 더 쉬울 수도 있지만 실제로 파이프 라인 된 결과와 비교할 때 '비현실적인'값을 측정하게됩니다. –

+0

정점이나 인덱스를 변경하거나 정적입니까? 지표를 변경할 때마다 WebGL 구현은 모든 범위에 있는지 검사해야합니다. 그들은 결과를 캐시하지만 인덱스를 업데이트하면 캐시가 종료됩니다. 다른 드라이버는 정점 업데이트와 다르게 반응합니다. 정점을 업데이트하는 경우 다양한 모드를 시도 할 수 있습니다. STATIC_DRAW, DYNAMIC_DRAW, STREAM_DRAW와 다른 결과를 얻는 지 확인하십시오. 캔버스에 복사하는 속도는 느리지 만 적극적으로 최적화되고 있습니다. – gman

+0

케빈 (Kevin) - (1)에 대한 기술적 인 대답은 내가 원했던 것이지만 불행히도 여기서는 문제가 아닌 것 같습니다 (위의 업데이트 참조). (2) 나는 복사를 꺼 놓은 경우에만 그것을 사용하여 느린 복사가 아닌지 확인합니다. Gman - 제복 이외의 것을 바꾸지는 않을 것이고, 버텍스는 버퍼에 그대로 둡니다. STATIC_DRAW를 사용하고 있습니다. (저는 IO2013 회담을 지켜 보았습니다 - 크롬을 빨리 처리하기 위해 수행되는 모든 놀라운 작업을 보는 것이 좋습니다) –

답변

0

, 일부 GPU는 정점 데이터를 처리하는 동안 사용되는 내부 버퍼가 (적어도 하나는 내가 아는). 이러한 버퍼의 용량을 초과하면 성능이 저하 될 수 있습니다. 너무 작은 배치를 사용하여 성능 저하가 나타날 때까지 정점 배치의 크기를 줄입니다.

관련 문제