VSync — 정의, 작동 원리 및 설정

저자: IT Sectr 게시일: 2026-04-01 읽는 시간: 8 분

VSync(수직 동기화)는 GPU의 각 새 프레임 출력을 디스플레이 재생 빈도와 동기화하여 이미지 티어링을 제거하는 기술입니다. Apple Metal 문서에 따르면, 모바일 기기에서 부드러운 렌더링을 위해서는 VBlank와의 동기화가 필수입니다. 화면 티어링은 수직 재생 중에 프레임이 업데이트될 때 발생하며, VSync는 이러한 혼합을 방지합니다.

핵심 요점

  • VSync — VBlank를 대기하여 GPU를 디스플레이와 동기화하는 메커니즘
  • 화면 티어링 — 스캔아웃 중에 프레임이 변경될 때 발생하는 이미지의 가시적 분할
  • 이중 버퍼링 — 프론트 버퍼와 백 버퍼를 사용한 VSync의 주요 구현 방식
  • 입력 지연 — VSync의 부작용으로, 사용자 동작과 표시 사이의 지연 증가
  • 적응형 동기화 — VSync의 단점을 제거하는 현대적인 대안

VSync란

VSync(수직 동기화)는 새 프레임을 출력하기 전에 GPU가 수직 블랭킹 신호(VBlank)를 기다리도록 강제하는 하드웨어-소프트웨어 메커니즘입니다. VSync가 없으면 GPU는 디스플레이가 현재 프레임을 그리는 중에도 언제든지 프레임을 보낼 수 있으며, 이로 인해 수평선을 따라 이미지 티어링이 발생합니다.

모바일 기기에서 VSync는 그래픽 드라이버와 운영 체제 수준에서 구현됩니다. iOS는 Metal을 통해 VBlank 동기화를 사용하고, Android는 SurfaceFlinger와 BufferQueue를 통해 사용합니다. 수직 동기화가 활성화되면 애플리케이션의 FPS는 디스플레이 재생 빈도(기기 모델에 따라 60, 90 또는 120Hz)를 초과할 수 없습니다.

수직 동기화라는 용어는 전자빔이 위에서 아래로 라인별로 이미지를 그리는 CRT 모니터의 작동 원리에서 유래했습니다. 프레임이 완료되면 빔은 왼쪽 상단 모서리로 돌아갔습니다 — 이 순간을 수직 블랭킹이라고 불렀습니다. 최신 LCD 및 OLED 디스플레이는 이 용어를 유지했지만, 물리적으로는 다르게 작동합니다.

수직 동기화 작동 방식

GPU는 백 버퍼에 프레임을 렌더링하고, 디스플레이는 프론트 버퍼에서 읽습니다. VSync는 디스플레이가 현재 프레임 표시를 완료하고 다음 프레임을 준비했을 때(VBlank 순간)에만 버퍼 교체가 발생하도록 보장합니다. 이 메커니즘을 VBlank 동기화를 사용한 이중 버퍼링이라고 합니다.

이중 버퍼링 메커니즘

이중 버퍼링은 두 개의 버퍼를 사용합니다: 화면에 표시되는 프론트 버퍼와 GPU가 현재 프레임을 쓰는 백 버퍼입니다. 프레임이 준비되면 버퍼가 교체됩니다. VSync가 활성화되면 이 교체는 가장 가까운 VBlank까지 지연됩니다. 프레임이 VBlank보다 먼저 준비되면 GPU는 유휴 상태가 되어 성능은 저하되지만 티어링은 제거됩니다.

cpp
// OpenGL — WGL_EXT_swap_control을 통한 VSync 활성화
HDC hdc = wglGetCurrentDC();
PFNWGLSWAPINTERVALEXTPROC wglSwapIntervalEXT =
    reinterpret_cast<PFNWGLSWAPINTERVALEXTPROC>(
        wglGetProcAddress("wglSwapIntervalEXT"));
wglSwapIntervalEXT(1); // 1 = VSync 활성화, 0 = 비활성화

VBlank 대기 시간

VBlank는 현재 프레임의 마지막 라인과 다음 프레임의 첫 번째 라인 사이의 짧은 간격입니다. 이 순간에 디스플레이는 픽셀을 업데이트하지 않으며, 버퍼 교체가 아티팩트 없이 발생합니다. VBlank 지속 시간은 재생 빈도에 따라 다릅니다: 1080p 디스플레이에서 60Hz의 경우 VBlank는 약 1.4ms 지속됩니다. GPU가 VBlank 전에 렌더링을 완료하지 못하면 프레임이 건너뛰어지고 디스플레이는 이전 프레임을 한 사이클 더 표시합니다 — 이를 스터터라고 인식합니다.

삼중 버퍼링은 세 번째 버퍼를 추가하여 GPU 유휴 문제를 해결합니다. GPU는 백 버퍼 중 하나가 VBlank를 기다리고 있더라도 즉시 다음 프레임 렌더링을 시작할 수 있습니다. 이렇게 하면 VSync 사용 시 FPS가 증가하지만 추가 프레임 지연이 발생합니다. 모바일 기기에서는 일부 게임 엔진과 Mailbox 모드를 통한 Vulkan에서 삼중 버퍼링이 사용됩니다.

VSync 없을 때의 주요 문제

VSync를 비활성화하면 최대 FPS와 최소 입력 지연을 얻을 수 있지만, 시각적 아티팩트라는 대가가 따릅니다. 모바일 게임과 부드러운 애니메이션이 있는 애플리케이션의 경우 VSync와 비활성화 사이의 선택은 이미지 선명도와 제어 응답성 사이의 절충입니다.

화면 티어링

화면 티어링은 화면의 위쪽이 이전 프레임을 표시하고 아래쪽이 이미 다음 프레임을 표시하는 수평 분할입니다. 이는 GPU가 스캔아웃 중에 버퍼를 교체할 때 발생합니다. 모바일 기기에서 티어링은 빠른 스크롤 또는 높은 프레임 속도의 동적 장면에서 특히 두드러집니다. OLED 디스플레이는 즉각적인 응답으로 인해 LCD보다 티어링을 더 대비되게 만듭니다.

티어링 강도는 FPS와 재생 빈도의 비율에 따라 다릅니다. 60Hz 디스플레이에서 60FPS의 경우 티어링은 하나의 정적 선으로 나타나지만, 60Hz에서 300FPS의 경우 위에서 아래로 움직이는 여러 개의 물결 모양 티어링으로 나타납니다. FPS가 재생 빈도에 비해 높을수록 티어링이 더 많아지고 더 눈에 띄게 됩니다.

입력 지연

입력 지연은 VSync 사용 시 버튼을 누르고 화면에 결과가 표시될 때까지의 지연입니다. 수직 동기화는 평균적으로 한 프레임(60Hz에서 16.7ms)의 지연을 추가하며, 삼중 버퍼링의 경우 최대 두 프레임까지 추가합니다. 캐주얼 애플리케이션에서는 이 지연이 인지되지 않지만, 슈팅, 격투, 리듬 게임에서는 치명적입니다: 전문가는 8ms의 지연도 인지합니다.

NVIDIA(2024) 연구에 따르면, CS:GO에서 VSync 없이 60FPS일 때 평균 입력 지연은 22ms이고 VSync 사용 시 39ms입니다. 144FPS에서는 각각 14ms 대 18ms로 차이가 줄어듭니다. 모바일 플랫폼에서는 터치 입력의 하드웨어 터치스크린 지연(10~30ms)이 추가 동기화 지연을 가리기 때문에 VSync 입력 지연이 덜 중요합니다.

모바일 개발에서 VSync 설정

모바일 개발에서 VSync는 그래픽 API, 게임 엔진 및 OS 시스템 설정을 통해 제어됩니다. iOS는 제어가 적고, Android는 Vulkan 및 OpenGL ES를 통해 더 많은 제어를 제공합니다. 모드 선택은 애플리케이션 유형(게임, UI 또는 비디오)에 따라 다릅니다.

Unity 및 Unreal Engine에서의 VSync

Unity는 QualitySettings.vSyncCount 설정을 사용합니다: 0 — 비활성화, 1 — 매 VBlank마다 VSync, 2 — 두 번째 VBlank마다(FPS 절반). Unreal Engine에서는 r.VSync 콘솔 명령과 DefaultEngine.ini를 통해 VSync가 제어됩니다. 모바일 빌드의 경우 Unity에서 VSync를 비활성화하고 사용자 지정 FPS 제한기를 사용하는 것이 좋습니다. Android SurfaceFlinger의 내장 VSync는 예측할 수 없는 지연을 만들 수 있기 때문입니다.

csharp
// Unity — VSync 및 FPS 제어
void Awake()
{
    // 0 = VSync 비활성화, 1 = VSync 활성화
    QualitySettings.vSyncCount = 0;
    // VSync 대신 사용자 지정 FPS 제한기
    Application.targetFrameRate = 60;
}

Vulkan 및 Metal에서의 VSync

Vulkan은 VkSwapchainPresentInfo 및 presentMode를 통해 완전한 제어를 제공합니다: VK_PRESENT_MODE_FIFO_KHR — 클래식 VSync, VK_PRESENT_MODE_MAILBOX_KHR — 대기 없는 삼중 버퍼링, VK_PRESENT_MODE_IMMEDIATE_KHR — 동기화 없음. Metal은 iOS에서 CAMetalLayer.displaySyncEnabled를 통해 VSync를 제어합니다. iOS 14부터 Apple은 아케이드 스타일 게임을 제외한 모든 애플리케이션에서 기본적으로 displaySyncEnabled = true를 사용할 것을 권장합니다.

모드설명지연
FIFOVBlank 대기가 있는 클래식 VSync1프레임
Mailbox삼중 버퍼링, 오래된 프레임 폐기1~2프레임
Immediate동기화 없음, 최대 FPS0프레임

VSync 없이 FPS 제한

FPS 제한기는 VBlank를 기다리지 않고 애플리케이션이 프로그래밍 방식으로 프레임 속도를 제한하는 VSync의 대안입니다. 이 접근 방식은 예측 가능한 지연을 제공하며 디스플레이 재생 빈도에 의존하지 않습니다. Android에서는 Choreographer를 통해 FPS 제한이 구현되고, iOS에서는 CADisplayLink를 통한 수동 출력 타이밍 제어로 구현됩니다.

VSync와 최신 동기화 기술

전통적인 VSync에는 근본적인 단점이 있습니다: 디스플레이의 고정 재생 빈도에 묶여 있다는 점입니다. GPU가 60Hz 디스플레이에서 45FPS를 출력하는 경우 VSync는 45프레임을 표시할 수 없습니다 — 30프레임(두 번째 VBlank마다 건너뜀)을 표시하거나 불규칙한 간격으로 60과 30을 번갈아 표시합니다. 이는 스터터를 생성하며, 티어링보다 게임 경험을 더 해칩니다.

적응형 동기화(FreeSync, G-Sync, Apple ProMotion)는 애플리케이션 FPS에 따라 디스플레이 재생 빈도를 동적으로 변경하여 이 문제를 해결합니다. 애플리케이션이 47FPS를 출력하면 디스플레이가 47Hz로 전환됩니다 — 각 프레임은 티어링이나 스터터 없이 정확히 한 번 표시됩니다. iOS의 ProMotion은 24~120Hz의 주파수를 자동으로 선택하여 부드러움과 전력 소비의 균형을 맞춥니다.

모바일 기기에서 적응형 동기화는 표준이 되고 있습니다: ProMotion이 탑재된 iPad Pro(2017+), LTPO 디스플레이가 탑재된 Android 플래그십(Samsung Galaxy S23 Ultra, Google Pixel 8 Pro)은 1~120Hz의 동적 재생 빈도를 지원합니다. 개발자에게 이는 전통적인 의미의 VSync가 시스템 관리로 대체됨을 의미합니다 — targetFrameRate를 설정하기만 하면 OS가 부드러움과 배터리 수명의 최적 균형을 위해 재생 빈도를 조정합니다.

자주 묻는 질문

모바일 게임에서 항상 VSync를 활성화해야 하나요?

아니요. 역동적인 게임(슈팅, 격투)의 경우 VSync는 의미 있는 이점 없이 입력 지연을 증가시킵니다 — 모바일 OLED 화면에서는 디스플레이 크기가 작아 티어링이 덜 눈에 띕니다. 캐주얼 게임과 UI의 경우 VSync는 부드러움에 대한 인식을 향상시킵니다.

VSync는 모바일 기기의 배터리에 어떤 영향을 미치나요?

VSync는 전력 소비를 줄입니다. GPU가 불필요한 프레임을 렌더링하지 않기 때문입니다. VSync가 비활성화되면 GPU는 최대 주파수로 작동하며, 표시되지 않은 모든 프레임은 에너지를 낭비하고 사용자에게 이익 없이 기기를 가열합니다.

VSync와 FPS 제한기의 차이점은 무엇인가요?

VSync는 프레임 출력을 디스플레이의 VBlank와 동기화하는 반면, FPS 제한기는 애플리케이션 코드에서 렌더링 빈도를 제한합니다. FPS 제한기는 티어링을 제거하지 않지만 화면 재생 빈도에 묶이지 않고 예측 가능한 지연을 제공합니다.

VSync 활성화 시 FPS가 절반으로 떨어지는 이유는 무엇인가요?

GPU가 VBlank 전에 프레임을 완료하지 못하면 VBlank가 건너뛰어지고 프레임이 두 번의 재생 주기 동안 표시됩니다. 60Hz에서는 30FPS가 됩니다. 삼중 버퍼링은 GPU가 대기 없이 다음 프레임을 시작할 수 있도록 하여 이 효과를 완화합니다.

iOS와 Android는 적응형 동기화를 지원하나요?

. iOS ProMotion(iPad Pro, iPhone 13 Pro+)은 24~120Hz의 동적 주파수를 지원합니다. Android는 LTPO 패널을 통해 1~120Hz를 지원합니다. 개발자가 이를 수동으로 관리할 필요는 없습니다 — 시스템이 최적의 주파수를 자동으로 선택합니다.

요약

  • VSync — 화면 티어링을 제거하는 GPU-디스플레이 동기화 메커니즘
  • VBlank 대기가 있는 이중 버퍼링 — 수직 동기화의 클래식 구현
  • 화면 티어링 — VSync 비활성화의 주요 문제, 특히 높은 FPS에서 두드러짐
  • 입력 지연 — VSync의 대가, 1~2프레임 지연 추가
  • 삼중 버퍼링은 스터터를 줄이지만 입력 지연을 증가시킴
  • 적응형 동기화(ProMotion, LTPO) — 동적 재생 빈도를 갖춘 VSync의 현대적 대체
  • 모바일 게임의 경우 예측 가능한 지연을 위해 VSync 대신 FPS 제한기를 사용하세요

턴키 방식의 모바일 애플리케이션을 개발해 드립니다

IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.

프로젝트 논의

더 읽어보기