유니티 엔진을 사용해 게임 개발하는 과정에서 안 좋은 코드 습관에 관해 강의를 들어 해당 내용을 리마인드 하자는 느낌에서 정리해 보았다.
벡터 연산
다음 두 식은 dir이라는 이름을 가진 Vecor3 값에 속도(speed)와 Time.deltaTime을 곱해주고 있다. 겉보기에는 큰 차이가 없어 보이는 두 식이 실제로 차이가 존재할까?
transform.position += dir * speed * Time.deltaTime;
transform.position += speed * Time.deltaTime * dir;
실제로 두식은 연산 순서에 따른 차이가 존재한다.
Vecot3 dir = new Vector3(1,1,1);이라고 가정 하겠다.
dir은 Vector3 탑이기 때문에 dir은 각 축(x,y,z)에 대해 독립적으로 곱셈 연산을 수행한다.
따라서, dir * speed는 총 3번의 곱연산이 발생한다. 이후 결과 값에 Time.deltaTime을 곱하면 다시 3번의 연산이 추가로 발생한다. 총 연산은 6번이 된다.
하지만 2번째 방식처럼
(speed * Time.deltaTime) 은 단순 스칼라 값끼리의 연산이므로 1번의 연산만 필요하다.
이후 이 결과를 dir에 곱해준다면 축마다 곱연산이 발생해 3번의 연산이 추가로 이루어진다. 총 연산은 4번이 된다.
즉, 벡터 연산의 곱셈은 가능하다면 벡터와 곱을 하기 전에 미리 곱할 값들을 계산여 연산 횟수를 줄이는 것이 바람직 하다.
Debug.Log
유니티에서 debug.Log를 사용하고 지우지 않는다면, 빌드 시 그대로 해당 로그가 나오기 때문에 성능에 영향을 끼치고 해킹의 실마리를 제공하게 될 수 있다. 그러므로 Debug.Log 대신에 아래 해당하는 코드 사용하거나 지울 것을 권장한다.
//조건이 참일 때는 아무 작업도 하지 않고 거짓일 때 메시지 출력
//기본적으로 빌드에서 제외 됨.
//특정 조건이 충족되지 않을 경우 경고를 띄우는 용도로 사용
1. Debug.Assert(condition, "디버그 메시지");
//Debug.Log와 동일하게 동장
//※ 경우에 따라서는 빌드 환경에서도 메시지가 출력 되는 경우가 있으므로 주의가 필요
// 아래 코드 처럼 조건을 걸어줘야 함.
//#if UNITY_EDITOR
//Debug.LogAssertion("This assertion will only run in the editor.");
2. Debug.LogAssertion("디버그 메시지");
3. 클래스를 직접 구현하여 에디터에서만 동작하도록
'내일배움캠프' 카테고리의 다른 글
내일배움캠프: 추상 클래스와 인터페이스 (0) | 2024.11.27 |
---|---|
내일 배움 캠프: 안 좋은 코드 습관(2) (0) | 2024.11.26 |
내일배움캠프: 유니티 Character Controller (0) | 2024.11.11 |
내일배움캠프: object와 generic (0) | 2024.11.08 |
내일배움캠프: for문을 통한 AddListener 등록 시 인자 전달 문제 해결 방법 (1) | 2024.11.07 |