92 lines
3.3 KiB
Plaintext
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 실시간 재생을 달성할 수 있을 것입니다. |