VSYNC 신호는 디스플레이 파이프라인을 동기화합니다. 디스플레이 파이프라인은 앱 렌더링, SurfaceFlinger 조합, Hardware Composer(HWC)로 구성되어 디스플레이에 이미지를 표시합니다. VSYNC는 앱이 렌더링을 시작하기 위해 절전 모드를 해제하는 시간, SurfaceFlinger가 화면을 조합하기 위해 절전 모드를 해제하는 시간 및 디스플레이 새로고침 주기를 동기화합니다. 이 동기화는 끊김 현상을 제거하고 그래픽의 시각적 성능을 향상합니다.
HWC는 VSYNC 이벤트를 생성하고 콜백을 통해 SurfaceFlinger에 이벤트를 전송합니다.
typedef void (*HWC2_PFN_VSYNC)(hwc2_callback_data_t callbackData, hwc2_display_t display, int64_t timestamp);
SurfaceFlinger는 setVsyncEnabled
를 호출하여 HWC의 VSYNC 이벤트 생성 여부를 제어합니다. SurfaceFlinger를 사용하면 setVsyncEnabled
가 VSYNC 이벤트를 생성하므로 디스플레이의 새로고침 주기와 동기화할 수 있습니다. SurfaceFlinger가 디스플레이 새로고침 주기로 동기화되면 SurfaceFlinger는 setVsyncEnabled
를 사용 중지하여 HWC의 VSYNC 이벤트 생성 작업을 중단합니다. SurfaceFlinger가 실제 VSYNC와 이전에 설정된 VSYNC 간의 차이를 감지하면 SurfaceFlinger에서 VSYNC 이벤트 생성을 다시 사용 설정합니다.
VSYNC 오프셋
동기화 앱과 SurfaceFlinger는 루프를 하드웨어 VSYNC로 렌더링합니다. VSYNC 이벤트에서 SurfaceFlinger가 N+1 프레임의 창을 조합하기 시작하는 동안 디스플레이는 N 프레임을 표시하기 시작합니다. 앱은 대기 중인 입력을 처리하고 N+2 프레임을 생성합니다.
VSYNC 동기화는 일관된 지연 시간을 제공하며 앱과 SurfaceFlinger의 오류를 줄이고 디스플레이 사이의 위상이 같거나 다른 여러 디스플레이 간의 드리프트를 최소화합니다. 이때, 프레임 시간당 앱과 SurfaceFlinger는 크게 변하지 않는다고 가정합니다. 지연 시간은 최소 2프레임입니다.
이 문제를 해결하기 위해 VSYNC 오프셋을 사용하여 하드웨어 VSYNC를 기준으로 앱과 조합 신호를 만들면 입력과 디스플레이 간의 지연 시간을 줄일 수 있습니다. 앱과 조합은 일반적으로 33ms 미만의 시간이 소요되기 때문에 이러한 방식이 가능합니다.
VSYNC 오프셋의 결과는 동일한 주기와 오프셋 위상을 갖는 3가지 신호입니다.
HW_VSYNC_0
- 디스플레이에 다음 프레임이 표시되기 시작합니다.VSYNC
- 앱에서 입력을 읽고 다음 프레임을 생성합니다.SF_VSYNC
- SurfaceFlinger가 다음 프레임을 위한 조합을 시작합니다.
SurfaceFlinger가 VSYNC 오프셋을 통해 버퍼를 수신하고 프레임을 조합하는 동시에 앱은 입력을 처리하고 프레임을 렌더링합니다.
DispSync
DispSync는 디스플레이의 주기적인 하드웨어 기반 VSYNC 이벤트의 모델을 유지하고, 이 모델을 사용하여 하드웨어 VSYNC 이벤트의 특정 위상 오프셋에서 콜백을 실행합니다.
DispSync는 하드웨어 VSYNC에서 오프셋이 아니더라도 Choreographer와 SurfaceFlinger에서 사용하는 VSYNC 및 SF_VSYNC 신호를 생성하는 소프트웨어 위상 고정 루프(PLL)입니다.
![DispSync 흐름](https://source.android.google.cn/static/docs/core/graphics/images/dispsync.png?authuser=19&hl=ko)
그림 1. DispSync 흐름
DispSync에는 다음과 같은 특성이 있습니다.
- 참조 - HW_VSYNC_0
- 출력 - VSYNC 및 SF_VSYNC
- 의견 - Hardware Composer에서 펜스 신호 타임스탬프 폐기
VSYNC/폐기 오프셋
폐기 펜스의 신호 타임스탬프는 오프셋 위상을 사용하지 않는 기기에서도 HW VSYNC와 일치해야 합니다. 일치하지 않으면 오류가 실제보다 더 심각하게 보입니다. 스마트 패널에는 폐기 펜스가 메모리를 표시하기 위한 직접 메모리 액세스(DMA)의 끝인 델타가 있는 경우가 많지만, 실제 디스플레이의 전환과 HW VSYNC는 나중에 이루어집니다.
PRESENT_TIME_OFFSET_FROM_VSYNC_NS
는 기기의 BoardConfig.mk
makefile에 설정되어 있으며, 디스플레이 컨트롤러 및 패널 특성을 기반으로 합니다. 폐기 펜스 타임스탬프에서 HW VSYNC 신호까지의 시간은 나노초 단위로 측정됩니다.
VSYNC 및 SF_VSYNC 오프셋
VSYNC_EVENT_PHASE_OFFSET_NS
와 SF_VSYNC_EVENT_PHASE_OFFSET_NS
는 창 전환 시 부분적으로 GPU를 조합하거나 Chrome에서 애니메이션이 포함된 웹페이지를 스크롤하는 것과 같이 부하가 높은 사용 사례를 기반으로 보수적으로 설정됩니다. 이러한 오프셋은 앱의 긴 렌더링 시간과 긴 GPU 조합 시간을 허용합니다.
1~2밀리초가 넘는 지연 시간은 눈에 띕니다. 오류 횟수를 많이 증가시키지 않고 지연 시간을 최소화하려면 철저한 자동 오류 테스트를 통합하세요.