애니메이션 메모리 사용량을 최소화하려면 다음 사항을 고려하십시오.
애니메이션 스트리밍은 지원되지 않습니다.
게임이 실행 중일 때 다음과 같은 콘솔 명령을 사용할 수 있습니다.
memory_resources list animation
로드된 애니메이션 리소스의 목록과 그 크기를 확인하는 방법:
13:41:40.61 [Application] Obtaining resource statistics. This may take a while... 13:41:40.61 [Application] ----------------------------------------------------------------------- 13:41:40.61 [Application] 19 kB - units/character/animations/onground/revolver/walk/aim/180 13:41:40.61 [Application] 17 kB - units/character/animations/onground/revolver/run/aim/180 13:41:40.61 [Application] 17 kB - units/character/animations/onground/revolver/run/aim/-90 13:41:40.61 [Application] 17 kB - units/character/animations/onground/revolver/run/aim/90 13:41:40.61 [Application] 17 kB - units/character/animations/onground/revolver/run/aim/0 13:41:40.61 [Application] 16 kB - units/character/animations/onground/revolver/run/aim/-180 13:41:40.61 [Application] 16 kB - units/character/animations/onground/unarmed/walk_fwd_lean_left 13:41:40.61 [Application] 16 kB - units/character/animations/onground/unarmed/walk_fwd_lean_right 13:41:40.61 [Application] 16 kB - units/character/animations/onground/unarmed/walk/fwd/0 13:41:40.61 [Application] 16 kB - units/character/animations/onground/revolver/walk/aim/270 13:41:40.61 [Application] 15 kB - units/character/animations/onground/revolver/walk/aim/-90 13:41:40.61 [Application] 15 kB - units/character/animations/onground/revolver/walk/aim/0 13:41:40.61 [Application] 15 kB - units/character/animations/onground/revolver/walk/aim/90 13:41:40.61 [Application] 14 kB - units/character/animations/onground/unarmed/run/fwd/lean/right 13:41:40.61 [Application] 14 kB - units/character/animations/onground/unarmed/run/fwd/lean/left 13:41:40.61 [Application] 14 kB - units/character/animations/onground/unarmed/jog/fwd/0 13:41:40.61 [Application] 14 kB - units/character/animations/onground/unarmed/jog/fwd/lean/right 13:41:40.61 [Application] 14 kB - units/character/animations/onground/unarmed/run/fwd/0 13:41:40.61 [Application] 14 kB - units/character/animations/onground/unarmed/jog/fwd/lean/left 13:41:40.61 [Application] 13 kB - units/character/animations/onground/revolver/jog/aim/180 13:41:40.61 [Application] 13 kB - units/character/animations/onground/revolver/jog/aim/90 13:41:40.61 [Application] 13 kB - units/character/animations/onground/revolver/jog/aim/270 13:41:40.61 [Application] 12 kB - units/character/animations/onground/revolver/jog/aim/0 13:41:40.61 [Application] 12 kB - units/character/animations/onground/revolver/jog/aim/-90 13:41:40.61 [Application] 7 kB - units/character/animations/onground/unarmed/idle/0 13:41:40.61 [Application] 7 kB - units/character/animations/onground/revolver/idle 13:41:40.61 [Application] 6 kB - units/character/animations/onground/revolver/idle/aim/-90 13:41:40.61 [Application] 6 kB - units/character/animations/onground/revolver/idle/aim/0 13:41:40.61 [Application] 6 kB - units/character/animations/onground/revolver/idle/aim/90 13:41:40.61 [Application] 3 kB - units/character/animations/hands/wpn_colt_idle 13:41:40.61 [Application] ----------------------------------------------------------------------- 13:41:40.61 [Application] Total Memory for animation - 380 kB
게임에 애니메이션된 캐릭터가 많으면 애니메이션이 엔진에서 가장 비싼 CPU 시스템 중 하나일 수 있습니다. 이 경우 약간의 노력을 기울여 애니메이션 사용을 최적화하는 것이 좋습니다. (캐릭터가 몇 개뿐이라면 애니메이션 성능을 걱정할 필요까지는 없습니다.)
유닛 내 오브젝트는 여러 이유(Lua 스크립트를 통해)에서 움직일 수 있지만 일반적인 게임에서는 대부분의 오브젝트가 애니메이션되었기 때문에 움직이는 것입니다. 그만큼 여기에 사용하는 대부분의 시간이 애니메이션 시스템에 할애됩니다. 애니메이션된 캐릭터가 많을수록 그 시간은 더 많아집니다.
애니메이션을 최적화해야 하는 경우 다음 내용대로 시도해 보십시오.
보다 단순한 혼합 및 믹스를 사용합니다. 최적화된 결과를 얻으려면 더 적은 애니메이션을 혼합하십시오. (가중치 0으로 혼합하는 경우 애니메이션 평가가 자동으로 최적화되기 때문에 애니메이션을 제거할 필요는 없고 가중치가 0인지 확인만 하면 됩니다.)
보다 짧은 전환 시간을 사용하여 전환 중에 여러 애니메이션이 재생되지 않도록 합니다.
컷신에만 사용되는 골격이 많다면 게임 내 캐릭터에는 보다 단순한 리그를 사용해 보십시오.
복합적인 제약 조건(조준 제약 조건 등)은 비쌀 수 있기 때문에 중요하지 않은 캐릭터에는 사용하지 않는 것이 좋습니다.
애니메이션 제어기에서 봉제 인형을 사용하면 물리적 시스템의 런타임에 영향을 줄 수 있습니다. 많은 봉제 인형을 시뮬레이팅하면 비용이 많이 듭니다.
제대로 잠들지 않은 봉제 인형이 있는지 살펴보는 것이 아주 중요합니다. 물리적 시스템의 경우 떨어지는 신체처럼 움직이는 오브젝트를 시뮬레이팅하는 작업이 비쌉니다. 하지만 신체가 지면에 떨어져서 더 이상 움직이지 않게 되면 물리적 시스템이 "잠든 것으로 처리"할 수 있어 시뮬레이션 비용이 많이 절감됩니다.
봉제 인형이 잘못 설정되면 지면에 떨어진 후에도 조금씩(눈으로 알아채기 어려울 정도로 미세하게) 계속 꿈틀거릴 수 있습니다. 결국 절대 잠들지 않게 되고, 해당 봉제 인형 유닛이 삭제될 때까지 값비싼 시뮬레이션 비용을 지불해야 합니다. 수준에 이런 봉제 인형이 많으면 물리적 시뮬레이션 시간이 아주 길어집니다.
봉제 인형이 올바로 잠드는지 확인하려면 다음과 같은 콘솔 명령을 사용해 물리적 디버깅을 활성화하십시오.
physics debug on
"깨어 있는" 동적 액터는 밝은 노란색입니다. 잠든 액터는 흐릿한 노란색입니다.
봉제 인형을 몇 개 만들어 잠시 후 모두 잠드는지 확인하십시오. 봉제 인형을 다른 유형의 지면에 생성해 보십시오. 봉제 인형이 평평한 지면에서는 제대로 잠들 수 있지만 계단이나 경사면에서는 문제가 있을 것입니다.
골격 LOD(정밀도 수준)를 설정하면 그 움직임이 보이지 않는 거리에서는 작은 골격(손가락 등)의 애니메이션이 비활성화되어 성능이 개선됩니다. 한 골격에 대한 애니메이션이 비활성화되면 이 골격은 로컬 공간의 현재 위치에 고정됩니다.
골격의 LOD를 설정하려면 Skeleton Editor를 사용합니다.
각 LOD에서 해당 LOD에 대해 활성화할 골격을 지정합니다. 각 LOD에는 이전 LOD의 골격뿐 아니라 추가된 모든 골격까지 포함됩니다. (각 LOD는 이전 LOD 상에 빌드됩니다.)
골격의 LOD 수준은 자동으로 적용되지 않고, 대신 특정 유닛에 적합한 골격 LOD 수준은 유닛이 얼마나 중요한지, 카메라에서 얼마나 떨어져 있는지 등을 고려하여 스크립트가 결정합니다.
런타임 시 어느 골격 LOD를 사용할지 설정하려면 다음 명령을 Lua 스크립트에 입력하십시오.
Unit.set_bones_lod(unit, lod_level)
골격의 LOD 수준은 다른 어떤 LOD 시스템(메시의 LOD 시스템 등)과도 연결되지 않는다는 점을 참조하십시오. 메시 LOD의 사용 여부에 관계없이 골격 LOD를 사용할 수 있습니다. 메시 LOD에 대한 자세한 내용은 LOD(정밀도 수준)를 참조하십시오.
골격 LOD는 대개 animation_blenders의 비용을 줄여줍니다(다른 시스템의 비용까지 줄여줄 수도 있음). 그 비용이 얼마인지 보고, LOD로 시험(게임 내 모든 유닛의 루트를 제외한 모든 항목을 비활성화하는 간이 테스트)해보면 골격 LOD를 사용하는 것이 프로젝트에서 얼마나 가치가 있을지 알아볼 수 있습니다.
애니메이션 병합은 대부분 동일한 애니메이션(부대 행진 등)을 재생하는 많은 유닛이 있을 때 AnimationPlayer::update 비용을 줄이기 위한 최적화 방법입니다.
보통 Stingray 엔진은 게임 내 유닛마다 별도의 애니메이션 평가자를 생성합니다. 게임에 달리기 애니메이션을 사용하는 유닛이 50개 있다면 각 유닛이 자체 로컬 시간(t=0.11, t=0.23, t=0.13)에 애니메이션의 포즈를 별도로 평가합니다. 두 유닛이 정확히 같은 시간에 달리기 애니메이션을 시작해 정확히 같은 속도로 재생하는 경우는 예외입니다. 이런 경우에는 두 유닛이 평가를 공유합니다. 달리기 애니메이션이 t=0.19에 어떻게 보이는지만 한 번 확인하고 나면 두 유닛에 이 포즈를 재사용할 수 있습니다.
애니메이션 병합 최적화 방법을 사용하면 정확히 같은 시간에 포즈를 보여줄 필요가 없어져 더 많은 유닛이 애니메이션 평가를 공유할 수 있습니다. 예를 들어, 한 유닛은 t=0.11에 달리기를 평가하려고 하고, 다른 유닛은 t=0.13에 평가하려고 한다고 가정해보겠습니다. 이 경우 성능을 향상시키려면 t=0.12에 한 번 애니메이션을 평가한 다음 이를 두 유닛에 재사용하면 됩니다. 각 유닛은 기대보다 약간 다른 시간에 애니메이션을 보여주지만 그 차이는 거의 알아차릴 수 없습니다.
애니메이션 병합을 사용하려면 Lua 스크립트에서 다음 명령을 입력합니다.
Unit.set_animation_merge_options(u, "max_start_time", t1, "max_drift", t2, "clock_fidelity", f)
애니메이션이 서로 떨어지지 않도록 하기 위해 엔진은 애니메이션 속도를 약간 수정하는 "속임수"를 써서 시간 값이 비슷하게 유지되도록 할 수 있습니다. 이 매개변수는 엔진이 속도를 얼마나 변경할 수 있는지, 그 한도를 제어합니다.
값이 1.0이면 엔진이 애니메이터가 설정한 속도를 100% 존중하여 절대 변경하면 안 된다는 의미입니다.
값이 0.9면 엔진이 애니메이터가 설정한 속도를 90%까지만 존중하면 된다는 의미입니다. 그러면 애니메이션 속도를 최대 10%까지 높이거나 낮춰서 다른 애니메이션과 보다 잘 동기화되도록 할 수 있습니다.
위 설명처럼 애니메이션 병합은 주로 AnimationPlayer::update 비용에 영향을 줍니다. 모든 게임 유닛을 대상으로 다양한 옵션을 설정하는 시험을 진행하면서 AnimationPlayer::update 시간에 어떤 영향을 주는지 살펴봄으로써 프로젝트에 애니메이션 병합을 사용하는 것이 가치가 있을지 판단해볼 수 있습니다.