이 웹페이지는 이해를 돕기 위해 기계 번역으로 제공됩니다. 기계 번역으로 제공되는 콘텐츠에 대한 정확도나 신뢰도는 보장되지 않습니다. 번역된 콘텐츠의 정확도에 관해 의문이 있는 경우 웹페이지의 공식 영어 원문을 참고해 주시기 바랍니다.
Megapop이 Entity Component System(ECS) 의 성능과 확장성을 활용하여 밀도 높고 유기적으로 성장하는 수중 도시 건설 게임을 어떻게 구축했는지 알아보세요.
목표:
수만 마리의 해양 생물이 상호작용하는 시뮬레이션, 맞춤형 AI 작업 스케줄러, 역동적인 산호초 구현 등 모든 기능을 CPU 병목 현상 없이 구현했습니다.
플랫폼:
PC (스팀)
위치:
오슬로, 노르웨이
팀 규모:
정규직 직원 14명, 프리랜서 3명
Life Below 같은 게임은 어떻게 플레이어의 PC 과열시키지 않고도 밀도 높고 살아있는 해양 생태계를 시뮬레이션할 수 있을까요?
Megapop 의 새로운 "산호초 건설 게임"에서 플레이어는 죽어가는 해양 환경을 복원해야 합니다. 플레이어는 격자 위에 콘크리트 건물을 배치하는 대신 자연 그 자체가 되어 산호를 유기적으로 성장시키고 연약한 생태계를 관리하여 흰동가리, 게, 돌고래, 해달 등 55종 이상의 실제 해양 생물을 끌어들입니다.
Life Below 의 생동감 넘치는 미학과 게임플레이를 구현하기 위해서는 데이터 중심적인 디자인에 대한 전폭적인 노력이 필요했습니다. 이 팀은 물고기, 야생 동물, NPC 작업자로 구성된 네트워크를 복잡한 게임 오브젝트가 아닌 연속적인 메모리에 저장된 숫자와 같은 순수한 데이터로 취급함으로써 생물체의 행동, 렌더링 크기, 공간 오디오 및 생태계 시뮬레이션과 관련된 복잡한 문제를 해결하고 PC 에서 뛰어난 성능을 제공하는 경험을 구현했습니다.

성과:
- 초기 스트레스 테스트 동안 최대 25만 마리의 동일 종 물고기로 구성된 모의 무리
- 수천 마리의 몬스터가 활발하게 움직이는 후반 게임에서도 RTX 3060으로 60fps를 유지합니다.
- 저사양 컴퓨터에서도 1,300마리 이상의 동물이 상호작용하는 상황을 초당 30프레임으로 유지합니다.
- 전문 베타 테스터들로부터 97.2%의 만족도 평가를 받았습니다.
- 14시간 플레이한 후반부 게임 저장 파일에서 15,000개 이상의 엔티티와 450개 이상의 시스템을 처리하면서도 원활하게 작동합니다.
- 2025년 인류를 위한 Unity for Humanity) 지원금에서 장려상 수상

데이터 중심적 접근 방식에 전념하기
메가팝은 프리프로덕션 단계에서 Life Below를 ECS 플랫폼으로 완전히 제작하기로 결정했습니다. "ECS를 통해 우리는 대규모 클래스 계층 구조에 의존하는 대신, 서로 연동되는 여러 개의 작은 시스템으로 게임을 구성할 수 있습니다."라고 스튜디오 설립자이자 CEO인 요르겐 타랄드센은 말합니다. "이를 통해 더 작은 요소들을 조합하여 복잡한 시뮬레이션을 더 쉽게 구축할 수 있습니다."
메가팝 팀에게 있어 객체 지향 개발 패러다임에서 데이터 지향 개발 패러다임으로의 전환은 중대한 변화였습니다. 지식 격차를 해소하기 위해 Life Below 의 기술 책임자이자 프로젝트에서 ECS를 처음으로 옹호했던 ITR은 Unity의 공식 ECS 문서 와 ECS 샘플 부터 Unity Discord 커뮤니티와 YouTube의 실제 조언에 이르기까지 다양한 자료를 활용했습니다. " Turbo Makes Games 가 주최한 Hot Path Show는 DOTS와 ECS에 대한 보다 전문적인 정보를 얻는 데 특히 유용했습니다."라고 ITR은 말합니다.
프로그래머 시멘 위그가 라이프 빌 로우 출시 약 18개월 전에 메가팝에 합류했을 때, ECS 학습은 그의 온보딩 과정에 포함되어 있었습니다. 그는 "가장 중요한 것은 일반적인 객체 지향적 사고방식 대신 데이터 지향적 사고방식을 이해하는 것이었다"고 말합니다. "그 점을 이해하고 나니, 컴포넌트와 엔티티를 활용하는 것이 코드를 더 체계적으로 구성하는 데 얼마나 도움이 되는지 정말 마음에 들었습니다."
ITR은 ECS 온보딩에 가장 큰 변화를 가져온 원칙을 다음과 같이 밝혔습니다. "너무 많은 다양한 아키텍처를 혼합하려고 하기보다는 데이터 중심적인 접근 방식에 전념하십시오." 시스템을 작고 집중적인 형태로 유지하면 새로운 기능이 추가될 때 프로젝트 확장이 더 쉬워집니다.

Life Below | Megapop | Kasedo Games
NPC용 작업 스케줄러 만들기
Life Below 에서 플레이어는 산호초를 관리하는 물의 정령들로 구성된 NPC 작업팀에게 직접 명령을 내리지 않습니다. 대신, 플레이어는 목표(여기에 산호를 배치하거나, 이러한 자원을 채취하는 등)를 설정하고, 맞춤형 작업 스케줄러가 각 작업에 가장 적합한 작업자를 자동으로 할당합니다.
스케줄러는 Burst로 컴파일된 시스템 내에서 실행되며 세 단계로 작동합니다. 첫 번째 단계에서는 ECS를 사용하여 작업자 가용성, 리소스 위치 및 대기 중인 작업에 대한 일반적인 정보를 수집합니다. 두 번째 단계에서는 알고리즘이 작업 유형별 분포를 균형 있게 유지하면서 우선순위가 높은 작업을 선택합니다. 마지막으로 ECS를 사용하여 상세 정보를 검색하고 최적의 작업자를 찾아 각 단계를 계획합니다. ITR은 "우리는 계층적 함수 프로그래밍을 사용하여 새로운 작업을 쉽게 추가하는 동시에 게임이 손상된 상태에 빠지지 않도록 합니다."라고 설명합니다.
게임 후반 최고조에 달했을 때는 약 100명의 작업자가 동시에 작업합니다. 이 시스템은 단일 스레드 방식으로 작동합니다. 이는 기술적 한계 때문이 아니라, 각 작업 할당이 이전 작업의 결과에 따라 달라지기 때문입니다. ITR은 "운영체제의 작업 스케줄러와 유사하지만, 작업을 예약하기 전에 대략적인 소요 시간을 알 수 있다는 점이 다릅니다."라고 설명합니다.

Life Below | Megapop | Kasedo Games
복잡한 보이드 행동 시뮬레이션
많은 게임에서 간단한 GPU 또는 Burst 솔루션을 사용하여 무리 짓기 동작을 구현합니다. Life Below를 위해 Megapop은 종들이 사냥하고, 도망치고, 플레이어와 카메라를 마주하는 근접 장면을 포함하여 역동적으로 상호 작용하도록 해야 했습니다.
"간단한 보이드 시뮬레이션의 경우 Burst 나 GPU 계산을 사용하면 쉽게 실행할 수 있습니다."라고 요르겐은 말합니다. "하지만 우리는 서로 다른 종들이 상호작용하는 더욱 복잡한 행동 양상을 원했고, 심지어 근접 카메라 시점으로 야생 동물과 상호작용하는 모습까지 보고 싶었습니다."
팀은 작업 시스템을 사용하여 보이드 로직의 병렬화 가능한 부분(기본 위치 업데이트 및 거리 계산)을 포식자 추격과 같은 복잡한 분기 상호 작용과 분리했습니다. 모든 종이 성능 면에서 동일한 요구를 받는 것은 아닙니다. 게와 같은 바닥 먹이 생물은 시뮬레이션 비용이 비교적 저렴한 반면, 사자물고기와 같은 포식자는 매 프레임마다 여러 조건을 평가하여 다른 종을 사냥하고, 쫓고, 공격합니다.
대규모 공간 오디오 관리
수천 개의 활성 개체와 함께 동적 공간 오디오를 구현하는 것은 프로젝트에서 가장 어려운 과제 중 하나였습니다. 프로그래머 핑가르 뵈엔이 개발한 해결책은 주변의 생물들을 그룹으로 묶고, 개별 물고기의 행동이 아닌 그룹의 행동을 기반으로 소리를 재생하는 것이었습니다.
"종류, 집단 크기, 움직임, 타이밍과 같은 요소들이 소리가 언제 재생되어야 하는지를 결정하는 데 도움이 됩니다."라고 핑거는 설명합니다. "이를 통해 수천 종의 생물을 표현하면서도 자연스러운 음향 효과를 유지하고 CPU 비용을 관리 가능한 수준으로 유지할 수 있습니다."
ECS Jobs와 Burst 데이터 수집 단계, 즉 엔티티 위치를 수집하고 이를 효율적으로 병렬로 그룹화하는 작업을 처리하는 반면, 오디오 이벤트를 트리거하는 관리 코드는 가능한 한 최소한으로 유지됩니다. 또한, 해당 팀은 문자열 기반 FMOD 이벤트 ID를 GUID로 교체하는 작업을 진행 중이며, 이를 통해 가비지 할당을 줄이고 오디오 파이프라인의 버스트 가능성을 높일 수 있습니다.
살아있는 산호초를 구현하기
수천 개의 개체를 시각화하려면 고도로 최적화된 렌더링 파이프라인이 필요합니다. Megapop은 수영 주기와 같은 복잡한 동물 움직임에는 VAT(Vertex Animation Textures)를 사용하고, 작은 물고기 떼의 움직임에는 절차적 애니메이션을 사용합니다. 환경 또한 생태계의 건강 상태에 반응합니다. 산호는 ECS에서 직접 전달되는 매개변수를 기반으로 조류 성장, 스트레스 및 손상 상태를 역동적으로 나타냅니다.
엔티티 그래픽 및 GPU 인스턴싱
해당 팀은 개발 초기부터 GPU 인스턴싱을 사용했으며, 처음에는 사용자 지정 그래픽 API 호출을 통해 구현하다가 나중에는 Unity의 공식 Entities Graphics 패키지 로 마이그레이션했습니다. 이번 전환은 성능 향상 때문이 아니라, 두 접근 방식 모두 동일한 기본 기술을 기반으로 하기 때문입니다. 하지만 Entities Graphics를 도입하면서 시스템 사용이 훨씬 쉬워졌고 ECS 통합이 크게 개선되었습니다. 메가팝의 테크니컬 아티스트 겸 프로그래머인 아담 호브는 "사용하기가 훨씬 쉬웠고 ECS와의 연동도 훨씬 원활해졌습니다."라고 말했습니다.
Entities Graphics는 사용자 지정 ECS 구성 요소를 지원하며, 이러한 구성 요소는 해당 값이 실제로 변경된 경우에만 프레임마다 엔티티별 값으로 GPU에 자동으로 데이터를 업로드합니다. 이는 수백 개의 안정적인 개체가 불필요하게 버퍼 데이터를 다시 업로드하지 않는다는 것을 의미합니다. GPU 인스턴싱 자체는 화면에 수백 개의 산호와 장식물이 있어도 드로우 콜이 증가하지 않도록 보장합니다. ITR은 "GPU 인스턴싱을 사용하면 단 한 번의 드로우 콜로 수천 개의 산호를 렌더링할 수 있습니다."라고 설명합니다. "화면에 한 종류의 산호가 다섯 개 있든, 5천 개 있든, 렌더링 속도는 똑같습니다."

Life Below | Megapop | Kasedo Games
Shader Graph 통한 동적 산호
각 산호 개체는 건강, 조류 성장 및 스트레스 상태를 위한 ECS 구성 요소를 가지고 있습니다. Entity Graphics의 MaterialProperty 속성을 사용하면 이러한 속성이 자동으로 GPU에 업로드되어 Shader Graph 매개변수를 제어하므로 수동 재질 관리 없이도 탈색, 스트레스 색상, 조류 확산과 같은 시각적 변화를 생성할 수 있습니다. Shader Graph HLSL을 작성하지 않는 아티스트에게도 작업의 문을 열어주어 시각적 결과물을 직접 수정하고 변경 사항의 효과를 실시간으로 확인할 수 있도록 했습니다.
데이터 중심 코드 디버깅
데이터 중심 코드베이스를 디버깅하는 것은 일반적인 Unity 프로젝트를 디버깅하는 것과는 다른 분야이며, Megapop이 Unity 6를 사용하면서 얻은 경험은 해당 도구가 얼마나 성숙해졌는지를 보여줍니다. ITR은 "버전 6.0에서는 검색 창, 프로파일러 마커, 렌더링 그래프가 추가되었는데, 이 모든 기능이 최적화에 매우 유용했습니다."라고 밝혔습니다.
개발팀은 출시 전에 Unity 6.3으로 업그레이드했으며 , 최신 지원 LTS 버전에서 엔티티 계층 창 및 네이티브 디버거와 같은 도구가 상당히 안정화되었음을 확인했습니다.
엔티티 계층 구조는 런타임에 엔티티 상태를 검사하는 데 필수적이었으며, JetBrains Rider의 ECS 관련 기능(코드를 단계별로 실행하는 동안 특정 엔티티의 구성 요소 정보를 볼 수 있는 기능 포함) 덕분에 기본 디버거가 훨씬 더 유용해졌습니다. ECS 저널링은 시스템이 예기치 않게 구성 요소를 변경한 경우를 식별하고 최적화 중에 불필요한 쓰기 작업을 표시하는 데 도움이 되었습니다.
그래픽의 경우, 프레임 디버거 와 RenderDoc을 Unity 6의 렌더 그래프 시스템 과 결합하여 GPU 리소스가 정확히 어디에서 사용되는지 추적했습니다.
Burst 이용한 성능 향상
버그 신고로 제출된 14시간 플레이 저장 파일에는 15,000개의 엔티티와 450개 이상의 활성 시스템이 포함되어 있었지만, 그럼에도 불구하고 60fps로 원활하게 실행되었습니다. 전체 생태계 시뮬레이션은 일반적인 게임 후반 시나리오에서 프레임당 약 0.5ms의 CPU 시간을 소모하는데, 이는 게임이 렌더링 프레임당 고정 업데이트를 여러 번 실행하는 시간 가속을 지원하기 때문에 중요합니다.
Burst 이러한 수치를 달성하는 데 핵심적인 역할을 합니다. 버스트 기능을 비활성화하면 시뮬레이션이 프레임당 3배 이상 오래 걸립니다. ITR은 "많은 시스템에서 Burst 만으로도 최적화가 충분하다는 것을 알게 되었지만, Jobs는 여러 엔티티를 반복적으로 처리하는 특정 병렬화 가능한 코드 부분에 더 적합했습니다."라고 설명합니다.
단일 종 스트레스 테스트에서: ITR의 8년 된 개인용 컴퓨터에서 초당 60프레임으로 게 3,500마리를, 고성능 업무용 노트북에서는 활발한 생물 상호작용이 있는 상황에서 초당 50프레임으로 게 7,000마리 또는 흰동가리 5,500마리를 처리할 수 있었습니다. DOTS 네이티브 컬렉션 및 할당자는 팀의 이전 프로젝트에 비해 프레임당 가비지 할당량을 크게 줄였습니다.
경험에서 배우기
Life Below는 실제 해양 생물학과 복잡한 시스템 공학을 결합하여 도시 건설 게임 장르에서 독특한 위치를 차지하고 있습니다. Megapop의 최신 릴리스는 시뮬레이션 중심 게임을 처리할 때 Unity 용 ECS의 확장성을 입증하며, 순수한 성능 향상을 넘어 구조적인 이점까지 보여줍니다. 개발팀은 어셈블리를 데이터와 로직으로 깔끔하게 분리할 수 있었던 덕분에 Life Below가 비슷한 규모의 다른 프로젝트보다 훨씬 빠르게 컴파일되었다고 언급했습니다.
Unity 용 ECS를 사용하여 게임 개발을 고려하는 개발자들에게 있어, 팀의 경험은 한결같습니다. 학습 곡선은 분명히 존재하지만, 투자한 만큼의 보상을 얻을 수 있다는 것입니다. 메가팝의 차기 프로젝트에서 기술 책임자를 맡고 있는 아담은 이미 ECS를 활용할 계획을 세우고 있다. "이미 구축되어 있으면, 그 위에 쌓아 올리고 확장하기가 쉽습니다."라고 그는 말합니다.
Unity 로 더 나은 빌드를 만들어보세요.
확장성이 뛰어난 시뮬레이션 중심 게임을 개발하세요. ECS for Unity 는 복잡하고 생동감 넘치는 세계를 구현하는 데 필요한 성능과 아키텍처 도구를 제공합니다.
