유니티로 4인 협동 게임을 만들던 도중, 코드 리펙토링을 하고 싶어서 관련 내용을 Gemini에게 물어봤다.
# 질문
Unity코드 리펙토링을 하려고 해. 유니티는 코드 개선이 됐는지 어떤 성능 지표로 판단해야되고,
Inspector로 추가하는 것과 코드로 추가하는 것의 성능 차이가 있어?
코드 개선이 실제 성능 향상으로 이어졌는지 확인하려면 Unity Profiler를 통해 다음 4가지를 중점적으로 보셔야 합니다.
| 지표 | 설명 | 리팩토링 시 체크 포인트 |
|---|---|---|
| CPU Usage (ms) | 한 프레임을 처리하는 데 걸리는 시간 | Update, FixedUpdate 내부 로직이 과도하지 않은지 확인하고 불필요한 연산 제거 |
| GC Alloc (Byte) | 가비지 컬렉션(GC)을 유발하는 메모리 할당량 | 매 프레임 발생하는 new, string 연산, LINQ 등을 제거하여 GC 발생 최소화 |
| Scripting (Time) | 순수하게 C# 스크립트 실행에 소요된 시간 | 알고리즘 개선, 루프 구조 최적화 등 코드 성능 개선 결과 확인 |
| Batches / SetPass Calls | 렌더링을 위해 CPU가 GPU에 보내는 명령 횟수 | 매니저 패턴, 오브젝트 관리 방식 개선 등으로 렌더링 호출 수 감소 여부 확인 |
[!TIP]
Profile Analyzer 패키지를 사용하면 리팩토링 전(Before)과 후(After)의 데이터를 1대1로 비교하여 평균 프레임 변화량을 한눈에 볼 수 있습니다.
결론부터 말하면 Inspector에서 미리 컴포넌트를 추가해 두는 방식이 성능상 훨씬 유리합니다.
| 항목 | 설명 |
|---|---|
| 방식 | 씬 로드 시점에 이미 직렬화(Serialization) 된 상태로 메모리에 올라옴 |
| 장점 | 게임 실행(Runtime) 중 컴포넌트를 찾는 추가 연산이 없음 |
| 성능 | ⭐ 가장 빠름 — 데이터가 이미 준비된 상태 |
AddComponent<T>())| 항목 | 설명 |
|---|---|
| 방식 | 실행 중에 엔진이 컴포넌트 타입 검색 → 메모리 할당 → 생명주기 함수 호출 |
| 내부 동작 | Awake, OnEnable 등 Unity Lifecycle 함수 실행 |
| 단점 | 추가적인 검색 비용 + 의존성 체크 비용 발생 |
| 성능 | ❌ 상대적으로 비쌈 |
타입 검색 비용
엔진 내부 캐시에서 해당 스크립트를 찾는 과정 발생
의존성 체크
Rigidbody / Collider 등 다른 컴포넌트와의 관계 확인
⚠️ 특히 반복문이나 매 프레임에서 AddComponent 호출은 성능에 치명적입니다.
성능과 코드 가독성을 동시에 개선하기 위한 Unity 리팩토링 가이드
// ❌ 나쁜 예 (각 오브젝트가 Update 실행)
public class Enemy : MonoBehaviour
{
void Update()
{
Move();
}
}
// ✅ 좋은 예 (Manager가 일괄 처리)
public class EnemyManager : MonoBehaviour
{
List<Enemy> enemies;
void Update()
{
foreach (var enemy in enemies)
enemy.Move();
}
}
2️⃣ GetComponent 캐싱
// ❌ 매번 호출
void Update()
{
GetComponent<Rigidbody>().velocity = Vector3.forward;
}
// ✅ 캐싱
Rigidbody _rb;
void Awake()
{
_rb = GetComponent<Rigidbody>();
}
void Update()
{
_rb.velocity = Vector3.forward;
}
3️⃣ AddComponent 대신 활성화/비활성화
// ❌ 비효율적인 방식
gameObject.AddComponent<BoxCollider>();
Destroy(GetComponent<BoxCollider>());
// ✅ 효율적인 방식
boxCollider.enabled = true;
boxCollider.enabled = false;
4️⃣ 문자열 비교 대신 CompareTag 사용
// ❌ GC 발생 가능
if (tag == "Player")
// ✅ Unity 최적화 함수
if (CompareTag("Player"))
결론 :
정리하면
코드는 깔끔해졌다고 해서 성능이 좋아진 것은 아니다.
반드시 Unity Profiler로 실제 성능 지표를 확인해야 한다.