2015-01-02 5 views
4

우리의 컨텍스트에 대해 preserveDrawingBuffer를 사용할 때 우리는 자체 드로잉 버퍼를 지울 필요가 있습니다. 내 응용 프로그램 에서이 기술을 사용합니다.preserveDrawingBuffer false - 노력할만한 가치가 있습니까?

나는이 플래그를 false로 설정하면 더 나은 성능을 얻을 수 있다고 말하는 기사를 읽었습니다.

내 앱에서 false로 설정하면 드로잉이 발생하지 않을 때 이전에 그려진 것을 계속 볼 수 있기 때문에 프런트 버퍼를 직접 지워야하는 경우가 있습니다.

내 질문에 더 좋은 성능을 얻기 위해 내 응용 프로그램을 거꾸로 뒤집고 모든 사례를 다루는 것이 가치가 있습니까? 정말 많이 개선되고 있습니까?

이 플래그가 참일 때 (그리고 수행 할 때 gl.clear(..)) 성능이 다른 것을 보여주는 데모가 있습니까?

preserveDrawingBuffer: false 

가 WebGL을 복사 버퍼 대신 버퍼를 교환 할 수 있다는 것을 의미합니다 ....

+0

좋은 비디오 카드에서, 지우기는 존 단위로 하나의 비트 단위로 수행됩니다 (expl 64X64 'tile'). 따라서 webgl을 잘 구현하면 해당 플래그 만 지우고 메모리에 0을 작성하지 않습니다. preserveDrawingBuffer가 true 또는 false (rq : 내 프로파일에서 clear()를 본 적이 없음)로 성능 이득이 매우 적을 것입니다. 더 완벽한 답변을 원하겠습니다. – GameAlchemist

답변

9

나는이 다른 곳에서 답을했다 알고 있지만 나는 그렇게 그것을 찾을 수 없습니다.

WebGL 캔버스에는 2 개의 버퍼가 있습니다. 그리는 사람과 표시되는 사람. 웹 페이지를 그리는 시간이 왔을 때 WebGL은 2 가지 옵션을 가지고 있습니다.

  1. 드로잉 버퍼를 디스플레이 버퍼에 복사하십시오.

    이 작업은 속도가 느린 분명히 수천 또는 수백만 개의 픽셀을 복사 그대로 는

  2. 스왑 두 개의 버퍼를 무료로 작동하지 않습니다.

    이 작업은 2 개 변수의 내용을 바꿔주는 것 외에는 실제로 아무 것도 일어나지 않아도되므로 실제로 효과적입니다.

여부 WebGL을 스왑 또는 복사본은 브라우저 및 기타 다양한 설정에 달려 있지만 preserveDrawingBufferfalse 경우가 true는 할 수 없습니다 만약 WebGL이는 교체 할 수 있습니다.

퍼포먼스 차이를 보려면 휴대 전화에서 앱을 사용해 보는 것이 좋습니다. 앤티 엘리 어싱을 수행하려면 단계가 필요하며 효과적으로 복사 작업을 수행해야하므로 앤티 엘리 어싱을 해제하십시오.

+0

내 앱이 휴대 전화에서 실행되고 있지는 않지만 (적어도 현재는) 내 클라이언트 그래픽 카드가 매우 저렴하므로 모든 앱 버그를 확인하기 위해 'preserveDrawingBuffer = false'가 원인이 될 수 있습니다. 거기에 더 나은 공연. Thanks allot –

+2

모든 사례를 다루고 난 후에, 나는'preserveDrawingBuffer = false'로 몇 가지 버전을 발표 할 수있었습니다. 개인적으로 나는 성능면에서 어떤 변화도 보지 못했다. 그러나 가난한 그래픽 카드를 사용하는 나의 고객들은 훌륭한 공연 향상이 있었다고 말한다. 그냥 그것을 공유하고 싶었어 –

0

내가 알기로, preserveDrawingBuffer=true은 WebGL이 프레임간에 파이프 라인을 플러시해야한다는 것을 의미합니다. OpenGL 그리기는 동기식이 아니므로 프레임 완료시 그리기 명령이 파이프 라인에 남아있을 수 있습니다.

이것은 렌더 루프 끝 부분에 플러시를 배치하는 것과 같습니다. https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/flush

그래서 결과가 많이 다를 수 있습니다. GPU가 많은 명령을 버퍼링했다면 모든 GPU 명령이 실행되는 동안 프로그램이 강제로 중지됩니다. 그러나 GPU가 빠르면 버퍼에 많은 양이 없어서 작업이 계속 진행됩니다.

렌더 루프의 끝에서 플러시 콜을 배치하면 Fps가 50 % 떨어지는 경우가 있습니다.

나는 그것이 가장 필요할 때 성능을 해칠 것이므로 preserveDrawingBuffer=true을 피할 것입니다.

+0

'preserveDrawingBuffer : true'는'gl.flush'와 관계가 없습니다. 그것은 단지 버퍼를 복사하는 것과 버퍼를 복사하는 것과 관계가있다. 애플의 요청에 따라 스펙을 추가했는데, 스왑 버퍼가 iOS에서 훨씬 빨라질 것이라고 주장했다. 또한'gl.flush'는 프레임 속도에 영향을주지 않아야합니다. 효과가 있을지도 모르는'gl.finish'입니다. 'gl.flush'는 "지금까지 발행 한 모든 명령을 알고 있어야 함"을 의미합니다. "gl.finish"는 "지금까지 발행 한 모든 명령을 실행하고 완료 될 때까지 리턴하지 않습니다" – gman

관련 문제