Files
video-v1/vav2/optimization2.txt
2025-09-20 03:54:17 +09:00

92 lines
3.3 KiB
Plaintext

● 📊 Vav2Player 성능 진단 보고서
🚨 심각한 성능 병목점 (High Impact)
1. YUV→RGB 변환 최적화 누락
위치: FileOutput.cpp:386-417 (YUV422P), 419-450 (YUV444P)문제: YUV422P/444P 형식에 SIMD 최적화 미적용
// ❌ 현재: 스칼라 처리 (픽셀당 9개 연산)
for (uint32_t y = 0; y < height; ++y) {
for (uint32_t x = 0; x < width; ++x) {
int R = (298 * C + 409 * E + 128) >> 8; // 매 픽셀마다
int G = (298 * C - 100 * D - 208 * E + 128) >> 8;
int B = (298 * C + 516 * D + 128) >> 8;
}
}
성능 영향: 1920x1080 기준 5-15ms/프레임 (30fps 예산의 15-45%)
2. 파일 I/O 동기 차단
위치: WebMFileReader.cpp:41-60문제: fread() 동기 호출로 파싱 스레드 차단
// ❌ 차단 I/O
const size_t bytes_read = fread(buf, 1, static_cast<size_t>(len), m_file);
성능 영향: 2-8ms/프레임 (6-24% 예산 소모)
3. 메모리 할당 오버헤드
위치: AV1Decoder.cpp:68-76문제: 패킷마다 메모리 할당/복사
// ❌ 매 패킷마다 할당
uint8_t* buffer = dav1d_data_create(&dav1d_data, packet_size);
memcpy(buffer, packet_data, packet_size); // 불필요한 복사
성능 영향: 1-3ms/프레임 (3-9% 예산 소모)
4. BMP 헤더 메모리 단편화
위치: FileOutput.cpp:294-311문제: 필드별 개별 memcpy 호출 (10회)
// ❌ 캐시 미스 유발
memcpy(write_ptr, &header.file_type, sizeof(header.file_type));
memcpy(write_ptr, &header.file_size, sizeof(header.file_size));
// ... 8번 더 반복
⚠️ 중간 영향 병목점 (Medium Impact)
5. 스레드 동기화 경합
위치: FrameBuffer.cpp:25-27문제: Producer-Consumer 패턴에서 뮤텍스 경합
// 조건 변수 대기로 인한 지연
if (!m_not_full_cv.wait_for(lock, timeout, [this]() {
return m_stopped || m_buffer.size() < m_max_capacity;
})) {
6. WebM 탐색 비효율성
위치: WebMFileReader.cpp:304-311문제: 프레임 기반 탐색 시 O(n) 선형 검색
// ❌ 순차 검색
while (m_state->current_frame_index < frame_index) {
AdvanceToNextFrame(); // 하나씩 진행
}
📈 성능 개선 우선순위
즉시 해결 (30fps 필수)
1. Zero-copy 디코딩 기본 활성화 - 메모리 할당 제거
2. YUV422P/444P SIMD 확장 - AVX2 벡터화 적용
3. 비동기 파일 I/O - 차단 연산 제거
4. BMP 헤더 최적화 - 단일 메모리 연산
단기 개선 (성능 향상)
5. 디버그 로깅 조건부 컴파일 - 릴리즈 빌드 최적화
6. Lock-free 프레임 버퍼 - 스레드 경합 감소
7. WebM 프레임 인덱스 구축 - 빠른 탐색
8. 메모리 풀 최적화 - 스레드 로컬 풀
🎯 30fps 성능 예산 분석
프레임당 33.33ms 예산 중:
- YUV 변환 병목: 5-15ms (15-45%)
- 파일 I/O 차단: 2-8ms (6-24%)
- 메모리 할당: 1-3ms (3-9%)
- 스레드 동기화: 0.5-2ms (1.5-6%)
총 개선 가능성: 프레임당 25-85% 처리 시간 단축
💡 핵심 권장사항
1. SIMD 확장이 최우선 - YUV422P/444P에 AVX2 적용
2. Zero-copy 기본화 - 메모리 복사 제거
3. 비동기 I/O 도입 - 파일 읽기 논블로킹화
4. 조건부 로깅 - 성능 크리티컬 패스에서 제거
이러한 최적화를 통해 Vav2Player가 안정적인 30fps 실시간 재생을 달성할 수 있을 것입니다.