2012-03-26 2 views
4

내 응용 프로그램은 빠른 렌더링 (일반적으로 프레임 당 1-6ms)을하며 이중 버퍼링 및 vblank 동기화가 활성화되어 있습니다. 내 메인 루프에서 10 밀리 초 정도 잠자리에 들기를 기다렸다가 가능한 한 늦게 렌더링을 수행하면서 마감 시간 전에 프레임을 업데이트하면서 (최소한의 대기 시간으로 단색 60 FPS 렌더링의 경우) 렌더링을 계속 관리하고 싶습니다.OpenGL 수직 귀선 측정 타이밍 찾기

버퍼를 교환 한 후 glFinish를 사용할 수 있지만 불행히도 일부 시스템에서는 (최소한 Linux는 합성되지 않음) 다음 버퍼 스왑까지 기다리지 않고 이미지가 HDMI 포트 (total 25ms의 범위에서 대기하고 30FPS에서 실행하는 응용 프로그램). 다른 시스템 (리눅스 합성)에서이 접근법은 잘 동작합니다. glFinish가 없으면 더 많은 작업이 버퍼링되어 지연 시간이 길어지기 때문에 좋지 않습니다.

정확한 프레임 타이밍을 위해 어떤 옵션이 있습니까? 주요 플랫폼은 Windows, Linux 및 OS X입니다.

+1

타이밍 수직 동기화가 활성화 된 프레임은 의미가 없습니다. – Thomas

+0

동기화 기능을 사용할 수 있지만 신뢰할 수있는 방법 만 있다면 (물론 찢어짐이없는 경우) 기꺼이 해보겠습니다. – Tronic

+0

OS X에서는 ['CGDisplayModeGetRefreshRate'] (http://developer.apple.com/library/mac/#documentation/GraphicsImaging/Reference/Quartz_Services_Ref/Reference/reference.html)를 사용할 수 있습니다. – user1118321

답변

2

10 밀리 초 정도 잠자기 한 다음 실시간 입력을 읽고 가능한 한 늦게 렌더링을 수행하면서 마감일 전에 프레임을 업데이트 관리하고 싶습니다. (최소한의 레이턴시로 60 FPS 렌더링이 가능).

이것은 매우 신뢰할 수없는 접근 방법입니다. 모든 렌더링 작업을 자신의 스레드에 넣는 것이 좋습니다. 스왑이 발생할 때까지 버퍼 스왑을 차단합니다. 모든 입력 데이터를 처리하는 별도의 스레드에서 모든 입력 처리를 수행하십시오. 스왑을하기 전에 처리 스레드에서 뮤텍스 나 세마포어를 들어야합니다. 버퍼 스왑 시간에 처리됩니다.

V-Sync를 너무 가까이에서 렌더링하는 것을 지연해서는 안되기 때문에 V-Sync를 놓칠 수 있으므로 렌더링을 지연해서는 안됩니다. 대신에 수직 귀선 구간의 시작 부분에 물건을 렌더링 할 때 75 %를 가정해야하며 나머지 25 %는 긴급 마진으로 유지해야합니다. 또한 만약 당신이 작곡가를 운영한다면, 이것도 약간의 GPU 시간이 필요합니다.

조기 또는 늦게 렌더링하면 시각적 결과에 차이가 없습니다. 시뮬레이션 타이밍이 걱정된다면 : 실제로 마감일을 정하고 V-Sync가있을 때의 상태에 대한 시뮬레이션을 렌더링한다고 가정합니다. 시뮬레이션을 위해 모든 데이터 입력에 Kalman filter을 사용하여 예측을 기반으로 렌더링하고 새 입력을 "단순히"조정합니다.

나는 (리눅스가 아닌 합성, 적어도)이 다음 버퍼 스왑까지하지만 이미지가 발송 될 때까지 HDMI 포트뿐만 아니라 기다려야 나타나는 버퍼를 교환 한 후하지만 불행히도 일부 시스템 glFinish을 사용할 수 있습니다 (총 대기 시간은 25ms이며 응용 프로그램은 30FPS입니다).

타이밍이 V-Sync를 놓친 경우에 발생합니다. SwapBuffers는 전체 수직 귀선 기간을 기다립니다. IMHO SwapBuffers는 일종의 타임 아웃 매개 변수를 추가해야하지만 지금까지는 그렇지 않습니다.

+0

아주 좋은 답변입니다. 추가 할 것은 glFinish가 실제로 의미가 없습니다. datenwolf가 말한 것처럼 실제로 접근하는 올바른 방법은 GPU와 출력을 블랙 박스로 가능한 한 빨리 렌더링하는 것입니다. 그것을 시계로 사용하지 마십시오. 렌더링을 제어 할 수없는 많은 버퍼가 지연 될 수 있습니다.참조하십시오 : http://superuser.com/questions/419070/transatlantic-ping-faster-than-sending-a-pixel-to-the-screen 정확한 시계를 얻는 것은 충분히 어렵습니다. 그것을 위해 그래픽 디스플레이를 사용하는 것은 masochistic입니다 :) – starmole