유니티 WebGL 메모리 사용량 줄이는 팁
💡 WebGL에서 메모리 관리가 중요한 이유
유니티 WebGL 프로젝트는 네이티브 환경과 다르게 **고정된 메모리 크기**를 사용함.
브라우저에서 실행되기 때문에 할당 가능한 메모리가 제한되며, 최적화가 필요함.
🛠 메모리 최적화 팁 1: 메모리 크기 설정 조절
WebGL에서는 프로젝트에 적절한 메모리 크기를 설정해야 함.
기본적으로 유니티의 **Player Settings**에서 WebGL 메모리 크기를 조절할 수 있음.
🔹 메모리 크기 조절 방법
- Edit > Project Settings > Player > WebGL
- Memory Size를 프로젝트 규모에 맞게 설정
- 일반적인 2D 게임:
256MB
- 중형 3D 게임:
512MB
- 고퀄리티 3D 게임:
1024MB 이상
- 일반적인 2D 게임:
🎨 메모리 최적화 팁 2: 텍스처 메모리 절약
🔹 불필요한 텍스처 줄이기
- 고해상도 텍스처는 압축하여 사용 (`ASTC`, `DXT`, `ETC2`)
- 알파 채널이 필요 없는 경우 **RGB 압축 포맷** 사용
- 1024x1024 이상의 텍스처는 가급적 피하고, 512x512 이하 권장
🔹 MipMap 사용 조정
- **MipMap**은 원거리에서 렌더링 성능을 높이지만, 메모리를 많이 차지할 수 있음.
- **고정 크기 UI 텍스처**에는 MipMap을 끄는 것이 좋음.
🔄 메모리 최적화 팁 3: 오브젝트 관리
🔹 오브젝트 풀링(Object Pooling) 활용
class ObjectPool {
private Queue<GameObject> pool = new Queue<GameObject>();
public GameObject GetObject(GameObject prefab) {
return pool.Count > 0 ? pool.Dequeue() : Instantiate(prefab);
}
public void ReturnObject(GameObject obj) {
obj.SetActive(false);
pool.Enqueue(obj);
}
}
- **Instantiate()와 Destroy() 남발 금지!**
- 자주 사용하는 오브젝트는 **오브젝트 풀링 기법**을 활용하여 재사용
- 사용하지 않는 오브젝트는 즉시 `Destroy()` 호출
- `DontDestroyOnLoad()`를 남용하지 말 것 (메모리 누수 발생)
🔹 불필요한 데이터 캐싱 줄이기
void Update() {
// 불필요한 객체 참조 제거
GameObject obj = GameObject.Find("Player"); // ❌ 반복 호출 비효율적
}
🔹 ✅ 해결 방법
private GameObject player;
void Start() {
player = GameObject.Find("Player"); // ✅ Start()에서 캐싱
}
- `Find()` 같은 비용이 큰 함수는 **한 번만 호출 후 캐싱**
void Update() {
if (Time.frameCount % 10 == 0) {
CheckGameLogic();
}
}
- 모든 로직을 `Update()`에 두지 말고 **이벤트 기반 처리** 추천
🔹 🎯 결론
- WebGL 프로젝트는 제한된 메모리를 사용하므로 **최적화 필수**
- **텍스처 크기, MipMap, 오브젝트 관리**를 통해 메모리 사용량 절감
- **코드 최적화**로 불필요한 연산을 최소화해야 원활한 성능 유지 가능