스크롤하는 동안 일부 프레임이 사라지는 것을 감지하여 응용 프로그램의 성능을 조사하고 있습니다. 나는 systrace (실행중인 Nexus 4에서 4.3)를 실행하여 출력에서 interesting section을 발견했습니다.Android 트리플 버퍼링 - 예상되는 동작입니까?
처음에는 문제가 없습니다. Zooming in on the left section을 사용하면 모든 vsync에서 드로잉이 시작되고 여유 시간을두고 완료되며 다음 vsync까지 기다릴 수 있습니다. 버퍼가 3 배이기 때문에 버퍼가 끝나면 다음 vsync에 게시됩니다.
확대 된 스크린 샷의 네 번째 vsync에서 앱이 작동하고 다음 vsync 시간에 그리기 작업이 완료되지 않습니다. 그러나 이전의 드로잉이 프레임을 앞섰기 때문에 어떤 프레임도 드롭하지 않습니다.
이 문제가 발생한 후에 그리기 작업은 손실 된 vsync를 보완하지 못합니다. 대신, vsync 당 하나의 그리기 작업 만 시작되고 이제는 더 이상 한 프레임을 그리지 않습니다.
Zooming in on the right section이 앱은 더 많은 작업을 수행하고 다른 vsync를 놓칩니다. 앞으로 프레임을 그리지 않았으므로 프레임이 실제로 여기에 드롭됩니다. 그런 다음 한 프레임 앞으로 돌아갑니다.
이 예상되는 동작입니까? 제 생각에 트리플 버퍼링을 사용하면 vsync를 놓친 경우 복구 할 수있었습니다. 그러나이 동작은 두 개의 vsync가 누락 될 때마다 프레임을 삭제하는 것처럼 보입니다. 디스플레이를 소비하는 것보다
후속 질문 this screenshot의 오른쪽에
- 는 응용 프로그램은 실제로 빠른 버퍼를 렌더링한다. performTraversals # 1 (스크린 샷으로 표시) 동안 버퍼 A가 표시되고 버퍼 B가 렌더링되고 있다고 가정 해 봅시다. # 1은 vsync보다 오래 전에 완료되고 버퍼 B를 대기열에 넣습니다. 이 시점에서 앱이 즉시 버퍼 C 렌더링을 시작할 수 없습니까? 대신, performTraversals # 2는 다음 vsync 때까지 시작되지 않아 그 사이에 소중한 시간을 낭비합니다.
비슷한 맥락에서 나는 waitForever on the left side here에 대한 필요성에 대해 다소 혼란스러워합니다. 버퍼 A가 표시되고 버퍼 B가 대기열에 있고 버퍼 C가 렌더링되고 있다고 가정 해 봅시다. 버퍼 C가 렌더링을 완료하면 큐에 즉시 추가되지 않는 이유는 무엇입니까? 대신 버퍼 B가 큐에서 제거 될 때까지 waitForever를 수행합니다. 버퍼 C는 버퍼 C를 추가하기 때문에 응용 프로그램이 버퍼를 얼마나 빠르게 렌더링하는지에 관계없이 큐는 항상 크기 1로 유지됩니다.
답변 해 주셔서 감사합니다. 링크 된 게시물은 systrace가 버퍼 대기열을 표시한다는 것을 알고 있으므로 매우 유용합니다. 나는 아직도 몇 가지 질문이 있지만 (위에 추가). –
답변 추가. – fadden
일부 업데이트되었습니다. – fadden