이전 글
저번 글에 이어서 유니티 엔진을 사용해 게임 개발하는 과정에서 안 좋은 코드 습관에 대해 정리를 해 보았다.
올바른 캐싱 순서( Ex. Camera.main, new WaitForSeconds )
유니티에서 캐싱을 업데이트문 혹은 코루틴 같은 잦은 호출이 있는 곳에서 캐싱을 할 경우 메모리 성능을 많이 잡아 먹는 경우가 생길 수 있다. 다음 두가지 예시에서 확인할 수 있다
1. Camera.main을 사용한 캐싱
Camera.main은 하이어라키 창에서 전체 탐색을 통해 카메라를 찾는 방식을 사용한다. 이는 연산 성능이 매우 좋지 않은 편에 속하기 때문에 Update문이 돌아갈 때마다 캐싱을 하게 된다면 엄청난 성능 낭비를 발생 시킬 것 이다. 따라서, Update문이나 코루틴 같은 반복을 하는 곳에서 캐싱을 하는 것이 아니라 Awake나 Start문 등 한번만 호출 되는 곳에서 캐싱을 해주는 것 이 좋다.
2. new WaitForSeconds 캐싱
yield return new WaitForSeconds(1f);
위의 방식으로 코루틴 대기를 사용하게 된다면 코루틴을 반복할 때 마다 새로운 객체가 생성돼서 GC에 쌓이게 되는데 최악의 경우에는 문제가 발생해 프로그램이 멈출 수도 있다.
WaitForSeconds wait = new WaitForSeconds(1f);
따라서 위의 코드처럼 미리 객체를 생성 즉, 캐싱을 해서 사용하는 방식을 통해 사용 해주는게 바람직 하다.
1번 2번 예시를 통해 알 수 있듯이 캐싱은 성능을 최적화하기 위해 반복적으로 호출되는 곳에서 사용하기보다는 한 번만 호출되는 곳에서 처리하는 것이 이상적이다. 상황에 따라 캐싱을 재활용하게 되는 경우가 생긴다면 Dictionary를 활용한 동적 캐싱도 고려해볼 수 있을 것 같다.
문자열 끼리의 덧셈
문자열 비교하는 방식뿐만 아니라 문자열 덧셈의 경우에도 성능이 매우 안 좋다. 따라서 문자열 끼리의 덧셈을 피해서 사용하는 방법을 미리 알아두는 게 좋다.
1. 문자열 보간
문자열 보간($"")은 한눈에 보기에 편하고 간단한 방식으로 문자열 덧셈을 처리할 수 있다.
string name = "Rtan";
int age = 100;
string message = $"안녕하세요, 제 이름은 {name}이고 나이는 {age}살 입니다.";
2. StringBuilder를 활용한 방식
StringBuilder는 문자열을 동적으로 수정할 수 있는 클래스로, 문자열 추가나 변경 시 새로운 객체를 생성하지 않고 내부 버퍼를 통해 추가나 변경을 처리해준다. 즉, GC가 발생하지 않는다는 이 점이 있다. 다만, 소규모 작업에 경우에는 다른 방식이 더 적합할 수도 있다.
using System.Text; StringBuilder sb = new StringBuilder();
sb.Append("안녕하세요, ").Append("제 이름은 Rtan입니다. ".Append("나이는 100살입니다."));
string result = sb.ToString();
'내일배움캠프' 카테고리의 다른 글
내일배움캠프: 상호 작용 오브젝트 베이스 제작 (1) | 2024.11.28 |
---|---|
내일배움캠프: 추상 클래스와 인터페이스 (0) | 2024.11.27 |
내일 배움 캠프: 안 좋은 코드 습관(1) (0) | 2024.11.25 |
내일배움캠프: 유니티 Character Controller (0) | 2024.11.11 |
내일배움캠프: object와 generic (0) | 2024.11.08 |