출처 : https://cafe.naver.com/unityhub/146543
모바일 게임 성능 최적화 코딩 팁
대한민국 모임의 시작, 네이버 카페
cafe.naver.com
srting
C#에서 문자열은 값(value) 타입이 아닌 참조(ref) 타입입니다. 불필요한 string의 생성을 줄여야합니다. 대표적인 것이 JSON, XML과 같은 문자열 기반 데이터 파일입니다. 이러한 유형의 포맷 대신 데이터를 ScriptableObjects 또는 MessagePack이나 Protobuf 같은 형식으로 저장하는 것이 좋습니다. 세요. 런타임에서 문자열을 빌드해야 하는 경우 StringBuilder를 활용하는 것이 좋습니다.
Unity API
유니티에서 제공하는 함수들 중 힙(heap) 메모리에 할당을 하는 것들이 있습니다. 따라서 가비지 생성을 방지하는 함수들을 활용하여야 합니다. 예를 들어 문자열을 GameObject.tag와 직접 비교하는 대신 GameObject.CompareTag를 사용하는 방법을 권장합니다. GameObject.tag를 호출하는 순간 문자열을 생성하여 반환하기 때문에 가비지가 생성이 됩니다.
string 대신 hash 사용
유니티 API 호출 시 문자열 매개변수 대신 해시 값을 사용하세요. Unity는 애니메이터, 머티리얼, 셰이더를 처리하기 위해 내부적으로 문자열 이름을 사용하지 않습니다. 속도를 높이기 위해 모든 속성 이름은 속성 ID로 해시되며 이러한 ID는 실제로 속성을 처리하는 데 사용됩니다. 애니메이터, 재질 또는 셰이더에서 Set 또는 Get 메서드를 사용할 때 문자열 값 메서드 대신 정수 값 메서드를 활용하세요.
예를 들어서, Animator 속성 이름에는 Animator.StringToHash를 사용하고 재질 및 셰이더 속성 이름에는 Shader.PropertyToID를 사용합니다. 초기화 중에 이러한 해시를 가져오고 Get 또는 Set 메서드에 전달해야 할 때를 위해 변수에 캐시하면 됩니다.
Boxing
값(value) 타입을 참조(ref) 타입으로 변경하는 과정을 박싱이라고 합니다. (예: int i = 123, object o = i). 이러한 과정에서는 가비지가 발생하므로 권장하지 않습니다. 대신 제네릭을 사용하는 것이 대안이 될 수 있습니다.
Corutine
yield는 가비지를 생성하지 않지만 새로운 WaitForSeconds 오브젝트를 만들면 가비지가 생성됩니다. yield return new WaitForSeconds 와 같이 라인에서 생성하는 대신 WaitForSeconds 오브젝트를 Start() 등의 함수에서 미리 캐시하고 재사용하세요.
LINQ 및 정규식
두 가지 모두 박싱에서 가비지를 생성합니다. 성능을 고려한다면 LINQ와 정규식을 사용하지 마세요. 다만, 개발 효율성 측면도 고려해야 하므로, 개발 과정에서는 사용하되 프로젝트 후반부터는 수정하는 리팩토링하는 방식도 가능할 것 같습니다.
매 프레임에 실행되는 코드 최소화
Update() 함수는 매 프레임마다 호출됩니다. 모든 코드를 반드시 모든 프레임에 실행해야 하는지 검토해보세요. 의외로 그렇지 않는 코드들도 많이 발견하게 될섭니다. Update, LateUpdate, FixedUpdate에서 제외하세요. 반드시 Update를 사용해야 한다면 n개 프레임마다 코드를 실행하는 방안도 검토 가능할 것입니다.
빈 Unity 이벤트 방지
빈 MonoBehaviours도 리소스를 필요로 하므로 비어 있는 Update 또는 LateUpdate 메서드는 제거해야 합니다.
Debug Log 구문 제거
Log 구문, 특히 Update, LateUpdate 또는 FixedUpdate에 있는 Log 구문은 성능을 낮출 수 있습니다. 빌드를 만들기 전에 Log 구문을 비활성화하세요. 이 작업을 보다 쉽게 하려면 프리 프로세서 지시문과 함께 조건부 속성을 만드는 것이 좋습니다.
게임 오브젝트 및 컴포넌트 캐시하기
GameObject.Find, GameObject.GetComponent은 비용이 많이 들 수 있으므로 Update 메서드에서는 호출하지 않는 것이 좋습니다. 대신 Start()에서 호출하고 결과를 캐시하세요.
오브젝트 풀 사용
Instantiate 함수 및 Destroy 함수는 가비지와 가비지 컬렉션(GC) 스파이크를 야기하며, 일반적으로 속도가 느린 프로세스입니다. 게임 오브젝트를 계속 인스턴스화하고 삭제하기보다는(예: 총알 발사) 재사용 및 재활용할 수 있는 사전에 할당된 오브젝트 풀 사용을 권장합니다. 유니티에서도 오프젝트풀링을 위한 API를 제공하고 있습니다 (링크)
스크립터블 오브젝트 사용
런타임 중 변하지 않는 값 또는 설정은 MonoBehaviour가 아닌 스크립터블 오브젝트에 저장하세요. 스크립터블 오브젝트에서 필드를 생성하여 값 또는 설정을 저장한 다음 MonoBehaviours 에서 스크립터블 오브젝트를 참조하세요. 코드 구조도 간결해지고 그만큼 메모리도 절약할 수 있는 이점이 있습니다.
회전에서 Quaternion.Slerp(), Quaternion.RotateTowards()의 차이 (1) | 2024.07.24 |
---|---|
유니티 캐릭터 컨트롤러 이동, 회전, 경사 오르기 (0) | 2024.07.24 |
유니티 Foot IK 적용하기 (0) | 2024.07.23 |
캐릭터가 목표, 타겟 따라 바라보기, 움직이기, Rig, aim, target, lookat (0) | 2024.07.23 |
애니메이션 리깅(animation rigging) (0) | 2024.07.21 |