메트릭 뷰
메트릭 뷰에서는 런타임 시 스켈레톤이 작동할 수 있는 방법에 대한 정보를 제공해드립니다.
표시된 메트릭은 눈에 보이는 모든 스켈레톤의 합계입니다.
애니메이션 메트릭은 애니메이팅 모드에서만 표시됩니다.
스켈레톤
뼈
스켈레톤의 총 뼈 수입니다.
CPU를 사용하여 뼈의 월드 변형을 계산합니다. 이 계산 방식은 비교적 저렴하지만, 각각에 많은 뼈가 있는 많은 스켈레톤이 화면에 표시되면 비용이 늘어날 수 있습니다. 예를 들어, 각 스켈레톤에 30개의 뼈가 있고 이러한 스켈레톤 중 50개가 동시에 화면에 표시되는 경우, 1500개의 뼈 월드 변형을 계산해야 합니다.
런타임 시 로컬 뼈 변형을 조작하여(종종 애니메이션 적용하여) 스켈레톤에 포즈를 지정하면 각 뼈에 대한 월드 변형이 계산됩니다(전형적인 코드). 일반적으로 이는 Skeleton updateWorldTransform이 호출될 때 일어납니다.
데스크톱에서 수천 개의 뼈는 일반적으로 문제가 되지 않습니다. 모바일에서 약 2천 개 이상의 뼈는 문제가 될 수 있습니다. 예를 들어, 일부 테스트에서 Nexus 4에서는 프레임 속도가 초당 60프레임 아래로 떨어지기 전에 약 2000개의 뼈를 처리할 수 있습니다.
제약조건
스켈레톤의 총 제약조건 수입니다.
CPU를 사용하여 제약조건을 계산합니다. 이 계산은 비교적 저렴하지만, 제약조건을 사용하는 많은 스켈레톤이 화면에 표시되면 비용이 늘어날 수 있습니다.
1개의 뼈가 있는 IK 제약조건은 매우 저렴하지만(전형적인 코드), 2개의 뼈가 있는 IK는 더 많은 작업이 필요합니다(전형적인 코드, 하지만 일부 코드 경로는 거의 사용되지 않음).
변형 제약조건은 각각의 제약된 뼈에 적용되지만 많은 작업이 필요하지 않습니다(전형적인 코드).
경로 제약조건은 경로에 있는 정점과 제약된 뼈의 수에 따라 꽤 많은 작업이 필요합니다(전형적인 코드).
슬롯
스켈레톤의 총 슬롯 수입니다.
슬롯 수는 성능에 아주 미미한 영향을 미칩니다. 각 슬롯에는 0 또는 1개의 어태치먼트가 표시될 수 있으므로, 지정된 시간에 표시할 수 있는 최대 어태치먼트 수가 나타납니다.
어태치먼트
총계
스켈레톤의 총 어태치먼트 수입니다.
총 어태치먼트 수는 렌더링 성능에 영향을 미치지 않으며 로드 시간에 아주 미미한 영향을 미칩니다.
표시
스켈레톤의 표시되는 어태치먼트 수입니다.
간단히 표시되는 어태치먼트는 렌더링 성능에 영향을 미치지 않을 수 있습니다. 예를 들어, 경계 상자 어태치먼트에는 아무것도 렌더링되지 않습니다.
정점
표시되는 모든 어태치먼트의 정점 수입니다.
정점 수는 GPU로 전송되는 지오메트리의 양을 나타냅니다.
정점 변형
표시되는 모든 어태치먼트의 변형되는 정점 수입니다.
CPU를 사용하여 정점을 변형합니다. 이 계산은 비교적 저렴하지만, 화면에 많은 스켈레톤이 표시되면 비용이 늘어날 수 있습니다. 정점 개수와 각 정점에 대한 가중치가 있는 뼈의 수에 따라 정점 변형의 수가 결정됩니다.
뼈와 마찬가지로 어태치먼트 정점은 로컬 좌표에서 월드 좌표로 변형해야 합니다(전형적인 코드: 영역 어태치먼트, 메쉬 어태치먼트).
삼각형
표시되는 모든 영역 및 메쉬 어태치먼트의 삼각형 수입니다.
삼각형의 수는 GPU로 전송되는 정점 인덱스의 수를 나타냅니다.
면적
스켈레톤을 전체 크기로 그릴 때 그려지는 픽셀 수입니다. 여기에는 투명 픽셀과 오버드로로 인해 여러 번 그려지는 픽셀이 포함됩니다.
그려진 픽셀 수는 스켈레톤을 렌더링하는 데 사용되는 GPU 필 레이트 수치를 나타냅니다.
클리핑 다각형
볼록 클리핑 다각형의 수입니다. 클리핑 어태치먼트의 정점이 오목하면 두 개 이상의 볼록 다각형으로 구성이 해제됩니다.
가장 좋은 성능 사례는 각 클리핑 어태치먼트가 볼록하고 하나의 클리핑 다각형으로 생성되는 경우입니다. 여러 클리핑 다각형이 생성되면 클리핑된 삼각형의 수가 늘어납니다. 자세한 내용은 클리핑 성능을 참조하십시오.
클리핑된 삼각형
표시되는 클리핑 어태치먼트에 의해 클리핑된 어태치먼트 삼각형의 수입니다.
최대한 적은 수의 삼각형을 클리핑하는 것이 성능에 가장 좋습니다. 자세한 내용은 클리핑 성능을 참조하십시오.
선택
하나 이상의 어태치먼트를 선택하면 일부 메트릭에 대해 두 개의 숫자가 표시됩니다. 슬래시 앞의 숫자는 선택한 어태치먼트에 대한 것입니다. 슬래시 뒤의 숫자는 모든 어태치먼트에 대한 것입니다.
애니메이션
타임라인
현재 활성화된 애니메이션의 총 타임라인 수입니다.
CPU를 사용하여 타임라인을 적용합니다. 단일 타임라인을 적용하는 것은 비교적 저렴하지만, 많은 스켈레톤에 프레임마다 각각 애니메이션이 적용되도록 하면 비용이 늘어날 수 있습니다. 또한 프레임마다 하나의 스켈레톤에 여러 애니메이션을 적용할 수도 있습니다. 예를 들어, 달리면서 동시에 총을 쏠 때나 크로스페이딩에 애니메이션이 믹스된 경우입니다.
런타임 시 애니메이션은 여러 "타임라인"으로 구성됩니다. 각 타임라인에는 키 값의 목록이 있습니다. 애니메이션이 적용되면 애니메이션의 각 타임라인도 적용됩니다. 타임라인에서 목록을 확인하여 현재 애니메이션 시간의 키 값을 찾은 다음 해당 값으로 스켈레톤을 조작합니다(전형적인 코드). 프레임 0에 키가 1개만 있는 타임라인도 애니메이션이 스켈레톤에 적용될 때마다 계속 적용됩니다.
성능
성능이 흥미로운 이유는 큰 문제가 되거나 전혀 문제가 되지 않기 때문입니다. 성능이 좋지 않은 하드웨어에서 실행되는 최악의 애플리케이션도 성능이 허용되는 한 최적화가 필요하지 않습니다. 규칙은 다음과 같습니다. 성능 향상을 사용자가 알 수 없는 경우 성능 향상에 소요되는 시간은 완전히 낭비입니다. 그 시간은 사용자가 눈에 띄는 일에 들이는 것이 항상 더 좋습니다. 사실, 필요 이상으로 최적화하면 애니메이션의 품질이 저하되고, 소프트웨어가 더 복잡해지고, 유지 관리가 더 어려워질 수 있으므로 불필요하게 최적화하지 않는 것이 중요합니다.
이 규칙은 개발 중에 성능을 무시해야 하는 것이 아니라 선제적 시도로 최소한의 성능을 고려하여 성능 문제를 방지해야 한다는 의미입니다. 특히 다음과 같은 아주 많은 변수가 수반되는 경우 너무 지나쳐서 시간을 낭비하기가 매우 쉽습니다.
- 애플리케이션이 실행되는 하드웨어,
- 스켈레톤 렌더링 외에 애플리케이션 및 게임 툴킷에서 이루어지는 모든 작업,
- 게임 툴킷과 Spine 런타임에서 렌더링을 실행하는 방법,
- 렌더링되는 스켈레톤 수,
- 해당 스켈레톤이 구성되는 방법,
- 그려지는 픽셀 수,
- 기타 등등.
Spine 애니메이션을 디자인할 때 애니메이터가 이 모든 사항을 고려하고 잘 작동하는 에셋만 제공하는 것은 불가능합니다. 대신, 원하는 변형에 필요한 메쉬 정점 수만 사용하는 등 성능 낭비를 방지하기 위해 합리적인 노력을 기울여야 합니다. 성능 문제가 발생하고 나서야 스켈레톤을 간단하게 하기 위해 추가 노력을 기울이려고 합니다.
성능은 너무 많은 변수에 의존하므로 메트릭 뷰의 어떤 수치가 너무 높은지 개략적으로 말할 수 없습니다. 성능을 한계까지 끌어올리려면 다양한 하드웨어에서 실제 스켈레톤과 나머지 애플리케이션을 사용하여 자체 테스트를 수행하고 특정 환경의 제한 사항을 파악해야 합니다. CPU 또는 GPU 성능을 한계까지 끌어올리지 않는다면 성능에 대해 걱정하거나 애니메이션의 품질을 떨어뜨릴 필요가 없습니다.
성능 문제가 발생하면 첫 번째 단계는 성능에 가장 큰 영향을 미치는 병목 현상을 파악하는 것입니다. 여기에 노력을 집중하면 가장 큰 효과를 얻을 수 있기 때문입니다. Spine 스켈레톤을 렌더링할 때 가장 일반적인 병목 현상은 CPU 사용량, 필 레이트 및 드로우 콜입니다.
CPU 사용량
CPU 사용량이 너무 높으면 애플리케이션에서 CPU를 너무 많이 사용하여 렌더링이 허용 가능한 프레임 속도(일반적으로 초당 60 또는 30 프레임 미만) 이하로 떨어지는 것을 의미합니다. CPU 사용량에 대한 가장 중요한 메트릭은 뼈, 타임라인, 정점 변형, 제약조건 및 클리핑입니다. 이 중 어느 것이라도 과도하게 사용하면 문제가 될 수 있습니다.
가중치를 사용하면 정점 개수 및 각 정점에 대해 가중치를 가진 뼈의 수에 따라 정점 변형의 수가 크게 증가할 수 있습니다. 정리를 사용하면 정점 변형의 수를 줄일 수 있습니다.
타임라인의 수는 애니메이션을 적용하는 데 필요한 프로세싱을 증가시킵니다. 애니메이션 정리를 사용하면 타임라인의 수를 줄일 수 있습니다.
클리핑은 매우 비용이 많이 드는 작업이므로 다른 이미지에 의해 오버드로가 가려질 수 있는 경우와 같이 가능하면 피해야 합니다. 클리핑을 사용할 때는 볼록하고, 정점을 최대한 적게 사용하고, 삼각형을 최대한 적게 클리핑해야 합니다.
스켈레톤의 복잡성을 줄이는 것 외에도 옵션이 있을 수 있습니다. 스켈레톤이 많은 경우 라운드 로빈 방식으로 프레임마다 스켈레톤의 일부만 업데이트하는 것이 그런대로 괜찮을 수 있습니다. 또 다른 옵션은 소수의 스켈레톤만 애니메이팅하고, 해당 포즈를 사용하여 더 많은 수의 스켈레톤을 렌더링하는 것입니다.
필 레이트
GPU 필 레이트가 소진되면, 사용자는 GPU에서 허용 가능한 프레임 속도로 그릴 수 있는 것보다 더 많은 픽셀을 그리려고 한다는 의미입니다. 픽셀이 그려질 때마다 픽셀은 필 레이트에 불리하게 작용합니다. 따라서 픽셀이 완전히 투명하거나 같은 픽셀이 여러 번 그려진 경우(이를 "오버드로"라고 함)에도 마찬가지입니다((예: 어태치먼트가 겹치는 경우).
필 레이트를 제한하는 해결책은 항상 동일합니다. 픽셀을 더 적게 그리는 것입니다. 메쉬를 사용하여 투명한 픽셀이 그려지는 것을 방지할 수 있지만, 이는 CPU에서 변형할 정점이 더 많다는 것을 의미할 수 있습니다. 완전히 투명한 픽셀은 여전히 필 레이트를 소진하므로 어태치먼트의 알파를 0으로 설정하는 대신 어태치먼트를 숨겨야 합니다. 예를 들어, 때때로 두 개 이상의 겹치는 이미지 대신 더 큰 단일 이미지를 사용하여 오버드로를 최소화하는 방식으로 아트를 구성할 수 있습니다.
드로우 콜
그리기를 GPU에 요청하는 것은 비용이 많이 드는 작업이 될 수 있습니다. 이는 새로운 그리기 작업을 수락하기 전에 진행 중인 작업을 완료해야 할 수 있기 때문입니다. 그리기를 너무 여러 번 요청하면 GPU에서 허용 가능한 프레임 속도로 모든 그리기를 완료할 수 없습니다.
대부분의 게임 툴킷에서는 최대한 많은 지오메트리를 일괄 처리하므로 GPU에 그리기를 몇 번만 요청하게 됩니다. 일반적으로 GPU가 다른 텍스처에서 그려야 할 경우 배치를 플러싱해야 하므로, 텍스처 아틀라스를 사용하여 텍스처 스위치를 줄입니다. 슬롯에 블렌딩을 사용하면 배치 플러시가 발생할 수도 있습니다.