코드 최적화
최적화 => 쉽게 말해 FPS를 높이고 Batches(Draw Call + SetPassCall)을 낮추는 것
Draw Call : CPU가 GPU에 오브젝트를 그리는 명령을 호출하는 것
모바일 게임의 경우 Batches가 100 ~ 200으로 맞추는 것이 적정
최적화를 방해하는 코드들
-
박싱 / 언박싱 : 형식을 변환하는 과정에서 메모리상 비효율 발생
- 박싱(Boxing) : 값 형식을 참조 형식으로 변환하는 것. 스택 -> 힙
- 언박싱(UnBoxing) : 박싱된 참조 형식을 값 형식으로 변환하는 것. 힙 -> 스택 (가비지 발생)
-
SendMessage와 BroadcastMessage 사용
-
Find 관련 메서드
-
자식이 많은 오브젝트의 Transform 변경
-
아무런 코드를 작성하지 않은 Update, FixedUpdate, LateUpdate를 그대로 두는 경우
-
GetComponent를 자주 호출하는 구조 ex) Update문에서 계속 호출
-
Update문에서 리스트나 클래스 재할당(new ~)하는 경우
-
Foreach문 : CPU 성능에 차이가 있음
-
코루틴 함수
- StartCoroutine을 사용할 때 약간의 가비지 발생
- yield return new Wait~에서 new를 할 때마다 가비지 생성
-
오브젝트 풀링을 사용하지 않는 경우
AI Navigation - NavMeshAgent
NavMeshAgent 속성
- Agent Type
- Base Offset : NavMeshAgent의 충돌(회피 영역)을 담당하는 실린더의 중심점 변경
- Speed : 최대 이동 속도
- Angular Speed : 최대 회전 속도. NavMeshAgent를 이용하여 이동하면 오브젝트의 회전도 자동으로 이루어지는데 이 회전 속도를 결정
- Acceleration : 최대 가속도. Speed가 빠를 때, Acceleration도 함께 높이면 방향을 바꿀 때 밀려나는 느낌을 조절할 수 있다. Speed만 높이면 해당 오브젝트가 빠른 속도를 주체하지 못하는 것처럼 이동한다.
- Stopping Distance : 목적지에 도착하기 전, 어느 거리에서부터 멈출지 설정
- Auto Breaking : 활성화 시 목적지에 다다를 때 속도를 줄여서 목적지에 정확하게 도착
- Radius : 다른 NavMesh와의 회피 영역 반지름
- Height : 회피 영역의 높이
- Quality : 장애물 회피 Quality. 높으면 장애물을 회피하는 정도가 더 정밀해짐
- Priority : 회피 우선순위. 낮을 수록 우선 순위가 올라감. 경로 상의 다른 Agent가 있을 때, 우선 순위가 낮은 Agent는 회피하지 않고 지나감
- Auto Repath : 기존 경로가 잘못된 경우 새 경로를 찾을지에 대한 여부
- Area Mask : 해당 agent가 이동할 수 있는 Area 설정
변수 및 메서드
- hasPath(bool) : 경로를 가지고 있는지 반환
- isOnNavMesh(bool) : NavMesh 위에 있는지 반환
- remainingDistance(float) : 목적지까지의 거리 반환
- SetDestination(Vector3 pos) : 타겟 위치로 경로를 찾아 유효하면 이동
- Warp(Vector3 pos) : 타겟 위치로 바로 이동시킴
- Stop() : 정지
- Resume() : 다시 이동 시작
- Move(Vector3 offset) : offset만큼 이동. 경로가 있을 경우 경로 조정됨