Unity 검색

데이터 지향 설계 라운드테이블: Q&A

2024년 2월 28일 엔진 & 플랫폼 | 9 분 소요
DOTS webinar questions
DOTS webinar questions
공유

Is this article helpful for you?

Thank you for your feedback!

지난 12월, 유니티는 Stunlock Studios(V Rising)와 Sunblink Entertainment(HEROish, Hello Kitty Island Adventure)를 초빙해 DOTS를 주제로 한 크리에이터 라운드테이블을 주최했습니다. 초대받은 얼리어답터들은 DOTS(데이터 지향 기술 스택) 사용 경험을 공유하고, 데이터 지향 프로그래밍으로 게임에 구현했던 기능을 선보였으며, Unity 2022 LTS의 최신 ECS(엔티티 컴포넌트 시스템) 기술을 어떻게 활용하는지 이야기해 주었습니다.

웨비나 도중 Q&A 시간에는 시청자들로부터 유익한 질문이 너무나 많이 쏟아지는 바람에 모든 질문에 실시간으로 답변을 드리기 어려웠습니다. 추가 답변을 위해, 유니티의 소프트웨어 엔지니어링 디렉터 조 발렌주엘라와 Stunlock Studios의 테크니컬 디렉터 라스무스 회크에게 세션에서 나온 인상적인 질문 몇 개에 대한 답변을 들어 보았습니다. 두 전문가와의 Q&A는 아래에서 확인할 수 있으며, 데이터 지향 설계를 통한 게임의 잠재력 극대화 웨비나는 여기에서 시청할 수 있습니다.

V Rising by Stunlock Studios
Stunlock Studios의 V Rising

“새 프로젝트에 곧바로 DOTS를 사용하는 것이 좋을까요, 아니면 일반적인 게임 오브젝트로 시작한 다음 ECS로 완전히 전환하거나 하이브리드 형식으로 성능을 최적화하는 것이 좋을까요?”

조 발렌주엘라: ECS와 DOTS, DOD(데이터 지향 설계)로 성능만 향상되는 것은 아닙니다. OOP(객체 지향 프로그래밍)를 사용해 문제를 모델링할 때 수반되는 복잡성도 피할 수 있습니다.

특히 권한 서버와 클라이언트측 예측(client-side prediction)을 활용하는 멀티플레이어 게임을 제작하려면 DOTS로 시작하는 편이 좋죠. Netcode for Entities는 확장이 가능하고 간단한 게임플레이 코드를 작성할 수 있는 매우 안정되고 강력한 시스템을 제공합니다.

제작 중인 게임이 멀티플레이어 게임이 아니거나, 프로토타이핑하며 새로운 것을 빠르게 시도해 보고 싶다면 MonoBehaviour/게임 오브젝트를 활용하는 편이 좋을 수 있습니다.

“DOTS 시스템만으로 게임을 제작할 수 있나요? 아니면 DOTS는 게임 오브젝트 시스템만 지원하나요?”

조 발렌주엘라: 아닙니다. 진행 중에 게임 오브젝트가 필요한 시점이 올 겁니다. 현재 연구 중인 사항이기도 해요.

“DOTS의 단점 또는 개발자가 DOTS 사용을 지양해야 할 사례가 있다면 무엇이 있을까요?”

조 발렌주엘라: 저는 대답하기 어렵네요. Unity에서 DOTS 말고 다른 시스템을 사용해야 할 사례가 있을지 모르겠어요. 굳이 말하자면, 프로토타이핑 작업에는 전통적인 MonoBehaviour/게임 오브젝트 기반 프로젝트가 매우 바람직할 것으로 보입니다. 빠른 변경이 예상된다면 베이커를 만들거나 데이터를 설계하느라 많은 시간을 소모하지 않는 편이 좋습니다. 앞으로 DOTS에서 간소화하고 싶은 영역이죠.

“라스무스 님, 데이터 지향 프로그래밍과 관련해 엔지니어들에게 하고 싶은 조언이 있나요?”

라스무스 회크: 실제로 문제가 발생했을 때 해결할 수 있도록 가능한 한 단순하게 코드를 작성하며 시작하는 것이 좋다고 생각합니다. 초보 프로그래머의 마인드를 가지고 원하는 대로 작동하는 코드를 작성할 수 있게 될 때까지 결과 지향적으로 코드를 작성해 보세요. 처음부터 재사용할 수 있는 코드를 작성하거나 추상화하는 등의 목표를 세울 필요는 없습니다.

ECS를 활용하는 작업을 시작할 때는 지나치게 생각하거나 너무 많은 기능을 구현하려 하지 마세요. 처음에는 작은 조각 여러 개로 나누기보다는 큰 컴포넌트와 시스템을 사용하면 됩니다. 그러면 코드를 쉽게 따라갈 수 있습니다. 필요하면 나중에 작은 단위로 나누면 됩니다. 처음에는 저희도 그런 오류를 범했죠.

데이터 지향 프로그래밍을 연습할 좋은 기회는 최적화가 필요한 대상이 있을 때입니다. 실질적인 문제를 대상으로 실험하고 결과를 평가해 볼 수 있으니까요. 데이터를 고려하는 것이 얼마나 중요한지도 알게 될 겁니다.

“DOTS를 사용해 게임의 규모와 목표를 확장한다는 이야기를 많이 들었습니다만, 규모를 축소하는 경우에도 DOTS가 주는 이점이 있나요? 이를테면 작은 프로젝트에 DOTS를 활용해 저사양 시스템을 타게팅하는 경우는 어떨까요?”

조 발렌주엘라: 저사양 시스템에서 DOTS를 효율적으로 사용하면 시스템이 실행할 수 있는 시뮬레이션 코드의 품질이 향상됩니다. 배터리로 작동하는 디바이스의 경우 배터리 요구 사항이 줄어들며, 따라서 실행 시간이 늘어나고 전반적인 시스템의 상태가 개선됩니다.

V Rising by Stunlock Studios
Stunlock Studios의 V Rising

“SystemBase에서 ISystem으로 전환할 때, 관리되는 코드에 대한 호출은 어떻게 처리하나요?”

조 발렌주엘라: 기술적으로 말하면 ISystem을 사용하더라도 관리되는 코드를 제거할 필요가 없습니다. ISystem에서도 관리되는 코드를 호출할 수 있으니까요. 관리되는 데이터는 ISystem 내부에 직접 저장할 수 없으므로 저는 관리되는 컴포넌트 데이터를 사용합니다.

하지만 Burst를 사용해 코드에서 최고의 성능을 얻기 위해 ISystem에서 관리되는 코드 호출을 삭제하는 방법을 물으신다면, 상황에 따라 다르다고 답변할 수 있겠네요. 

.NET 컨테이너를 사용한다면 com.unity.collections에서 적절한 대체 항목을 찾을 수 있을 겁니다. 관리되는 Unity API를 사용 중이고 관리되지 않는 대체 항목이 없는 상황이라면, '데이터 가져오기' 단계와 '처리' 단계로 작업을 나누고 처리 단계에 ISystem 기반 프로세싱을 적용하면 됩니다.

“기술 자료를 보면 ECS가 여러 씬 아키텍처와 호환되지 않는다는 내용이 있습니다.이때는 ECS를 어떻게 사용해야 하나요?”

조 발렌주엘라: ECS를 사용하더라도 여러 Unity 씬의 애디티브 로딩은 가능합니다. 다만 그렇게 로드한 씬에는 게임 오브젝트 및 MonoBehaviour만 있고 ECS 데이터는 포함되지 않습니다.

서브 씬은 얼마든지 저작(author)할 수 있으며, 각 서브 씬은 저작 게임 오브젝트 및 MonoBehaviour 데이터를 런타임에 로드할 수 있는 컴팩트 엔티티와 컴포넌트 데이터로 베이크합니다. 서브 씬은 섹션으로 더 분할할 수 있으며 각 섹션은 필요에 따라 스트림 인 또는 스트림 아웃될 수 있습니다.

“하이브리드 MonoBehaviour/DOTS를 사용한다면 프로젝트의 결정론적 분명성에 어떻게 또는 얼마나 많은 영향을 주게 되나요?”

조 발렌주엘라: 결정론적 분명성은 바이너리 상태가 아니며, 실행할 때마다 모든 실행 세부 사항이 같을 것이라 보장할 수 없습니다. 일반적으로, 하이브리드 상호호환성이 프레임별로 완벽하게 재현하지 않아도 되는 파티클 시스템이나 오디오 같은 표현 세부 사항에 필요한 경우가 있습니다.

예측형 게임플레이 같은 기능은 시뮬레이션을 ECS에서 실행하는 편이 좋습니다.

수백 개의 시스템을 어떤 식으로 관리하나요? 모든 시스템이 동시에 실행되고, 쿼리에 엔티티가 없을 때는 로직을 실행하지 않는 방식인가요? 아니면 게임 상태에 따라 상황에 맞게 시스템을 활성화하나요?

조 발렌주엘라: 개발 편의를 위해 기본적으로 시스템이 업데이트되도록 만들었습니다. 성능의 차이가 크지는 않지만, 실제로 시스템의 수가 수백 개인 경우라면 RequireForUpdate를 호출하거나 RequireMatchingQueriesForUpdate 속성을 활용해 필요에 따라 업데이트되도록 하는 편이 좋을 수 있습니다.

이 경우 보통 관련 시스템에 RequireForUpdate<Foo>()를 추가하고 씬에서 해당 시스템을 업데이트하는 플래그로 Foo IComponentData를 사용합니다.

“게임플레이 도중 런타임에 대량의 데이터를 처리할 때, 특히 렌더링 시 DOTS를 활용하면 성능이 향상된다고 들었습니다. 하지만 DOTS를 활용하면 리팩터링의 필요성을 줄여 프로덕션 성능이 개선된다고 듣기도 했습니다. DOTS가 리팩터링에 어떤 도움을 주는지 설명해 주시겠어요?”

조 발렌주엘라: DOTS, ECS, DOD의 전반적인 장점으로, 시뮬레이션 상태를 더 잘 확인하고 검사할 수 있다는 점을 들 수 있습니다. OOP 라이브러리에 테스트를 추가해 본 적이 있다면 '간단한' 메서드 인스턴스를 호출하는 데 필요한 상태를 모사하기 위해 많은 기능을 목업으로 구현하거나 인스턴스화해야 하는 문제에 직면한 적이 있을 겁니다. DOD 스타일의 시스템에서는 거의 언제든지 변환 커널을 스탠드얼론 함수로 나타내 값의 타입을 변환할 수 있습니다.

그러면 훨씬 더 추론하고, 테스트하고, 병렬화하기 쉽죠.

“전문적인 경험에서 하는 말은 아니지만, DOD를 사용하니 데이터와 아키텍처가 긴밀하게 결합하여, 데이터 구조 변경 시 대규모 리팩터링 작업이 필요했습니다. 라스무스 님도 같은 경험이 있으신가요? 이런 문제를 어떻게 처리하거나 방지하셨나요?”

라스무스 회크: 제 경험으로는 ECS를 사용하기 전에도 데이터를 변경하면 해당 데이터를 사용하는 코드를 수정해야 했습니다. 따라서 전보다 더 힘들거나 하지는 않았어요.

조 발렌주엘라: 시간이 지나며 진화한 문제인 만큼, DOD나 ECS가 가진 근본적인 문제 같지는 않습니다.

우선 첫째로, 기존에는 보통 인스턴스 지향 함수와 클래스 계층 구조를 만드는 방법으로 OOP의 긴밀한 결합을 끊었습니다. 이론적으로는 좋지만, 효율적인 프로그래밍에서 이런 추상화는 가장 먼저 제거해야 하죠.

ECS에서 유틸리티 함수를 작성하는 데 방해가 되는 요소는 없습니다. 분명히 ECS에서 특정 쿼리의 데이터 계약을 변경하면 시스템을 수정해야 하지만, 이는 분산된 형태로 데이터를 쿼리하고 있기 때문일 수도 있습니다. 컴포넌트 데이터를 반복적으로 변환하고 있나요? 코드를 다시 작성해 프레임별 변환 횟수를 줄일 수 있나요? 컴포넌트 데이터를 반복적으로 읽고 있나요? 프레임 초반에 불변 데이터 구조로 바꿀 수도 있을 것입니다.

끝으로, DOD 또는 적어도 ECS는 더 많은 문제 상태를 명확하게 보여 준다고 말할 수 있습니다. 이건 부정적인 요소가 아닙니다. 다른 상호 절충 요소라 할 수 있죠. 저는 리팩터링을 하더라도 긴밀한 결합을 추론하는 것을 느슨하거나 암시적인 결합을 추론하는 것보다 선호합니다.

“ECS/OOP가 모바일 게임에 적합하거나, 모바일 게임 프로젝트에 권장할 만한가요? 위험성이나 고려해야 할 사항은 없나요?”

조 발렌주엘라: 많은 고객이 ECS를 사용해 모바일 게임을 제작했습니다. 이 GDC 연설에서 Sunblink Entertainment가 어떻게 HEROish에 ECS를 활용했는지 확인해 보세요.

이 콘텐츠는 Targeting Cookies 카테고리를 수락해야만 동영상을 시청할 수 있도록 허용하는 타사 제공업체에서 호스팅합니다. 이러한 제공업체의 비디오를 보려면 쿠키 환경 설정에서 Targeting Cookies 카테고리를 수락하시기 바랍니다.

Unity용 ECS의 강력한 기능 활용하기 | GDC 2023에서 만나는 Unity

V Rising의 네트워킹은 어떻게 처리하셨나요? Netcode for Entities나 다른 프레임워크를 사용하셨나요?”

라스무스 회크: 자체 프레임워크를 만들었습니다. 저희는 매우 초기부터 프로덕션에 DOTS를 활용해 왔고, 이에 따른 위험성을 인지하고 있었습니다. 위험성을 최대한 제거하고자 최대한 적은 수의 패키지를 사용하려 했고 가능하면 직접 제작한 패키지를 사용했습니다. 항상 멀티플레이어 게임을 만들어 왔고 직접 제작한 솔루션을 사용해 왔으므로 그렇게 하는 데 익숙했죠.

“ECS가 프로덕션에 활용할 만큼 안정적인가요? 지난 몇 달 동안 프로토타입과 관련하여 어려움을 겪었는데 배우는 과정에서 생길 수 있는 문제인지, 아직 완전한 ECS 프로덕션 프로젝트는 어려운 것인지 확신할 수 없습니다.”

라스무스 회크: ECS는 프로덕션용으로 충분히 안정적이라고 생각하지만 많은 게임 개발자가 당연하게 여길 수 있는 기능을 모두 갖추고 있지는 않습니다. V Rising에 사용된 저희의 게임플레이 코드는 순수하게 ECS를 기반으로 하지만, 캐릭터 애니메이션이나 파티클 효과, UI 등의 표현은 모두 게임 오브젝트를 사용합니다. 현실적으로는 하이브리드 접근 방식이 현재 프로젝트를 시작하려는 대부분의 팀에 가장 좋다고 생각합니다.

저희는 단방향 접근 방식으로 V Rising을 제작했습니다. 순전히 ECS를 사용해 데이터를 게임 오브젝트에 푸시만 하며, 반대 방향으로 전달하지는 않습니다. 예를 들어 입력이나 속도와 같은 캐릭터의 상태를 ECS 데이터로 저장하면 이동 상태나 어떤 애니메이션이 언제 어떤 속도로 활성화될지가 결정됩니다. 그런 다음 게임 오브젝트의 애니메이터를 해당 상태로 설정하죠. 애니메이터의 상태는 결코 게임플레이에 영향을 주지 않습니다. 이렇게 분리하면 게임이 전반적으로 간소화될 거예요.

조 발렌주엘라: ECS는 정식으로 제작에 사용 가능하며 전 세계의 고객이 사용하고 있지만, 충분히 원활한 경험을 제공하려면 아직 개선의 여지가 남아 있습니다. 향후 개발 내용을 기대해 주세요. DOTS를 사용해 주셔서 감사합니다!

스케일링 가능한 고성능 게임과 탁월한 경험을 제작할 수 있도록 지원하는 DOTS로 게임의 규모와 목표를 더 확장하세요. Unity 2022 LTS에서 최신 기능을 사용할 수 있습니다.

2024년 2월 28일 엔진 & 플랫폼 | 9 분 소요

Is this article helpful for you?

Thank you for your feedback!

관련 게시물