Zugalu Entertainment가 Thrive의 RAM 사용량을 20GB에서 500MB로 줄인 방법은 다음과 같습니다. Heavy Lies: The Crown

이 웹페이지는 이해를 돕기 위해 기계 번역으로 제공됩니다. 기계 번역으로 제공되는 콘텐츠에 대한 정확도나 신뢰도는 보장되지 않습니다. 번역된 콘텐츠의 정확도에 관해 의문이 있는 경우 웹페이지의 공식 영어 원문을 참고해 주시기 바랍니다.
성공: Heavy Lies the Crown은 실시간 전략 요소를 갖춘 중세 시대의 도시 건설자입니다. 왕국의 운명은 플레이어가 내리는 모든 결정에 달려 있으며, 싱글플레이어와 협동 Multiplayer 기능을 모두 갖추고 있습니다. 플레이어는 전략적으로 영토와 왕국을 확장한 다음 대형 맵을 따라 구축할 수 있습니다.
팀은 제목 / 타이틀 개발하기 시작하면서 성능 개선에 어려움을 겪었습니다. 광범위한 테스트를 거쳐 병목 현상이 어디에 있는지, 그리고 애니메이션 베이킹 시스템과 커스텀 초목 시스템을 구축해야 하는 작업을 알아냈습니다. 게임에서 캐릭터 애니메이션을 개선한 방법은 다음과 같습니다.
목표:
캐릭터 애니메이션으로 인한 성능 병목 현상 극복
플랫폼:
PC
위치:
캐나다 앨버타
프로젝트 인력:
16
성공: Heavy Lies: The Crown: Unity 활용 사례
스튜디오에서 수백 개의 캐릭터를 애니메이션화하면서 성능을 최적화(하다)하는 방법은 무엇일까요?
게임이 형성됨에 따라 Zugalu Entertainment 팀은 성능이 가장 큰 도전 과제라는 사실을 분명히 알게 되었습니다. 그들은 GPU용 NVIDIA GeForce GTX 750 Ti 그래픽 카드와 CPU 명령을 읽고 실행하는 4개의 독립적인 단위로 구성된 칩인 쿼드 코어 프로세서라는 매우 낮은 시스템 요구 사항을 목표로 했습니다.
“시스템을 타게팅하려 할 때마다 가장 바람직한 프레임 속도는 FPS. 시스템에서 변경할 수 없는 부분이 많은 부분을 차지하고 있었기 때문에 어디서든 얻을 수 있는 이점을 찾아야 했습니다."라고 Zugalu Entertainment의 리드 컨셉 아티스트이자 테크니컬 아티스트인 Jackie Li는 말합니다.
성능을 향상할 영역을 모색하면서 많은 양의 RAM을 사용하여 많은 플레이어 시스템에 크래시가 발생했으므로 많은 양의 캐릭터 애니메이션이 반드시 필요하다고 판단했습니다.

결과
- RAM 사용량 20GB에서 500MB로 줄이기
- 화면에 수천 개의 캐릭터를 한 번에 애니메이션화
- 캐릭터 드로우 콜 수가 1,000회에서 인스턴스화된 드로우 콜 수로 20회로 감소했습니다.
- GTX 750 Ti 그래픽 카드의 성능이 약 3.5밀리초에서 2080 Ti 그래픽 카드의 0.35밀리초로 향상되었습니다.
버텍스에서 뼈대 베이킹으로 마이그레이션
캐릭터 애니메이션 프로세스를 최적화(하다)하기 위해 팀은 애니메이션 베이킹 시스템을 구축했습니다. 수백 개의 애니메이션 캐릭터를 한 번에 화면에 배치해야 했으며, 처음에는 버텍스 애니메이션 에셋 솔루션을 고려해야 했습니다. 이는 VRAM과 RAM 사용량에 큰 문제가 되었습니다. 다른 솔루션을 찾을 수 없었기 때문에 자체 솔루션을 만들기로 했습니다.
애니메이션 시스템에서 팀은 버텍스 베이킹을 사용하기 시작했습니다. 버텍스 베이킹은 애니메이션의 모든 주요 프레임을 가져와 버텍스별로 해당 데이터를 베이크하는 것입니다. “한 텍스처에는 하나의 애니메이션이 포함되지만, 해당 애니메이션의 텍스처 크기는 상당히 크죠. 메모리 비용은 베이크된 프레임 수에 곱하는 버텍스 수의 요소입니다. 따라서 5000번의 버텍스 100프레임은 32비트 float RGB 형식에서 6MB 텍스처가 될 것입니다."라고 리는 말합니다. “다양한 캐릭터로 곱하는 다양한 애니메이션이 많이 필요할 때는 메모리 비용이 엄청나기 시작합니다.”
애니메이션 속도를 높일 수 있도록 GPU를 사용하는 기능을 유지하면서도 이 값을 크게 줄여야 했습니다. Unity 메시 렌더러는 뼈대를 사용하여 버텍스를 변환하기 때문에 뼈대 베이킹으로 마이그레이션하기로 했습니다.

성공: Heavy Lies the Crown | Zugalu Entertainment | PlaySide Studios
Zugalu Entertainment의 CTO 가렛 하우는 "메시 스키닝 프로세스를 통해 3D 메시를 골격이나 릭에 바인딩하여 골격을 애니메이션화할 때 메시가 변형되고 사실적으로 움직일 수 있도록 했습니다.
그런 다음 프레임당 뼈대의 트랜스폼을 텍스처로 베이크했습니다. 이러한 정보를 베이크하여 많은 양의 메모리를 절약할 수 있었습니다. “뼈대 베이킹을 사용하면 동일한 뼈대 구조를 가진 다양한 캐릭터가 베이크된 애니메이션 데이터를 공유할 수 있습니다. 뼈대 구조가 동일한 농부와 노동자 같은 캐릭터가 있었습니다. 더 많은 비용을 절감하기 위해 여러 캐릭터에서 동일한 베이크된 데이터를 재사용했습니다"라고 리는 설명합니다.
결국 게임에는 수많은 캐릭터와 애니메이션이 포함되어 있었지만, RAM 사용량은 20GB에서 500MB로 줄었습니다.

베이크된 애니메이션의 에디터 내 프리뷰
GPU 인스턴싱의 이점
애니메이션의 경우, 스킨 렌더링에 집중하여 머티리얼, 셰이더, 텍스처를 메시에 적용하여 스킨 컬러, 셰이딩, 텍스처를 시뮬레이션했습니다. 리는 "GPU 컴퓨트 기반 스킨 렌더링의 장점은 GPU 인스턴싱에 액세스할 수 있다는 점입니다. 각 캐릭터를 하나씩 렌더링하는 대신 하나의 드로우 콜을 사용하여 다양한 애니메이션으로 여러 캐릭터를 렌더링했습니다."
애니메이션 데이터와 텍스처를 하나의 텍스처 배열로 패킹했기 때문에 가능했습니다. 이는 GPU에 대한 단일 텍스처처럼 보입니다. "한 번의 드로우 콜을 사용하여 모든 캐릭터를 렌더링할 수 있지만, 유연성을 높이기 위해 뼈대를 공유하는 캐릭터는 4개밖에 없었습니다."

인스턴싱된 드로우 콜 캡처
버텍스 베이킹에서 뼈대 베이킹으로 전환하면서 팀은 캐릭터 드로우 콜 수를 1,000회에서 인스턴스화된 드로우 콜 수를 20회로 줄였습니다. "개별 하위 메시가 다르게 간주되므로 버텍스 베이킹이 어려웠습니다. 캐릭터에는 여러 부분이 있고 각 부분에 드로우 콜이 있을 수 있습니다"라고 하우는 말합니다.
뼈대 베이킹의 경우 게임에 포함된 다양한 유형의 캐릭터에 따라 달라집니다. 모든 하위 메시를 하나의 메시로 결합하므로 각 캐릭터는 최대 하나의 드로우 콜이 됩니다. "예를 들어 화면에 10개의 다른 유형의 캐릭터가 있고 각각의 서브 메시가 여러 개 있다 해도 10번의 드로우 콜만 발생한다"고 하우는 설명합니다.

성공: Heavy Lies the Crown | Zugalu Entertainment | PlaySide Studios
““Unity 사용자가 원하는 대로 수행할 수 있는 다양한 API를 보유하고 있습니다. 여기에는 임포트한 FBX에서 특정 정보를 잡고, 셰이더 키워드를 손쉽게 토글하고, 사용하기 쉬운 인스펙터 API로 커스텀 에디터 툴을 제작하는 작업이 포함됩니다."”
Jackie Li - Zugalu Entertainment
Lead Concept Artist and Technical Artist행렬 트랜스폼 생성
메시 스키닝을 학습한 덕분에 팀은 애니메이션에서 겪는 어려움을 극복할 수 있었습니다. 이 과정에서 도움을 주기 위해 Unity API를 사용했습니다.
뼈대 변형을 잡기 위해, 그들은 SkinnedMeshRenderer.bones. 이 API 다른 게임 오브젝트 트랜스폼과 마찬가지로 정보를 포함하는 트랜스폼 배열을 반환합니다. 성능 측정에는 로컬 네트워크의 다른 컴퓨터에서 실행 중인 개발 빌드의 Unity 프로파일러 자동 감지 기능을 사용했습니다. 이를 통해 메인 컴퓨터에서 작업하면서 최소 요구 사항 시스템에 맞게 게임을 프로파일링할 수 있었습니다.
성능 테스트 팀은 프레임당 성능을 샘플링하기 위해 ProfilerMarker.Begin() 및 ProfilerMarker.End() API를 적용했습니다. 이를 사용하려면 ProfileMarket.struct를 생성한 다음 CPU 타이밍을 테스트하려는 위치에 이전의 두 가지 메서드 호출을 삽입하면 됩니다. 이 결과는 Unity 프로파일러에 표시되었습니다.

성공: Heavy Lies the Crown | Zugalu Entertainment | PlaySide Studios
리는 "Unity API는 훌륭했습니다. 개발의 특정 부분을 원활하게 만들 수 있었죠.” 팀에서 경험한 한 가지 버그는 GPU의 좌표 공간이었습니다. "월드 공간을 확보했지만 뼈대 공간이 필요했습니다."
베이크 중에 뼈대 트랜스폼의 프레임을 샘플링하는 동안, 초기 뼈대 위치와 관련하여 바인드포즈라는 변환이 필요했습니다. 이를 위해 매트릭스 트랜스폼을 구성했습니다. 먼저, SkinnedMeshRenderer.sharedMesh.bindposes에서 bindpose 매트릭스를 잡았습니다. 그런 다음 뼈대의 월드 변환 매트릭스를 bindpose 변환 매트릭스로 곱했습니다(예: boneTransform.localToWorldMatrix * bindpose).

Shader Graph 캐릭터 셰이더의 에디터 내 샷
““Shader Graph 셰이더 코드를 심도 있게 이해하지 않고도 셰이더를 제작할 수 있는 Unity 해답입니다. 전체 셰이더를 직접 재작성할 필요가 없었으므로 정말 편리했습니다.””
Garrett Hau - Zugalu Entertainment
CTO손쉬운 셰이더 제작
애니메이션을 위한 셰이더를 제작할 때 팀은 Shader Graph 선택했습니다. 셰이더 코드 자체를 심도 있게 이해하지 않고도 셰이더를 제작할 수 있는 Unity 대답입니다. 전체 셰이더를 직접 재작성할 필요가 없었기 때문에 정말 편리했습니다"라고 하우는 말합니다.
메시 스키닝에는 많은 셰이더 수학이 필요했고, Shader Graph 제공하는 노드를 통해 이를 완료할 수 있었습니다. 리는 “텍스처 샘플링과 행렬 수학입니다. 원한다면 Unity 커스텀 함수 노드를 사용하여 코드를 작성할 수도 있습니다."
에디터 툴의 경우 애니메이션 디렉터는 모든 애니메이션을 직접 만들었기 때문에 애니메이션을 베이크해야 하는 특별한 요구 사항이 있었습니다. “C#과 Unity API를 사용하면 셰이더 보간을 켜고 끌 수 있어 꽤 쉬웠습니다. 또한 베이크할 뼈대의 수와 베이크할 프레임의 수를 변경하는 데 도움이 되었습니다."라고 리는 말합니다. "유저. `광고 지면`의 타겟 고객 인스펙터 API를 통해 이러한 에디터 기능을 베이크 툴에 쉽게 추가할 수 있었습니다."

Shader Graph 행렬 텍스처 샘플링
긍정적이고 신중한 상태 유지
결국 게임 개발 과정에서 점점 업그레이드된 성과가 가득했지만, 팀은 GTX 750 Ti 그래픽 카드의 GPU 성능을 약 3.5밀리초에서 2080 Ti 그래픽 카드의 0.3밀리초로 개선했습니다.
리는 "성능을 절감하고 게임이 어떻게 제작되었는지 매우 만족스럽습니다"라고 말합니다.

성공: Heavy Lies the Crown | Zugalu Entertainment | PlaySide Studios
지금 Unity Pro 다운로드하기
강력한 툴, 지원, 검증된 파트너, 활발한 커뮤니티의 도움을 받아 대형 스튜디오의 출시작과 경쟁하거나 이를 능가하는 수준의 품질을 갖춘 성공적인 게임을 제작해 보세요.