앱인토스 개발자센터 로고
Skip to content

성능 프로파일링

앱인토스 미니앱에서 Unity WebGL 게임의 성능을 프로파일링하고 최적화하는 방법을 안내해요.


1. 프로파일링 도구 개요

Unity Profiler

  • Unity 에디터 내장 프로파일러
  • CPU, 메모리, 렌더링 성능 분석
  • WebGL 빌드에서 제한적 지원

브라우저 개발자 도구

  • Chrome DevTools Performance 탭
  • JavaScript 성능 분석
  • 메모리 사용량 모니터링

AppsInToss Analytics

  • 실시간 성능 모니터링
  • 사용자 환경별 성능 데이터
  • 크래시 리포트 통합

2. 성능 측정 지표

핵심 성능 지표 (KPI)

📊 필수 측정 항목
├── FPS (Frames Per Second): 30fps 이상 권장
├── 로딩 시간: 초기 로딩 5초 이내
├── 메모리 사용량: 200MB 이하 권장
├── 네트워크 지연: 100ms 이하
└── 배터리 소모: 표준 게임 대비 120% 이하

사용자 경험 지표 (UX)

👤 UX 측정 항목  
├── 앱 시작 시간: 3초 이내
├── 씬 전환 시간: 2초 이내
├── 입력 지연: 16ms 이하 (60fps 기준)
├── UI 반응성: 터치 후 즉시 반응
└── 안정성: 크래시율 1% 미만

3. Unity Profiler 활용

WebGL 프로파일링 설정

c#
// Development Build 필수
PlayerSettings.SetScriptingDefineSymbolsForGroup(
    BuildTargetGroup.WebGL, 
    "ENABLE_PROFILER"
);

원격 프로파일링 연결

  1. Unity 에디터에서 Window → Analysis → Profiler 열기
  2. Target 드롭다운에서 Enter IP 선택
  3. 브라우저 IP 주소 입력
  4. Connected 상태 확인

주요 분석 영역

CPU Usage

🔍 CPU 프로파일링 체크포인트
├── Scripts: C# 스크립트 실행 시간
├── Rendering: 렌더링 파이프라인 비용
├── Physics: 물리 연산 오버헤드
├── UI: UI 렌더링 및 이벤트 처리
└── Others: 기타 시스템 오버헤드

Memory

💾 메모리 사용량 분석
├── Unity Objects: GameObject, Component 메모리
├── Graphics: 텍스처, 메시 메모리 
├── Audio: 오디오 클립 메모리
├── Scripts: C# 힙 메모리
└── WebAssembly: WASM 메모리 할당

Rendering

🎨 렌더링 성능 분석
├── Draw Calls: 드로우콜 수 (200개 이하 권장)
├── Triangles: 삼각형 수 (10만개 이하 권장)  
├── Vertices: 정점 수 (5만개 이하 권장)
├── SetPass Calls: 머티리얼 변경 수
└── Batches: 배칭 효율성

4. 브라우저 도구 활용

Chrome DevTools 성능 분석

Performance 탭 사용법

  1. F12로 개발자 도구 열기
  2. Performance 탭 선택
  3. Record 버튼으로 프로파일링 시작
  4. 게임 플레이 후 중지
  5. 분석 결과 검토

분석 요소

javascript
// JavaScript 성능 측정
console.time('GameLoop');
// 게임 로직 실행
console.timeEnd('GameLoop');

// 메모리 사용량 확인
console.log('Memory Usage:', performance.memory);

Memory 탭 활용

🧠 메모리 분석
├── Heap Snapshot: 특정 시점 메모리 상태
├── Allocation Timeline: 메모리 할당 패턴
├── Allocation Sampling: 메모리 누수 감지  
└── Performance Monitor: 실시간 메모리 추적

5. AppsInToss Analytics 연동

SDK 설정

c#
using AppsInToss.Analytics;

// 성능 모니터링 시작
PerformanceMonitor.StartTracking();

// 커스텀 메트릭 추가
PerformanceMonitor.TrackMetric("LoadTime", loadTime);
PerformanceMonitor.TrackMetric("FPS", averageFPS);

실시간 모니터링 대시보드

  • 성능 지표 실시간 추적
  • 사용자별 성능 분석
  • 기기별 성능 차이 파악
  • 지역별 네트워크 성능

6. 성능 최적화 가이드

CPU 최적화

c#
// Object Pooling 구현
public class ObjectPool<T> : MonoBehaviour where T : MonoBehaviour
{
    public T prefab;
    private Queue<T> objects = new Queue<T>();
    
    public T Get()
    {
        if (objects.Count > 0)
            return objects.Dequeue();
        return Instantiate(prefab);
    }
    
    public void Return(T obj)
    {
        obj.gameObject.SetActive(false);
        objects.Enqueue(obj);
    }
}

메모리 최적화

c#
// 리소스 해제 관리
public class ResourceManager : MonoBehaviour
{
    void OnSceneLoaded(Scene scene, LoadSceneMode mode)
    {
        // 사용하지 않는 에셋 해제
        Resources.UnloadUnusedAssets();
        System.GC.Collect();
    }
}

렌더링 최적화

c#
// LOD 시스템 활용
public class LODController : MonoBehaviour
{
    public Renderer[] renderers;
    public float[] lodDistances = {10f, 50f, 100f};
    
    void Update()
    {
        float distance = Vector3.Distance(Camera.main.transform.position, transform.position);
        
        for (int i = 0; i < renderers.Length; i++)
        {
            renderers[i].enabled = distance <= lodDistances[i];
        }
    }
}

7. 성능 문제 해결

일반적인 성능 병목

⚠️ 흔한 성능 문제
├── 과도한 DrawCall: 배칭 최적화 필요
├── 메모리 누수: 오브젝트 해제 확인  
├── 무거운 Update(): 로직 최적화 필요
├── 큰 텍스처: 압축 및 해상도 조정
└── 복잡한 셰이더: 모바일용 셰이더 사용

해결 전략

  1. 병목 지점 식별: 프로파일러로 정확한 원인 파악
  2. 우선순위 설정: 성능 영향이 큰 부분부터 최적화
  3. 측정과 검증: 최적화 후 성능 개선 확인
  4. 지속적 모니터링: 정기적인 성능 체크

8. 성능 테스트 체크리스트

개발 단계

  • Unity Profiler로 CPU/메모리 사용량 확인
  • 드로우콜 수 200개 이하 유지
  • 텍스처 메모리 사용량 50MB 이하
  • 60FPS 또는 30FPS 일정하게 유지

배포 전

  • 다양한 기기에서 성능 테스트
  • 네트워크 환경별 로딩 시간 측정
  • 장시간 플레이 시 메모리 누수 확인
  • 배터리 소모량 테스트

배포 후

  • AppsInToss Analytics로 실시간 모니터링
  • 사용자 피드백 기반 성능 개선
  • A/B 테스트로 최적화 효과 검증
  • 정기적인 성능 리포트 검토

성능 최적화는 지속적인 과정이에요. 정기적인 프로파일링과 모니터링을 통해 최적의 성능을 유지하세요.