유니티 WebGL 메모리 사용량 줄이는 팁

💡 WebGL에서 메모리 관리가 중요한 이유

유니티 WebGL 프로젝트는 네이티브 환경과 다르게 **고정된 메모리 크기**를 사용함. 브라우저에서 실행되기 때문에 할당 가능한 메모리가 제한되며, 최적화가 필요함.

🛠 메모리 최적화 팁 1: 메모리 크기 설정 조절

WebGL에서는 프로젝트에 적절한 메모리 크기를 설정해야 함. 기본적으로 유니티의 **Player Settings**에서 WebGL 메모리 크기를 조절할 수 있음.

🔹 메모리 크기 조절 방법

  1. Edit > Project Settings > Player > WebGL
  2. Memory Size를 프로젝트 규모에 맞게 설정
    • 일반적인 2D 게임: 256MB
    • 중형 3D 게임: 512MB
    • 고퀄리티 3D 게임: 1024MB 이상

🎨 메모리 최적화 팁 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, 오브젝트 관리**를 통해 메모리 사용량 절감 - **코드 최적화**로 불필요한 연산을 최소화해야 원활한 성능 유지 가능