닌텐도 스위치 에뮬레이터 끊김의 이유: ‘쉐이더 컴파일링’이란?

닌텐도 스위치 에뮬레이터에서 발생하는 끊김 현상의 원인이 되는 쉐이더 컴파일링이란 무엇인지 설명하고, 그 해결법을 설명합니다. 쉐이더 캐시와 프리컴파일드 쉐이더 캐시 활용으로 게임을 원활하게 즐겨보세요.

Overlay Image Overlay Image

닌텐도 스위치 에뮬레이터 끊김 현상의 원인이 되는 쉐이더 컴파일링이란 무엇인지 설명하고, 그 해결법을 설명합니다. 그리고 쉐이더 캐시, 프리컴파일드 쉐이더 캐시 활용을 통해 대응하는 방법을 설명합니다.

1. 쉐이더 컴파일링, 왜 게임을 멈추게 하는가

닌텐도 스위치 에뮬레이터를 사용하다 보면 누구나 한 번쯤 경험했을 현상이 있습니다. 게임을 시작하고 새로운 오브젝트나 배경이 화면에 등장하면 갑자기 프레임이 뚝 떨어지며 “쉐이더를 컴파일 중”이라는 메시지가 뜹니다.

놀랍게도 이 끊김은 처음 한 번만 발생하며, 이후에는 멀쩡하게 돌아갑니다. 왜 이런 현상이 일어나는 것일까요?

이는 단순한 렉이 아닙니다. 닌텐도 스위치 에뮬레이터가 풀어내야 할 기술적 과제쉐이더 컴파일링 때문입니다.

쉐이더 컴파일 진행되며 끊김이 발생할 떄, 빌드중 5개 셰이더 라는 메세지 캡쳐한 그림

2. 결론: 문제의 핵심은 ‘프로그래머블 쉐이더’

게임기 하드웨어와 PC의 GPU는 동작 방식이 근본적으로 다릅니다.

  • 스위치의 GPU는 게임에 맞춘 쉐이더 코드를 이미 최적화된 형태로 실행합니다.
  • 그러나 에뮬레이터는 이 코드를 PC용 GPU 명령어로 실시간 변환해야 하며, 이 과정이 바로 쉐이더 컴파일링입니다.

새로운 오브젝트나 효과가 화면에 등장할 때 쉐이더 컴파일이 처음 실행되며, 이때 일시적으로 게임 속도가 저하됩니다. 반면 같은 쉐이더가 다시 호출될 경우 이미 캐싱된 결과를 사용하므로 부드럽게 실행됩니다.


3. 쉐이더란 무엇인가: 그래픽 렌더링의 숨은 주인공

쉐이더(Shader)는 GPU가 화면에 표현하는 빛, 그림자, 색상, 질감 등을 결정하는 프로그램입니다. 게임 속 등장하는 반사되는 물, 그림자의 흐름, 불꽃의 움직임 모두 쉐이더를 통해 표현됩니다.

고정 파이프라인 vs 프로그래머블 쉐이더

과거 PS2나 PS3 시절의 그래픽 처리는 고정된 파이프라인(Fixed Function Pipeline)을 통해 이루어졌습니다. 즉, 하드웨어가 정해진 규칙에 따라 화면을 렌더링했기 때문에 쉐이더 코드가 매우 단순하거나 존재하지 않았습니다.

반면, 닌텐도 스위치를 비롯한 최신 게임기에서는 프로그래머블 쉐이더가 도입되었습니다.

  • 개발자는 쉐이더를 통해 빛의 반사, 입자 효과 등 자유롭고 복잡한 그래픽 연출을 구현할 수 있습니다.
  • 그러나 이러한 유연성은 에뮬레이터 입장에서 더 많은 연산과 실시간 변환을 필요로 합니다.

4. 에뮬레이터의 한계: 왜 쉐이더 컴파일링이 느릴까

에뮬레이터는 닌텐도 스위치의 쉐이더를 PC 환경에서 실행하기 위해 다음과 같은 과정을 거칩니다:

  1. 게임 실행 중 새로운 쉐이더 호출
  2. 에뮬레이터가 이를 PC용 GPU 코드로 변환
  3. 쉐이더 컴파일링 진행

닌텐도가 사용하는 CPU, GPU와 일반적으로 여러분이 에뮬레이터를 돌리고 있는 장치의 CPU, GPU가 전혀 다른 제품이기 때문에 이와 같은 과정이 필요합니다.
스위치의 GPU는 내부적으로 반짝이는 삼각형을 그려줘를 고유 명령어로 처리합니다. 하지만 에뮬레이터는 이를 PC GPU 명령어로 변환해야 합니다. 가상의 예를 들어보자면,

  • AMD GPU: 삼각형 {(1,3,5)}, 광원 반짝 (1.1)
  • NVidia: 반짝_삼각형(1,1,3,3,5,5,10)
  • Intel GPU: 반짝 (삼각형 {(1,1), (3,3), (5,5)}, 광원 10)

이런식으로 서로 다른 내부의 언어를 사용하고 있기 때문에 이 부분을 여러분의 CPU, GPU가 알아들을 수 있도록 Emulating (=흉내내기) 하는 것이 바로 Emulator가 하는 역할이고,
그 와중에 닌텐도 스위치에 사용된 더 최신의 복잡한 쉐이더 기능을 흉내내려다보니 더 긴 시간이 소요되는 것입니다.

이는 특히 새로운 쉐이더가 많을수록 병목 현상이 발생합니다. 다양한 오브젝트가 많이 등장하는 복잡한 3D게임, 예를들면 무쌍 종류의 게임을 한다면 다 오랜 버벅임이 느껴질 것이고, 로봇대전과 같은 2D게임을 즐길 때에는 쉐이더 컴파일링으로 인한 끊김이 거의 느껴지지 않을 것입니다.

다만 쉐이더 캐시를 사용한다면 이미 컴파일된 코드를 사용하므로 이런 끊김 현상이 사라집니다.


5. 해결 및 최소화 방법

1) 쉐이더 캐시 활용: 끊김은 처음만 참으세요

대부분의 에뮬레이터(Yuzu, Ryujinx 등)는 쉐이더 캐시 기능을 제공합니다. 오브젝트가 처음 등장할 때에는 컴파일을 하느라 끊기지만, 다시 등장할 때에는 캐싱되어있는 정보를 활용합니다.

처음 굼바가 등장하면, 여러분 PC가 어떻게 굼바를 그려야 될지 알아들을 수 있도록 번역을 해야되기때문에 끊깁니다.
만약 맵을 이동해서 처음으로 화면에 다양한 풍경이 펼쳐지는데, 동시에 굼바, 엉금엉금, 뽀꾸뽀꾸, 쿠파, 마리오, 루이지 등등 다양한 오브젝트가 동시에 등장하면 엄청 오래동안 끊깁니다.

하지만 이렇게 한번 해석(=쉐이더 컴파일)을 한 뒤에는 머릿속에 그 내용을 기억합니다 (=메모리에 캐싱)
그래서 같은 맵에, 똑같은 굼바가 등장하는 것으로 끊기지는 않습니다.

즉, 처음만 끊기는 것이기 때문에, 죽을 각오를하고 맵 구석구석을 돌아다니며, 다양한 오브젝트들을 한번씩 화면에 보여주고 나면 그 이후로는 끊김이 확연히 줄어들게 될 것입니다.

2) Precompiled Shader Cache 활용

또한 이렇게 한번 컴파일이 된 쉐이더 정보는 디스크에도 저장이 됩니다.
똑같은 게임을 처음 실행할 때에는 바로 게임이 시작되는데, 10시간 20시간 진행한 다음에 게임을 시작하면 시간이 엄청 오래 걸리는 것을 느껴보셨을 겁니다.

처음 게임을 구동할 때 셰이더 로딩이라는 문구와 함께 시간이 오래 걸리는 부분 캡쳐한 그림

한번 마리오가 어떻게 생겼는지 확인했으면, 그 내용을 디스크에도 저장해두고, 이 후에 게임을 껐다가 다시 켜면, 그 내용들을 읽어들입니다.
그런식으로 처음에는 마리오가 어떻게 생겼는지만 읽어들일테니 게임이 바로 켜지겠지만
게임 진행률이 높아지다 보면, 마리오, 루이지, 피치 공주, 쿠파, 요시, 키노피오, 굼바, 엉금엉금, 쿠파주니어, 굼바, 부끄부끄 ……. 등을 디스크에서부터 읽어들여야해서 처음 게임 구동시간이 오래걸리게 됩니다.

하지만 이렇게 디스크로부터 쉐이더 컴파일 정보를 미리 읽어서 메모리에 캐싱해두면, 이 후에 게임 진행중에 게임은 덜 끊기게 됩니다.

따라서 한번은 죽을 각오로 맵을 한번 싹 돌아다니고, 이것저것 만나고, 그리고 죽고 다시 불러오기해서 게임을 한다면 끊김이 많이 줄어있을 것입니다.

이런식으로 1회차는 끊겼어도, 2회차는 끊김 없이 진행 할 수도 있고,
애가 게임하기 전에 아빠가 먼저 답답함을 감수해가며 미리 한번 게임을 클리어해본다거나 하면, 자녀는 더 빠르게 게임을 할 수 있다거나..
하는 식으로 활용이 가능합니다.

3) 커뮤니티 제공 쉐이더 캐시 다운로드:

이렇게 디스크에 저장된 쉐이더 캐시는 다른사람과 공유할 수도 있습니다.
인터넷등에 검색해보면, 이런식으로 미리 컴파일된 쉐이더 캐시를 제공하는 커뮤니티들이 있습니다. 이를 다운로드하여 각각의 환경에 맞게 설치하면 게임 시작 전 대부분의 쉐이더를 준비할 수 있습니다.

주의할 것은, 여러분이 사용하는 에뮬레이터와, 다운받는 에뮬레이터가 호환 가능해야하고,
GPU가 NVidia 제품이면, NVidia 용으로 컴파일 된 쉐이더를 다운 받는 등
서로 호환되는 쉐이더를 받아야 된다는 것입니다.

4) 멀티코어 CPU 및 고성능 GPU 사용

쉐이더 컴파일은 CPU와 GPU의 연산 속도에 크게 의존합니다. 최신 하드웨어일수록 빠르게 진행되므로 끊김이 줄어듭니다. 성능 좋은 GPU를 사용한다면 쉐이더 컴파일이 순식간에 완료되기 때문에, 그런 과정이 있는지도 모르고 게임을 할 수 있을 것입니다.

5) 그래픽 API 최적화

Vulkan과 같은 효율적인 그래픽 API를 사용하거나 에뮬레이터의 그래픽 설정을 조정하면 쉐이더 처리 부담을 일부 줄일 수 있습니다.


6. 마무리: 쉐이더 컴파일링을 이해하면 게임이 더 보인다

닌텐도 스위치 에뮬레이터에서 발생하는 쉐이더 컴파일링 현상은 최신 게임기의 프로그래머블 쉐이더로 인한 기술적 특성 때문입니다. 이는 에뮬레이터가 실시간 변환과 컴파일을 통해 해결해야 하는 필연적인 과정입니다.

이제 게임이 잠깐 멈출 때마다 단순한 렉이 아닌 쉐이더 컴파일링의 복잡한 과정을 떠올려 보세요. 해결책을 찾아 최적화된 환경에서 게임을 즐긴다면, 이 지연도 하나의 작은 배움이 될 것입니다.

관련글

hostnamectl 명령어로 hostname 변경하기

hostnamectl 명령어로 hostname 변경하

명령어) hostnamectl set-hostname 호스트명 hos...

맥 터미널 유용한 단축키 및 팁 모

저는 개인적으로 맥OS보다 윈도우를 더 선...

Leave a Comment