성능을 향상시키기 위한 몇 가지 팁
시스템 성능을 높이는 다양한 방법이 있습니다.
하지만 먼저 프로파일링을 하세요! 최적화를 시도하기 전에, 프로파일러를 사용하여 게임의 어느 부분이 속도를 저하시키는지 파악해야 합니다. 멀티스레딩을 사용하는 경우, 경로 찾기는 별도의 경로 찾기 스레드에만 나타납니다(이것은 Unity 프로파일러에서 선택할 수 있습니다).
General tips
성능 평가 시 "Show Graphs"(A* 인스펙터 하단)가 비활성화되어 있는지 확인하십시오. 큰 그래프의 경우, 매 프레임마다 이를 그리는 오버헤드가 게임을 심각하게 느리게 할 수 있습니다(이는 에디터에만 적용되며 독립 실행형 게임에는 적용되지 않습니다).
Optimizing game startup
게임이 시작될 때 AstarPath 컴포넌트는 기본적으로 모든 그래프를 스캔합니다. 이는 그래프 설정 및 그래프 크기에 따라 시간이 걸릴 수 있습니다.
정적으로 고정된 월드가 있는 경우, 스캔된 그래프를 캐시하고 시작 시 캐시를 로드할 수 있습니다. 이에 대한 자세한 내용은 Saving and Loading Graphs 를 참조하십시오.
또는, 그래프가 스캔되는 동안 진행 막대를 표시하거나 게임을 완전히 멈추지 않으려면 비동기적으로 그래프를 스캔할 수 있습니다. 먼저 A* Inspector -> Settings -> Scan On Awake를 비활성화하십시오. 그런 다음 사용자 정의 스크립트에서 다음과 같이 비동기적으로 그래프를 스캔할 수 있습니다:
IEnumerator Start () {
foreach (Progress progress in AstarPath.active.ScanAsync()) {
Debug.Log("Scanning... " + progress.ToString());
yield return null;
}
}
그래프를 캐시하는 것이 옵션이 아닌 경우(예를 들어 동적 레벨이 있는 경우), 그래프 설정을 조정하여 스캔 속도를 높이거나 그래프 유형을 변경하는 것이 좋습니다. 일반적으로 그리드 그래프는 recast 그래프보다 스캔 속도가 빠르지만, 세계가 매우 큰 경우는 예외입니다. 그러나 경로 찾기는 보통 recast 그래프에서 더 빠릅니다. 다음 섹션에서는 다양한 그래프 유형에 대한 몇 가지 팁을 포함하고 있습니다.
Graph Types 에 대한 자세한 내용은 그래프 유형을 참조하십시오. |
Optimizing Grid Graph Scanning
그리드 그래프를 스캔하는 시간을 줄이는 몇 가지 방법이 있습니다:
- 가능하다면 해상도를 줄이십시오.
- 완전히 평평한 세계가 있는 경우 높이 테스트를 비활성화하십시오.
- 침식을 비활성화하십시오. 이는 작은 성능 오버헤드를 가집니다.
- 충돌 테스트가 필요 없는 경우 이를 비활성화하십시오.
Optimizing Recast Graph Scanning
- 셀 크기를 늘리십시오. 이는 그래프가 세계를 보컬화하는 해상도를 줄일 것입니다.
- 타일링을 사용하고 적절한 크기의 타일을 사용하십시오. 64에서 256 보컬 사이의 값이 권장됩니다. 타일은 병렬로 스캔될 수 있어 다중 코어 컴퓨터에서 상당한 속도 향상을 제공할 수 있습니다. 그러나 각 타일에는 약간의 오버헤드가 있으므로 너무 작은 타일 크기는 스캔 속도를 느리게 합니다.
- 콜라이더를 래스터화하십시오. 콜라이더는 일반적으로 메쉬보다 훨씬 간단하여 래스터화가 더 빠릅니다. 또한, 물리 엔진을 사용하여 효율적으로 쿼리할 수 있으므로 그래프 업데이트 성능이 향상됩니다.
- 그래프의 경계 상자를 줄여 필요한 세계 부분만 덮도록 하십시오.
Optimizing Navmesh Graph Scanning
Navmesh 그래프를 스캔하는 데 걸리는 시간은 입력 메쉬의 삼각형 수에 거의 전적으로 의존합니다. 이를 줄일 수 있다면 그래프는 더 빠르게 스캔될 것입니다.
Optimizing Movement Scripts
이동 스크립트는 성능에 큰 영향을 미칠 수 있습니다. 포함된 다양한 이동 스크립트는 서로 다른 성능 특성을 가지고 있습니다.
- AILerp 는 가장 빠르지만, 움직임이 매우 현실적이지 않아 게임에 적합하지 않을 수 있습니다.
- AIPath 는 조금 느리지만 로컬 회피를 처리할 수 있으며 더 부드러운 움직임을 제공합니다(이는 게임에 따라 바람직할 수도 있습니다).
- RichAI 는 가장 느리지만, 경로를 따를 때 AIPath보다 더 견고하며 메쉬 간 링크를 더 잘 지원합니다.
- FollowerEntity 는 일반적으로 성능 측면에서 AILerp와 AIPath 사이에 있습니다. 멀티스레딩을 사용하여 메인 스레드를 차단하지 않지만, 여전히 많은 작업을 백그라운드에서 수행하며 다른 스크립트보다 더 복잡합니다. 현재 베타 상태이지만 대부분의 경우 AIPath 및 RichAI보다 추천합니다.
캐릭터에 CharacterController 또는 Rigidbody 컴포넌트를 부착하지 않는 것이 좋습니다. 이들은 상당히 느립니다. 이들이 부착되지 않은 경우, AIPath 및 RichAI 스크립트는 대신 단순한 레이캐스트를 사용하여 지면을 감지하며, 이는 일반적으로 훨씬 빠릅니다.
Movement scripts 에 대한 자세한 내용은 이동 스크립트를 참조하십시오. |
Optimizing Pathfinding
경로 찾기는 실제로 성능 병목 현상이 아닐 때가 많습니다. 이는 큰 그리드 그래프와 많은 에이전트를 보유한 경우에만 병목 현상이 되기 쉽습니다. 프로파일러를 사용하여 경로 찾기 스레드가 매우 바쁜지 확인하십시오.
하지만 처리량이 병목 현상이 아니더라도 경로 찾기 지연 시간을 개선하는 것이 좋습니다. 지연 시간은 경로 요청이 발행된 후 단일 경로를 계산하는 데 걸리는 시간입니다. 많은 에이전트의 목적지를 한꺼번에 설정하면 높은 지연 시간으로 인해 일부 에이전트가 다른 에이전트보다 뒤처질 수 있습니다. 이들은 경로를 재계산하기 위해 차례를 기다려야 합니다.

위 그림에서 볼 수 있듯이, 210개의 에이전트가 동시에 새로운 목적지를 받으면서 경로 찾기 스레드가 경로를 재계산하느라 매우 바쁩니다. 그러나 지연 시간은 여전히 매우 낮아 모든 경로가 다음 프레임이 시작되기 전에 계산됩니다. 이 경우 성능은 양호합니다.
경로 찾기 성능을 개선해야 하는 경우 다음 팁을 참고하십시오:
- 가장 쉬운 방법은 멀티스레딩을 활성화하는 것입니다(A* Inspector -> Settings). 이렇게 하면 경로 찾기가 Unity 스레드 대신 별도의 스레드에서 실행되어 성능이 크게 향상될 수 있습니다. 요즘 거의 모든 컴퓨터와 심지어 전화기에도 많은 코어가 있기 때문입니다.
- 경로 결과 로깅은 성능에 큰 영향을 미칩니다. 경로 찾기 처리량을 50%까지 줄이는 경우도 많습니다. 필요하지 않으면 경로 로깅을 비활성화해야 합니다. A* Inspector -> Settings -> Path Log Mode를 None으로 설정하십시오.
- 새 경로가 계산되는 빈도를 줄이십시오.
- 이동 스크립트의 Recalculate Paths Automatically 필드를 Dynamic 으로 설정하여 에이전트가 목표에서 멀리 떨어져 있을 때는 경로를 덜 자주 재계산하고, 목표가 많이 변경되었을 때는 더 자주 재계산하도록 합니다.
- EveryNSeconds 모드를 사용하는 경우 기간 필드를 늘려보십시오.
- 자동 경로 재계산을 비활성화하고 필요할 때만 경로를 재계산하는 게임 전용 논리를 사용할 수도 있습니다.
- 수정자의 품질 설정을 낮추십시오. 특히 SimpleSmoothModifier 가 경로를 나누는 세그먼트 수를 줄일 수 있습니다. AIPath 이동 스크립트는 경로 자체가 특히 부드럽지 않더라도 경로를 부드럽게 따르는 데 이미 매우 잘 작동합니다.
- 그리드 그래프 대신 recast 그래프를 사용하는 것이 일반적으로 경로 찾기 성능을 향상시킵니다. recast 그래프는 동일한 영역을 덮기 위해 훨씬 적은 노드를 필요로 하기 때문입니다.
- 정적 맵에서는 휴리스틱 최적화가 옵션이 될 수 있습니다. Heuristic Optimization 를 참조하십시오.
More Tips
성능을 향상시키기 위한 더 많은 방법을 보려면 하위 페이지를 참조하십시오.
'유니티 에셋 > A* Pathfinding project pro' 카테고리의 다른 글
Optimization > Pooling (0) | 2024.05.28 |
---|---|
Optimization > Heuristic Optimization (0) | 2024.05.28 |
Deploying (0) | 2024.05.28 |
Spherical Worlds (0) | 2024.05.28 |
Editing graph connections manually (0) | 2024.05.28 |