성능 프로파일링
앱인토스 미니앱에서 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"
);원격 프로파일링 연결
- Unity 에디터에서 Window → Analysis → Profiler 열기
- Target 드롭다운에서 Enter IP 선택
- 브라우저 IP 주소 입력
- 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 탭 사용법
- F12로 개발자 도구 열기
- Performance 탭 선택
- Record 버튼으로 프로파일링 시작
- 게임 플레이 후 중지
- 분석 결과 검토
분석 요소
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(): 로직 최적화 필요
├── 큰 텍스처: 압축 및 해상도 조정
└── 복잡한 셰이더: 모바일용 셰이더 사용해결 전략
- 병목 지점 식별: 프로파일러로 정확한 원인 파악
- 우선순위 설정: 성능 영향이 큰 부분부터 최적화
- 측정과 검증: 최적화 후 성능 개선 확인
- 지속적 모니터링: 정기적인 성능 체크
8. 성능 테스트 체크리스트
개발 단계
- Unity Profiler로 CPU/메모리 사용량 확인
- 드로우콜 수 200개 이하 유지
- 텍스처 메모리 사용량 50MB 이하
- 60FPS 또는 30FPS 일정하게 유지
배포 전
- 다양한 기기에서 성능 테스트
- 네트워크 환경별 로딩 시간 측정
- 장시간 플레이 시 메모리 누수 확인
- 배터리 소모량 테스트
배포 후
- AppsInToss Analytics로 실시간 모니터링
- 사용자 피드백 기반 성능 개선
- A/B 테스트로 최적화 효과 검증
- 정기적인 성능 리포트 검토
성능 최적화는 지속적인 과정이에요. 정기적인 프로파일링과 모니터링을 통해 최적의 성능을 유지하세요.
