Game teardown

확대 렌더링: 대규모 객체 처리를 위한 효율적인 전략

MATTHEW WOJTECHKO / MEGA CAT STUDIOSLead Game Developer
Aug 14, 2026
Mega Cat Studios와 Playground Productions가 제작한 Backyard Baseball 2026의 동네 풍경
이 웹페이지는 이해를 돕기 위해 기계 번역으로 제공됩니다. 기계 번역으로 제공되는 콘텐츠에 대한 정확도나 신뢰도는 보장되지 않습니다. 번역된 콘텐츠의 정확도에 관해 의문이 있는 경우 웹페이지의 공식 영어 원문을 참고해 주시기 바랍니다.

이 글은 메가캣 스튜디오에서 작성한 시리즈의 네 번째 게시물입니다. 이 글에서 매튜 워이테코는 URP와 HDRP 모두 사용하면서 얻은 성능 관련 교훈을 살펴보고, 매 밀리초가 중요한 잔디 렌더링을 위한 사용자 지정 배치 렌더러 그룹 구현과 같은 고급 솔루션을 탐구합니다.

이 시리즈의 다른 블로그 게시물도 읽어보세요:

수천 개의 객체를 프레임 드롭 없이 렌더링하는 것은 끊임없는 도전입니다. 밀집된 도시 경관과 광활한 풍경은 현대 게임의 특징이 되었습니다. 하지만 이러한 풍경은 플레이어에게는 숨 막힐 듯 아름답지만, 초당 60프레임(fps)의 부드러운 작동을 유지해야 하는 엔지니어에게는 골칫거리가 될 수 있습니다.

그리고 모바일이나 무선 기기처럼 성능이 낮은 플랫폼을 대상으로 한다면, 문제가 되는 것은 풍경뿐만이 아닙니다. 세부적인 내용이 조금이라도 포함되어 있다면 어떤 환경이든 하드웨어에 과부하를 일으킬 수 있습니다.

메가캣 스튜디오 는 수년간 유니티 렌더링 시스템의 성능을 극대화하기 위해 노력해 왔으며, 예술적 의도를 훼손하지 않으면 서 백야드 베이스볼 의 매력적인 아트 스타일을 PC와 콘솔에서 구현하기 위해 모든 기술을 동원했습니다.

이번 포스팅에서는 정적 배치 처리 및 정점 애니메이션 텍스처와 같은 기술을 살펴보고, 지금까지 저희가 개발했던 가장 큰 규모의 3D 타이틀에서 겪었던 문제점들을 공유하여, 오브젝트 수가 폭발적으로 증가하는 상황에서도 프레임 속도를 원활하게 유지하는 데 도움을 드리고자 합니다.

겉보기에는 단순해 보이는 환경이라도 저사양 하드웨어에서는 렌더링하기 어려울 수 있습니다.
겉보기에는 단순해 보이는 환경이라도 저사양 하드웨어에서는 렌더링하기 어려울 수 있습니다.

렌더링 문제를 일으키는 원인을 조사한 후 최적화하세요.

렌더링은 CPU와 GPU의 협업 작업입니다.

"CPU는 코치이고, GPU는 선수입니다." "CPU가 작전을 지시하면 GPU가 이를 실행합니다."라고 Backyard Baseball의 최적화 엔지니어인 리암 두다스는 말합니다.

때때로 GPU가 수행해야 하는 작업은 다른 작업보다 시간이 더 오래 걸립니다. 복잡한 메시, 셰이더 및 조명은 속도 저하를 유발할 수 있으며, 성능을 향상시키는 가장 좋은 방법은 아티스트에게 이러한 에셋을 최적화하도록 요청하여 복잡성을 줄이는 것입니다.

때로는 CPU가 GPU에게 무엇을 하라고 요청하는지가 아니라, 어떻게 요청하는지가 중요한 경우도 있습니다.

CPU가 명령어를 최적의 상태로 실행하고 있는가? 무엇을 그려야 할지 파악하는 데 시간이 너무 오래 걸려서 CPU가 게임을 실행하는 대신 시간을 허비하고 있는 건가요? CPU가 중복해서 정보를 제공하고 있습니까? 훌륭한 코치는 팀에게 예상치 못한 역전승을 이끌어낼 수 있지만, 최적화에 있어서는 단순히 시스템이 "더 열심히 노력하도록" 하는 것만으로는 충분하지 않습니다. 핵심은 그들이 다루는 정보와 그들이 정보를 전달하는 방식을 이해하는 것입니다.

이는 CPU가 GPU에 전달하는 드로우 콜을 최적화하는 문제로 귀결됩니다. 특히 렌더링해야 할 객체가 수만 개에 달할 때는 한 번의 호출에 더 많은 작업을 담을수록 좋습니다.

이를 달성하는 데에는 여러 가지 방법이 있지만, 시도하기 전에 한 가지 주의할 점이 있습니다.

단순히 멋진 코드를 작성한다는 스릴만을 위해 무턱대고 최적화를 시도하지 마세요. 항상 벤치마킹을 먼저 하세요. 프로젝트에서 가장 문제가 되는 부분을 찾아보세요. 가장 먼저 스스로에게 물어봐야 할 질문은 다음과 같습니다. CPU가 병목 현상을 일으키는 건가요, 아니면 GPU가 병목 현상을 일으키는 건가요?

이 글에서 소개하는 해결책 중 일부는 CPU 속도를 향상시키고, 다른 일부는 GPU 속도를 향상시킵니다. 프레임 드롭의 원인이 되는 프로세서가 다른 하나인데, 그 프로세서 최적화에만 몰두하는 것은 바람직하지 않습니다. 게임이 CPU 성능에 좌우되는지 GPU 성능에 좌우되는지 판단한 후에는 어떤 절차가 가장 오래 걸리는지 조사하고 해당 절차를 최적화하세요. Unity의 프로파일링 모범 사례 가이드는 시작하기에 좋은 자료이며, 여기에는 종종 이해하기 어려운 프로파일링 프로세스에 대한 지침을 제공하는 유용한 순서도가 포함되어 있습니다.

"저는 프로파일링을 많이 해야 해요."라고 리암이 말합니다. "CPU가 많이 작동하고 GPU가 그렇지 않을 때와 그 반대의 경우를 구분할 수 있어요." 실제로, 우리의 가장 큰 병목 현상은 서로 다른 시기에 이 두 가지 모두에서 발생했습니다."

이 글의 마지막 부분에는 여러분의 프로파일링 여정에 도움이 될 만한 유용한 자료들을 모아두었습니다.

자, 그럼 이 점을 미리 말씀드렸으니 최적화에 대해 살펴보겠습니다.

단순화 및 제거

렌더링을 할 때, 어떤 메시를 어디에 렌더링할지 결정해야 합니다.

메시의 수가 많아지고 필요한 드로우 콜이 많아질수록 CPU는 GPU가 다음 작업을 기다리는 동안 무엇을 해야 할지 계속해서 파악해야 합니다.

메시 개수를 줄이면 처리 속도를 높일 수 있습니다. 예를 들어, 복잡한 메시를 모조품, 광고판 또는 저해상도 버전으로 교체하거나, 광활한 세계를 한 번에 렌더링해야 하는 요소의 양이 적은 더 작은 레벨로 나눌 수 있습니다. 이러한 방법들은 검증된 해결책이므로 가능하면 사용하는 것이 좋지만, 환경 설정에 필요한 세부 정보 수준에는 한계가 있습니다.

이 문제를 피하고 구현하기 쉬운 최적화 방법 중 하나는 오클루전 컬링입니다. 카메라가 시야각 내에 있는 것을 확인하고 플레이어가 볼 수 없는 것은 렌더링하지 않도록 하는 방식입니다. 이렇게 하면 메모리 사용량이 증가하는 대신 시간을 절약할 수 있지만, 사무실 건물의 세부적인 방처럼 고정된 메시가 많은 환경에서는 그럴 만한 가치가 있는 경우가 많습니다. 이러한 최적화는 업계 표준이지만, 그것만으로는 충분하지 않은 경우가 많습니다.

정적 배치

다양성을 희생하지 않고 렌더링할 메시의 수를 제한하는 또 다른 방법은 여러 메시를 하나의 메시로 결합하는 것입니다.

이 작업은 직접 수동으로 진행할 수 있습니다. 또는 메시들이 동일한 재질을 공유하는 한, Unity 배치 처리라는 프로세스를 통해 이 작업을 자동으로 수행해 줍니다. 게임 오브젝트를 static으로 설정하면 Unity 드로우 콜 수를 줄이기 위해 동일한 재질을 가진 모든 메시를 자동으로 일괄 처리합니다. 이 옵션은 나무나 벽처럼 움직이지 않는 물체에 사용하세요.

이를 통해 RAM 사용량과 CPU 오버헤드가 크게 줄어들어 GPU가 한 번에 더 많은 콘텐츠를 렌더링할 수 있습니다. 하지만 결합된 메시를 저장하는 데 더 많은 GPU 메모리가 사용된다는 점을 명심하십시오.

정적 배치 처리는 특히 Backyard Baseball 과 같은 게임에서 가장 중요한 최적화 프로세스 중 하나입니다. URP의 배치 시스템 사용은 간단하므로 가장 어려운 부분은 가능한 한 많은 모델에 걸쳐 가능한 한 적은 재료를 사용하는 방법을 파악하는 것입니다. 그러한 균형 유지가 바로 우리 최적화 및 아트 팀에 가장 창의적인 고양이들이 있는 이유입니다.

GPU 인스턴싱

사물 자체와 그 사물의 인스턴스 를 구분하기 시작하기에 좋은 시점입니다.

메쉬가 있다고 가정해 봅시다. 메시는 자산입니다. 그리고 그 재료는 자산입니다. 그것들은 파일 구조에 존재하는 단일 파일입니다. 게임에서 3D 형태를 가진 모든 오브젝트는 메시로 모양을 나타내고, 머티리얼로 표면의 모양을 나타냅니다.

하지만 Unity 세부 사항을 단순화했기 때문에 일부 개발자는 게임이 실행될 때 실제로 이러한 요소의 복사본이 게임 세계에 여러 개 생성된다는 사실을 깨닫지 못합니다. 플레이어가 숲을 탐험할 때, 게임 파일에 에셋으로 저장된 그 나무의 수많은 복제본 사이를 이동하게 됩니다.

이것이 바로 Backyard Baseball 에서 나뭇잎 표현에 GPU 인스턴싱을 사용한 이유입니다. CPU는 트리의 각 복사본을 GPU에 개별적으로 호출하여 렌더링하는 대신, GPU에 동일한 모델을 모두 한 번에 렌더링하도록 요청합니다. 주의하지 않으면 숲속의 모든 나무가 똑같이 보일 수도 있습니다. 하지만 재질 셰이더에 몇 가지 효과적인 매개변수를 사용하면, 예를 들어 나뭇잎 색상을 사용자 지정하는 값을 설정하면, 각 나무를 개별적으로 요청하는 대신 하나의 모델과 재질, 그리고 각 나무에 대한 고유한 색상을 GPU에 전달할 수 있습니다.

나뭇잎은 GPU 인스턴싱에 적합한 경우가 많습니다.
나뭇잎은 GPU 인스턴싱에 적합한 경우가 많습니다.

머티리얼에서 '인스턴스 활성화' 설정을 켜면 Unity 동일한 머티리얼을 사용하는 여러 머티리얼 인스턴스를 하나의 드로우 콜로 결합하게 됩니다. 이는 메시의 다양성과 성능 사이의 균형을 맞추는 훌륭한 방법입니다. 또한 정적 배치 처리와 달리 GPU 인스턴싱은 장면에서 움직이는 게임 오브젝트에 사용할 수 있으므로 벽이나 나무와 같은 사물뿐만 아니라 잔해나 사무용품과 같은 소품도 최적화할 수 있습니다.

정점 애니메이션 텍스처

정적 배치 처리와 GPU 인스턴싱은 메시와 재질을 최적화하는 두 가지 서로 다른 방법입니다. 하지만 때로는 애니메이션이 병목 현상을 일으키는 원인이 되기도 합니다. 앞서 언급한 간단한 숲의 예를 다시 살펴보겠습니다. 이제, 나뭇가지와 잎사귀들이 바람에 살랑살랑 흔들리는 모습을 상상해 보세요. 마치 독특하고 자연스러운 움직임처럼 말이죠. 일반적인 방식으로 10,000개의 서로 다른 애니메이션 프로세스를 실행하는 것만으로는 충분하지 않습니다. 조심하지 않으면 불쌍한 CPU가 숨쉬기조차 힘들어할 거예요!

한 가지 요령은 정점 애니메이션 텍스처(VAT)를 사용하는 것입니다. VAT라는 프로그램이 GPU의 처리 능력을 무단으로 점유하여 애니메이션 작업을 시도합니다.

메가캣 스튜디오의 수석 개발자인 데이비드 차베스 아르멘테로스에게 있어, VAT를 사용하여 군중을 시뮬레이션하는 것은 그가 최적화했던 그래픽 구현 중 가장 좋아하는 것 중 하나였습니다.

그는 "애니메이터에서 표준 스킨드 메시 렌더러를 사용하면 성능 저하가 시작되기 전에 수십 개의 캐릭터만 렌더링할 수 있습니다."라고 말합니다. "하지만 VAT와 GPU 인스턴싱을 결합하면 수천 개의 애니메이션 개체를 화면에 한 번에 표시할 수 있습니다."

VAT를 사용하면 각 메시 정점은 매 프레임마다 텍스처에서 애니메이션된 위치 정보를 읽어옵니다. 이를 위해 위치 및 회전 데이터를 RGB 값으로 인코딩합니다. 그런 다음 특수 셰이더가 텍스처의 모든 픽셀을 읽어 모든 정점을 어떻게 이동해야 하는지 결정합니다.

이것이 바로 저희 가 '뒷마당 야구' 에서 흔들리는 잔디를 표현하는 데 사용한 것입니다. 부드러운 애니메이션을 만드는 효율적인 방법이지만, 이는 순전히 시각적인 효과일 뿐이며 충돌체는 변하지 않는다는 점을 기억하세요. 따라서 VAT는 움직임은 필수적이지만 정확한 충돌 감지는 필요하지 않은 시나리오에 이상적입니다.

Backyard Baseball에서 흔들리는 잔디는 버텍스 애니메이션 텍스처(VAT)를 통해 구현됩니다.
Backyard Baseball에서 흔들리는 잔디는 버텍스 애니메이션 텍스처(VAT)를 통해 구현됩니다.

모든 최적화에는 절충점이 따릅니다. VAT는 CPU의 부담을 줄여주지만, RAM에는 약간의 추가 부담을 줍니다. 이 모든 것은 게임 내 다른 렌더링 솔루션과 균형을 이루어야 합니다.

"이 시스템에서 가장 어려웠던 점은 무선 기기의 제한된 리소스에 맞춰 메모리 사용량과 GPU 기반 컬링 연산 사이의 균형을 맞추는 것이었습니다."라고 Backyard Baseball 의 기술 아티스트인 Jordan Latta는 말합니다.

URP와 HDRP

그래픽 최적화를 할 때 가장 먼저 해야 할 일은 프로젝트를 시작할 때 어떤 렌더링 파이프라인을 선택할지 결정하는 것입니다. URP(범용 렌더링 파이프라인)는 기본 성능이 우수하며 모바일 및 무선 장치에 필수적인 기술입니다. 고화질 렌더링 파이프라인(HDRP)은 고품질 비주얼을 목표로 하며, 보다 특화된 인스턴싱 동작을 제공합니다.

일반적으로 Unity 에서는 HDRP 보다 URP를 사용하는 것을 권장합니다. HDRP 필요한 사용 사례가 있을 수도 있지만, 우리는 다음과 같은 간단한 원칙에 따라 움직입니다. 렌더링 효율을 최대한 높이세요.

HDRP 고급 기능을 제공하지만, 사실적인 시각적 품질을 목표로 하지 않는다면 사용하지 않는 것이 좋습니다.

추가 최적화 팁

화면에 수천 개의 객체가 있을 때 발생하는 문제는 렌더링 자체에 있는 것이 아닐 수도 있습니다. 이건 당신이 직접 작성한 코드입니다. 그런 경우를 위해 다음과 같은 몇 가지 요령을 활용해 보세요.

  • 수천 개의 업데이트 루프를 하나로 통합합니다. 각 게임 오브젝트에 개별적인 MonoBehaviour를 부여하는 대신, 모든 MonoBehaviour를 하나로 통합하여 동일한 Update 함수를 공유하도록 하세요. 중앙 집중식 관리자는 수천 건의 개별 업데이트 루프를 방지하는 데 도움이 됩니다.
  • 모든 작업을 동일한 스레드에서 실행하는 대신 멀티스레딩을 사용하십시오. 게임에 직업 시스템Burst 컴파일러가 적합한 옵션인지 살펴보세요.
  • 숨겨진 아이템을 현금으로 바꾸세요. 매 프레임마다 메인 카메라나 게임 오브젝트의 트랜스폼을 가져오는 대신, 한 번만 캐시해 두고 그 참조를 재사용하세요. 타로데프는 성능 향상을 시연하고 다른 최적화 방법들도 설명합니다.

다음 프로젝트에서 렌더링 성능을 가장 크게 향상시킬 수 있는 방법은 아마도 Unity 의 최신 LTS 버전을 사용하는 것일 겁니다. Unity 6.3 LTS는 성능 향상을 위한 최적화를 포함하여 다양한 개선 사항을 자랑합니다.

Backyard Baseball 의 경우, 가장 간단하면서도 효과적인 최적화 방법은 텍스처 사용량을 줄이는 것이었습니다.

필요한 텍스처보다 두 배나 더 많이 사용하게 되는 교묘한 방법들이 몇 가지 있습니다.

  • 셰이더 : 셰이더가 서로 다른 두 경우에 텍스처를 사용하고, 이때 동일한 참조를 공유하지 않으면 메모리의 여러 위치에 텍스처를 로드할 수 있습니다.
  • 스크립트 : 마찬가지로 코드베이스의 여러 영역에서 서로 다른 참조를 통해 동일한 텍스처를 로드할 수 있습니다.
  • Version Control : 두 개발자가 각자의 로컬 브랜치에 동일한 파일을 추가할 때, 브랜치가 병합될 때 두 파일 모두 그대로 유지되는 경우가 있어 불필요한 저장 공간을 낭비하게 됩니다.

우리는 이러한 문제점들을 미리 인지하고 발생하기 전에 예방하려고 노력하지만, 지나치게 엄격하면 빠른 속도로 진행되는 반복 주기가 느려집니다. 프로젝트 개발 후반 단계에 접어들면 저희 최적화 전문가들이 셰이더, 에셋, 스크립트를 검토하는 역할을 맡게 됩니다.

메가캣 스튜디오 에서는 이러한 전략을 통해 불과 몇 년 전만 해도 상상할 수 없었던 장면들을 구현할 수 있습니다.

저희에게 렌더링은 기본적으로 마법과 같습니다. 상상하는 모든 것을 실시간으로 만들어낼 수 있지만, 그러기 위해서는 (Unity 문서, 블로그 게시물, 유튜브 튜토리얼과 같은) 숨겨진 핵심 내용을 꼼꼼히 연구해야 합니다. 다행히도 저희 직원 중에는 문서 분석에 열정을 쏟고 그 결과를 팀과 공유하는 데 탁월한 능력을 가진 전문가들이 있습니다.

물론 가장 큰 수혜자는 바로 우리 선수들입니다. 팬 여러분께서 Backyard Baseball을 즐겁게 탐험하시면서, 그 세계를 현실처럼 느끼게 만들기 위해 얼마나 많은 노력과 땀, 그리고 마법이 들어갔는지조차 생각하지 않으시기를 바랍니다.

자세히 알아보기