유니티 WebGL 성능 최적화 - FPS 향상 팁

🎯 WebGL에서 FPS가 중요한 이유

유니티 WebGL 프로젝트는 브라우저 환경에서 실행되므로, **최적화가 부족하면 FPS(초당 프레임 수)**가 낮아질 수 있음. 특히 **물리 연산, 오브젝트 개수, 셰이더 복잡도** 등이 FPS에 큰 영향을 줌.

🔹 1. 드로우 콜(Draw Call) 줄이기

WebGL은 CPU에서 GPU로 **그리기 명령**(Draw Call)을 보내는 방식이라, **드로우 콜이 많으면 렌더링 성능이 저하됨**.

해결 방법

  • Batching(배칭) 활성화: 같은 머티리얼을 공유하는 오브젝트를 합쳐서 렌더링
  • Static Batching 사용 (GameObject를 Static으로 설정)
  • Dynamic Batching 활용 (Mesh가 작을 경우 자동으로 그룹화됨)
  • GPU Instancing 사용 (Material.EnableInstancing 활성화)
// GPU Instancing 적용 예제
[MaterialProperty("_Color", ShaderPropertyType.Color)]
public Color color = Color.red;

void Start() {
    GetComponent<MeshRenderer>().material.EnableKeyword("_INSTANCING_ON");
}

🔹 2. 복잡한 물리 연산 줄이기

유니티 WebGL에서는 **PhysX 엔진이 멀티스레드가 아니라 단일 스레드로 동작함**. 즉, 물리 연산이 많아지면 FPS가 심하게 저하될 수 있음.

✅ 해결 방법

•	Rigidbody의 Interpolation 옵션 비활성화 (None으로 설정)
•	Fixed Timestep을 늘려서 연산 부담 감소 (Edit > Project Settings > Time)
•	Collision Detection을 Discrete로 변경 (고속 이동이 아니라면 Continuous 비활성화)
    // Rigidbody Interpolation 해제
void Start() {
    GetComponent<Rigidbody>().interpolation = RigidbodyInterpolation.None;
}

🔹 3. 불필요한 Update 호출 줄이기

`Update()`는 매 프레임마다 호출되므로, 불필요한 연산을 포함하면 성능 저하가 발생함. 대신 **이벤트 기반 처리** 또는 **코루틴 사용**을 권장함.

❌ 비효율적인 Update() 코드

void Update() {
    if (GameObject.Find("Player") != null) { // ❌ 매 프레임마다 Find() 호출
        Debug.Log("플레이어가 존재함!");
    }
}

✅ 최적화된 코드

private GameObject player;

void Start() {
    player = GameObject.Find("Player"); // ✅ Start에서 캐싱
}

void Update() {
    if (player != null) {
        Debug.Log("플레이어가 존재함!");
    }
}

🔹 4. 오디오 최적화

WebGL에서는 **오디오 재생 방식이 다르므로**, 최적화하지 않으면 성능 문제가 발생할 수 있음.

🔹 5. 렌더링 최적화 - LOD(Level of Detail) 사용

멀리 있는 오브젝트는 낮은 디테일로 표시하면 성능을 크게 향상시킬 수 있음. **유니티 LOD 시스템**을 활용하여 자동으로 모델의 디테일을 조정 가능.

✅ LOD 설정 방법

1.	오브젝트에 LOD Group 추가 (Component > Rendering > LOD Group)
2.	LOD 모델 추가 (LOD0: 원본 / LOD1: 저품질 모델 / LOD2: 더 낮은 품질)
3.	LOD 전환 거리 조절 (카메라와의 거리 설정)
    // LOD Group을 코드로 조작 가능
void Start() {
    LODGroup lod = GetComponent<LODGroup>();
    lod.ForceLOD(1); // 강제로 낮은 LOD 사용
}

🎯 결론

- **드로우 콜을 줄이고 배칭을 활용하여 렌더링 최적화** - **물리 연산 최소화 & Fixed Timestep 조절** - **불필요한 Update 호출 줄이고, 이벤트 기반 처리 권장** - **오디오 및 LOD를 활용하여 CPU/GPU 부하를 줄일 것!**