본문 바로가기

Unity

[Unity] 개인프로젝트 - 아트 리소스 버짓

개요

[Unity] D2 - 클라이언트 최적화에 여러 최적화 방법들이 작성되어 있지만, 근간에 해당하는 것 중 하나가 6. 아트 리소스 버짓 준수이다.
아무리 테크에서 쥐어짠다한들, 리소스 자체를 지나치게 사용하면 최적화는 답이 없어지게 된다.
 
그렇기에 각 리소스 버짓에 대해 파티셔닝을 해 줘야 하고, 이를 아티스트들에게 설득시키는 작업이 요구된다.
참고로, D2의 경우 기준 디바이스가 삼성 갤럭시 S5 / Note3 였다.
 

Total vertex

D2 프로젝트에서는 한번의 렌더링에서 사용될 수 있는 버텍스의 총합을 60k로 책정하였으며, 그래픽 옵션 2가 기준이었다.
 
Budget per section
 
60k의 제한을 다음과 같이 아트 영역에 나누어 분배하였다.
  • 배경 : 30k
  • 이펙트 : 10k
  • Creature (PC + NPC) : 20k
 
참고로, Creature의 등급별 vertex count는 다음과 같이 가이드하였다.
  • PC 인간형 : 6k
  • PC 악마형 : 7.5k
  • NPC 쟈코 : 0.6k
  • NPC 일반 : 1.5k
  • NPC 탱커/보스 : 5k
  • NPC 레이드 : 7k
 
배경이 30k 버텍스를 다 사용한 경우, PC(최대 7.5k)를 제외하면, NPC에 12.5k 정도가 남으니, NPC 배치는 다음들과 같을 수 있다.
  • 탱커 1 + 일반 3 + 쟈코 6 = 5k + 1.5*3k + 0.6k* 6 = 13.1k
  • 일반 4 + 쟈코 12 = 1.5*4k + 0.6k*12 = 13.2k
 

NPC Death duration issue

위의 vertex 기준에 맞추어 NPC를 그룹 스폰시킨다고 해도,
A 그룹을 모두 처치하고, B 그룹이 스폰될 때의 딜레이가 거의 없다면 vertex limitation 가이드가 깨지게 된다.
시체가 타들어가는 효과를 그리는 사이에, 순간적으로 정해놓은 개체수보다 훨씬 많이 그려지기 때문이다.
 
이를 피하기 위해 다음의 방법론들을 사용하였다.
  • 스폰 그룹간 적절한 딜레이 부여 : 1초 정도로 셋팅하였다.
  • 스폰 그룹간 최소 거리 유지 : 한 화면에서 바로 렌더링되지 않도록 어느 정도 거리를 두었다.
  • 몬스터 사망모션 길이의 최소화 : 쟈코/일반 몬스터까지는 1초 이내로 짧게 가져갔다.
 

배경

배경은 추가적인 최적화 일환으로, 1장의 배경 텍스쳐 아틀라스를 사용하여 배칭 효율을 높이는 과정을 추가로 수행했다.
D2의 경우 최대 2048x2048의 압축된 형태의 텍스쳐로 아틀라스를 설정했다.
참고로, 아틀라스는 알파 없는 텍스쳐만 적용된다.
 
이 외 배경의 경우 1 frame 단위가 아니라, 배경 전체의 총 vertex 수를 20만개로 제한시켰다.
(사실 vertex 수 자체도 자체지만, Combined mesh 수를 3개 이내로 제한시킨 것이 더 중요했다)
 

캐릭터

캐릭터의 경우 vertex 외 2가지 포인트를 더 살펴 보아야 한다.

 

텍스쳐 사이즈

다음과 같이 결정, 제안하고 칼같이 지켜지도록 공정화 시켰다.
 
Texture Resolution
Table
  Texture        
    Diffuse Normal Gloss Metalness AO
Human
Type
Body (파츠) 512 X 512
Trilinear
512 X 512
Trilinear
256 X 256
Bilinear
256 X 256
Bilinear
256 X 256
Bilinear
  머리 /  /  256 X 256
Trilinear
256 X 256
Trilinear
128 X 128
Bilinear
128 X 128
Bilinear
128 X 128
Bilinear
  무기 256 X 256
Trilinear
X 128 X 128
Bilinear
128 X 128
Bilinear
128 X 128
Bilinear
Devilian
Type
통맵 1024 X 1024
Trilinear
1024 X 1024
Trilinear
512 X 512
Bilinear
512 X 512
Bilinear
512 X 512
Bilinear
Monster 레이드(Raid) 1024 X 1024
Trilinear
1024 X 1024
Trilinear
512 X 512
Bilinear
512 X 512
Bilinear
512 X 512
Bilinear
  보스(Boss)
& Tanker
512 X 512
Bilinear
512 X 512
Bilinear
256 X 256
Bilinear
256 X 256
Bilinear
256 X 256
Bilinear
  일반 256 X 256
Bilinear
256 X 256
Bilinear
128 X 128
Bilinear
128 X 128
Bilinear
128 X 128
Bilinear
  자코 128 X 128
Bilinear
128 X 128
Bilinear
128 X 128
Bilinear
128 X 128
Bilinear
128 X 128
Bilinear
 

Bone 개수

크리쳐의 Bone 개수는 다음과 같이 가이드 하였다.
  • PC : 50
  • NPC 레이드 : 60
  • NPC 탱커/보스 : 50
  • NPC 일반/쟈코 : 30
 
NPC의 외형적 특징으로 인해 Bone 개수를 기준에 맞추기 쉽지 않을 때가 종종 있었다.
다지류의 외형을 가진 녀석들, 뿔이 많은 녀석들, 꼬리가 강조된 녀석들이 대표적인 예들이다.
 
이 경우 적절한 타협이 필요하지만, 적어도 해당 NPC의 특징을 살리려다 보면 기준을 초과하는 경우가 많더라.
기준은 기준이니까 반드시 저 숫자보다 Bone이 적어야 하는 것은 아니다.
 
프레임당 최대 Bone 수를 900개 이하로 억제시키는 것이 Bone budget이다.
이 기준으로 봤을 때, D2의 몬스터 최대 마리수는 Bone 개수보다 Vertex 수에 더 큰 영향을 받는다.
 

이펙트

이펙트의 경우 overdraw 관점에서의 최적화도 중요하다.
아래 테이블은 D2에서 최종 적용한 각 크리쳐별 스킬 이펙트의 DPCall/Overdraw 버짓이다.
 
  DPCall Overdraw
PC 15 4.0
Boss - NonProjectile 12 3.0
Boss - Projectile (Max 8 기준) 30 3.0