[TIL] Unity - 수직동기화(VSync) - day 71

뭉크의 개발·2023년 10월 26일
0

Unity - Camp

목록 보기
40/70
post-thumbnail

🐧 들어가기 앞서

화면을 구성하면서 수직동기화에 대해 알게되었다.


🐧 오늘 배운 것

수직 동기화(V-Sync, Vertical Synchronization)

수직 동기화는 그래픽 카드가 화면에 그림을 그리는 속도와 모니터가 화면을 갱신하는 속도 간에 동기화를 맞추는 기술이다.

컴퓨터 그래픽에서는 그래픽 카드가 생성한 이미지가 모니터에 표시되기 전에 버퍼에 저장된다.

그래픽 카드는 이 버퍼에 새로운 이미지를 그리고, 모니터는 일정한 간격 (주로 초당 60회)으로 버퍼의 내용을 화면에 표시한다.


그러나 그래픽 카드가 너무 빨리 그림을 그리면, 모니터가 버퍼의 내용을 화면에 표시하는 도중에 버퍼의 내용이 변경될 수 있다.

이런 경우, 화면의 일부는 이전 프레임의 내용을, 나머지 부분은 새 프레임의 내용을 표시하게 되어 화면이 찢어지는 것처럼 보이는

스크린 티어링(Screen Tearing) 현상이 발생할 수 있다.

이러한 문제를 해결하기 위해 수직 동기화 기술이 사용된다.

수직 동기화를 켜면, 그래픽 카드는 모니터가 화면을 갱신하는 속도에 맞춰 그림을 그린다.

즉, 그래픽 카드는 모니터가 화면을 갱신한 후에만 새로운 이미지를 버퍼에 그린다.

이렇게 하면 화면이 찢어지는 현상을 방지할 수 있다.

⚙️ Example

  1. 모니터화면을 상상해보자. 그 화면이 위에서 아래로 갱신되는 것을 상상해보면, 이것이 화면을 갱신하는 일반적인 방식이다.
  1. 이제, 그래픽 카드가 새로운 프레임을 생성하고 프레임을 버퍼에 저장한다고 상상해보자.
    그래픽 카드가 새로운 프레임을 생성하는 속도가 모니터의 화면 갱신 속도보다 빠르다면, 모니터가 아직 화면의 아래 부분을 갱신하는 도중에 버퍼의 내용이 바뀔 수 있다.

  2. 이것이 스크린 티어링 현상의 원인이다.


이제 수직 동기화가 켜져 있다고 상상해보자.

이 경우, 그래픽 카드는 모니터가 화면을 갱신한 후에만 새로운 프레임을 버퍼에 저장한다.

즉, 모니터가 화면의 갱신을 완료하고 다음 갱신을 시작할 준비가 될 때까지 그래픽 카드는 기다린다.

이렇게 하면, 화면이 갱신되는 도중에 버퍼의 내용이 바뀌는 것을 방지할 수 있다.

📢 Caution

그러나 수직 동기화 기능은 입력 지연을 일으킬 수 있다.

그래픽 카드가 모니터의 화면 갱신 속도에 맞춰 기다리게 되므로, 그래픽 카드가 새로운 이미지를 생성한 후 바로 화면에 표시하지 못하고 지연 될 수 있기 때문이다. 따라서 수직동기화를 켜고 끌 수 있게 옵션을 제공해보자.


🐧 기억할 것 & 진행

💡 vSyncCount

📜 Code

먼저 수직동기화를 켜고 끄는 토글 버튼을 생성하자.

이후 코드를 작성하면,

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class VideoOption : MonoBehaviour
{
    public Toggle vSyncToggle;
    
    private void Start()
    {
        InitUI();
    }

    private void InitUI()
    {
        vSyncToggle.isOn = QualitySettings.vSyncCount > 0;
    }

    public void VSyncToggle(bool isOn) 
    // 토글 버튼이 켜져 있으면 QualitySettings.vSyncCount 값을 1로 설정하고, 그렇지 않으면 0으로 설정한다. 이렇게 함으로써 수직 동기화를 켜고 끌 수 있다.
    {
        QualitySettings.vSyncCount = isOn ? 1 : 0;
    }
}

QualitySettings.vSyncCount는 Unity의 QualitySettings 클래스의 속성으로, 수직 동기화를 제어한다.

이 값이 0이면 VSync가 비활성화되고, 1 이상이면 활성화된다.

이 값이 1이면 모든 렌더링이 모니터의 수직 동기화와 동기화되어 스크린 티어링을 방지한다.

만약 이 값이 2라면, 렌더링은 모니터의 매 두 번째 수직 동기화와 동기화되며, 이는 프레임 속도를 모니터의 반으로 제한한다.

모니터의 주사율이 60Hz(초당 60번 화면 갱신)인 경우, 그래픽 카드가 초당 60프레임 이상으로 렌더링을 수행하더라도, 모니터는 초당 60프레임만 표시할 수 있다.
이런 경우, 그래픽 카드의 렌더링 속도를 모니터의 주사율의 절반인 30프레임으로 제한하여, 그래픽 카드의 부하를 줄이고 에너지를 절약할 수 있다.

즉, 이 스크립트는 사용자가 UI를 통해 게임의 수직 동기화 옵션을 켜고 끌 수 있도록 하는 기능을 제공한다.

이를 통해 사용자는 게임의 성능과 화면 표시 품질 사이의 균형을 조절할 수 있다.


🐧 게임에 구현한다면?


🐧 내일 할 일

오디오 완성하기

✅ Reference

0개의 댓글