# AR SNS 성능 테스트 가이드

## 📊 현재 코드에서 측정 가능한 지표

### ✅ 코드 레벨에서 자동 측정 (콘솔 로그)
- **WorldMap 크기**: `📦 WorldMap 저장 크기: X.XX MB` (이미 구현됨)
- **이미지 파일 크기**: `💾 이미지 저장 완료 - 용량: X.XX MB` (이미 구현됨)
- **에러 발생**: `❌ WorldMap 요청 실패`, `⚠️ 이미지 로드 실패` 등

### 🔧 Xcode Instruments로 측정 필요
- **CPU 사용률**: Time Profiler
- **GPU 사용률**: GPU Driver
- **메모리 사용량**: Allocations / Leaks
- **프레임 레이트**: Core Animation / Metal System Trace
- **ARKit 성능**: Custom Instruments (ARSession 메트릭)

### 🌡️ 기기 레벨 측정
- **온도**: 기기 자체 (발열 체감) / Instruments의 Thermal State 간접 확인

---

## 🏠 실내 테스트 시나리오

### 테스트 환경
- **장소**: 실내 공간 (방, 사무실, 카페 등)
- **조명**: 안정적인 인공 조명
- **평면**: 명확한 벽면 (텍스처가 있는 벽)
- **기기**: iPhone 12 Pro 이상 (LiDAR 지원 권장)

### 테스트 케이스

| 테스트 항목 | 측정 방법 | 예상 범위 | 비고 |
|------------|----------|----------|------|
| **1. AR 세션 초기화** | | | |
| - 세션 시작 시간 | Instruments (Time Profiler) | < 2초 | `setupARView()` 호출부터 첫 프레임까지 |
| - 평면 인식 시간 | 콘솔 로그 (`isWallReady` 변경) | < 5초 | 벽 인식까지 걸리는 시간 |
| **2. 사진 부착 성능** | | | |
| - 사진 선택 → 부착까지 | Instruments (Time Profiler) | < 1초 | 탭 → raycast → 앵커 생성까지 |
| - 이미지 저장 시간 | 콘솔 로그 | < 0.5초 | JPEG 인코딩 + 디스크 쓰기 |
| - 프레임 드롭 여부 | Instruments (Core Animation) | 60fps 유지 | 사진 부착 시 프레임 레이트 |
| **3. WorldMap 저장** | | | |
| - WorldMap 생성 시간 | Instruments (Time Profiler) | < 3초 | `getCurrentWorldMap` 콜백까지 |
| - WorldMap 파일 크기 | 콘솔 로그 | 0.5 ~ 5 MB | 공간 복잡도에 따라 변동 |
| - 저장 시간 | Instruments (Time Profiler) | < 0.5초 | 직렬화 + 디스크 쓰기 |
| **4. WorldMap 로드** | | | |
| - 파일 읽기 시간 | Instruments (Time Profiler) | < 0.5초 | 디스크에서 Data 로드 |
| - WorldMap 디코딩 시간 | Instruments (Time Profiler) | < 1초 | `NSKeyedUnarchiver` |
| - 세션 재시작 시간 | Instruments (Time Profiler) | < 2초 | `session.run()` 호출부터 |
| - 앵커 복원 시간 | Instruments (Time Profiler) | < 1초 | 모든 앵커에 이미지 부착까지 |
| **5. 리소스 사용량** | | | |
| - 메모리 사용량 (기본) | Instruments (Allocations) | < 200 MB | AR 세션만 실행 중 |
| - 메모리 사용량 (사진 10장) | Instruments (Allocations) | < 500 MB | 텍스처 로드 후 |
| - CPU 사용률 (idle) | Instruments (Time Profiler) | < 20% | 평면 탐지만 하는 상태 |
| - CPU 사용률 (활성) | Instruments (Time Profiler) | < 50% | 사진 부착/로드 중 |
| - GPU 사용률 | Instruments (GPU Driver) | < 60% | AR 렌더링 중 |
| **6. 장시간 사용** | | | |
| - 10분 사용 후 메모리 | Instruments (Allocations) | 증가 < 50 MB | 메모리 누수 확인 |
| - 10분 사용 후 발열 | 기기 체감 | 미열 이하 | 과도한 발열 없음 |
| - 프레임 레이트 유지 | Instruments (Core Animation) | 60fps 유지 | 장시간 사용 후에도 |

---

## 🌳 실외 테스트 시나리오

### 테스트 환경
- **장소**: 실외 공간 (건물 외벽, 공원, 거리 등)
- **조명**: 자연광 (시간대별 변화)
- **평면**: 건물 벽면, 간판 등
- **환경**: 바람, 움직이는 물체 (사람, 차량 등)
- **기기**: iPhone 12 Pro 이상 (LiDAR 지원 권장)

### 테스트 케이스

| 테스트 항목 | 측정 방법 | 예상 범위 | 비고 |
|------------|----------|----------|------|
| **1. AR 세션 초기화** | | | |
| - 세션 시작 시간 | Instruments (Time Profiler) | < 3초 | 실내보다 약간 느릴 수 있음 |
| - 평면 인식 시간 | 콘솔 로그 (`isWallReady` 변경) | < 10초 | 실외는 피처가 많아 느릴 수 있음 |
| - 인식 실패율 | 수동 카운트 | < 20% | 밝은 날씨 기준 |
| **2. 사진 부착 성능** | | | |
| - 사진 선택 → 부착까지 | Instruments (Time Profiler) | < 1.5초 | 실내와 유사 |
| - raycast 실패율 | 수동 카운트 | < 30% | 바람/조명 변화 영향 |
| - 프레임 드롭 여부 | Instruments (Core Animation) | 55~60fps | 실외는 약간 불안정할 수 있음 |
| **3. WorldMap 저장** | | | |
| - WorldMap 생성 시간 | Instruments (Time Profiler) | < 5초 | 실외는 피처가 많아 느릴 수 있음 |
| - WorldMap 파일 크기 | 콘솔 로그 | 1 ~ 10 MB | 실외는 더 클 수 있음 |
| - 저장 실패율 | 콘솔 로그 (`Insufficient features`) | < 30% | 충분히 스캔하지 않으면 실패 |
| **4. WorldMap 로드** | | | |
| - 파일 읽기 시간 | Instruments (Time Profiler) | < 1초 | 파일 크기가 클수록 느림 |
| - WorldMap 디코딩 시간 | Instruments (Time Profiler) | < 2초 | 파일 크기에 비례 |
| - 세션 재시작 시간 | Instruments (Time Profiler) | < 3초 | 실내와 유사 |
| - relocalization 성공률 | 수동 확인 | > 50% | 같은 위치에서 복원 시도 |
| - 앵커 복원 시간 | Instruments (Time Profiler) | < 2초 | 앵커 수에 비례 |
| **5. 리소스 사용량** | | | |
| - 메모리 사용량 (기본) | Instruments (Allocations) | < 250 MB | 실외는 더 많은 피처 처리 |
| - 메모리 사용량 (사진 10장) | Instruments (Allocations) | < 600 MB | 텍스처 + 큰 WorldMap |
| - CPU 사용률 (idle) | Instruments (Time Profiler) | < 30% | 실외는 더 많은 처리 필요 |
| - CPU 사용률 (활성) | Instruments (Time Profiler) | < 60% | WorldMap 생성 시 피크 |
| - GPU 사용률 | Instruments (GPU Driver) | < 70% | 실외는 더 복잡한 씬 |
| **6. 환경 변화 대응** | | | |
| - 조명 변화 대응 | 수동 확인 | 안정적 | 오전/오후/저녁 테스트 |
| - 바람/움직임 영향 | 수동 확인 | 미미 | 카메라 흔들림 정도 |
| - 10분 사용 후 메모리 | Instruments (Allocations) | 증가 < 100 MB | 실외는 더 많은 변화 처리 |
| - 10분 사용 후 발열 | 기기 체감 | 약간 발열 가능 | 실외는 더 많은 연산 |

---

## 🛠️ 측정 방법

### 1. Xcode Instruments 설정

#### Time Profiler (CPU)
1. Product → Profile (⌘I)
2. Time Profiler 선택
3. 녹화 시작 → 테스트 수행 → 정지
4. CPU 사용률, 함수별 소요 시간 확인

#### Allocations (메모리)
1. Product → Profile (⌘I)
2. Allocations 선택
3. 녹화 시작 → 테스트 수행 → 정지
4. 메모리 사용량, 누수 확인

#### Core Animation (프레임 레이트)
1. Product → Profile (⌘I)
2. Core Animation 선택
3. 녹화 시작 → 테스트 수행 → 정지
4. FPS, 프레임 드롭 확인

#### GPU Driver (GPU)
1. Product → Profile (⌘I)
2. GPU Driver 선택
3. 녹화 시작 → 테스트 수행 → 정지
4. GPU 사용률 확인

### 2. 콘솔 로그 수집

Xcode 콘솔에서 다음 로그들을 수집:

📦 WorldMap 저장 크기: X.XX MB 💾 이미지 저장 완료 - 용량: X.XX MB 📂 이미지 로드: <UUID>.jpg ❌ WorldMap 요청 실패: ... ⚠️ 이미지 로드 실패: ...


### 3. 수동 측정

- **평면 인식 시간**: 앱 실행 → `isWallReady = true`까지의 시간
- **relocalization 성공률**: Load 버튼 → 사진이 정확한 위치에 복원되는지 확인
- **발열**: 기기 뒷면 체감 온도

---

## 📝 테스트 체크리스트

### 실내 테스트
- [ ] AR 세션 초기화 시간 측정
- [ ] 평면 인식 시간 측정
- [ ] 사진 1장 부착 성능 측정
- [ ] 사진 10장 부착 후 메모리 사용량
- [ ] WorldMap 저장 시간 및 크기
- [ ] WorldMap 로드 시간
- [ ] 10분 장시간 사용 후 메모리/발열 확인

### 실외 테스트
- [ ] AR 세션 초기화 시간 측정 (다양한 조명 조건)
- [ ] 평면 인식 시간 및 실패율
- [ ] 사진 부착 성능 (바람/움직임 환경)
- [ ] WorldMap 저장 시간 및 크기 (큰 공간)
- [ ] WorldMap 로드 및 relocalization 성공률
- [ ] 다양한 시간대 테스트 (오전/오후/저녁)
- [ ] 10분 장시간 사용 후 메모리/발열 확인

---

## ⚠️ 주의사항

1. **기기별 차이**: iPhone 12 Pro (LiDAR) vs iPhone 13 (일반) 성능 차이 큼
2. **조명 조건**: 실외는 시간대별로 성능 차이가 클 수 있음
3. **WorldMap 크기**: 공간이 복잡할수록 크기가 커지고 로드 시간 증가
4. **메모리 누수**: 장시간 사용 후에도 메모리가 계속 증가하면 문제
5. **발열**: 과도한 발열은 성능 저하 및 앱 종료로 이어질 수 있음

---

## 📈 성능 개선 포인트 (측정 후)

측정 결과를 바탕으로 다음을 검토:
- WorldMap 크기 최적화 (필요시 압축)
- 이미지 텍스처 크기 제한 (다운샘플링)
- 메모리 누수 수정
- 프레임 드롭 원인 분석
- CPU/GPU 사용률 최적화