124 lines
3.9 KiB
Plaintext
124 lines
3.9 KiB
Plaintext
● ⚠️ 프레임 스킵으로 인한 영상 끊김/깨짐 문제!
|
|
|
|
🔍 문제 원인:
|
|
1. AV1 프레임 의존성: P/B 프레임이 이전 프레임을 참조하는데 스킵으로 인해 참조 프레임 손실
|
|
2. 키프레임 스킵: I-프레임까지 스킵하면 전체 GOP가 깨짐
|
|
3. 디코드 에러 급증: errors=39.3% → 화면 깨짐 직접 원인
|
|
|
|
🎯 해결방안:
|
|
|
|
Option A: 키프레임 보호 스킵 (추천)
|
|
// I-프레임(키프레임)은 절대 스킵하지 않음
|
|
bool isKeyFrame = /* 프레임 타입 확인 */;
|
|
if (!isKeyFrame && shouldSkipFrame) {
|
|
// P/B 프레임만 스킵
|
|
}
|
|
|
|
Option B: 스킵 임계값 완화
|
|
// 더 보수적인 스킵
|
|
if (timingDelta > 0.15) { // 50ms → 150ms로 증가
|
|
shouldSkipFrame = true;
|
|
}
|
|
|
|
Option C: GOP 단위 스킵
|
|
// GOP(Group of Pictures) 전체를 스킵해서 깨짐 방지
|
|
if (shouldSkip) {
|
|
skipToNextKeyFrame(); // 다음 키프레임까지 스킵
|
|
}
|
|
|
|
Option D: 품질 저하 대신 스킵
|
|
// 프레임 스킵 대신 해상도/품질 동적 조정
|
|
if (timingDelta > 0.1) {
|
|
reduceQuality(); // 4K → 1080p 동적 변경
|
|
}
|
|
|
|
어떤 방식을 시도해보시겠습니까?
|
|
|
|
1. 키프레임 보호 스킵 (가장 안전)
|
|
2. 스킵 임계값 완화 (가장 간단)
|
|
|
|
|
|
|
|
|
|
|
|
● 동적 해상도 조정 구현 방안
|
|
|
|
3가지 접근 방법을 제안합니다:
|
|
|
|
옵션 A: GPU 렌더링 해상도 스케일링 ⭐ (권장)
|
|
|
|
현재 시스템에 가장 적합하고 구현이 용이합니다.
|
|
|
|
구현 방안:
|
|
// 뷰포트 크기에 따른 동적 해상도 조정
|
|
struct AdaptiveRenderingSettings {
|
|
uint32_t viewport_width, viewport_height;
|
|
uint32_t render_width, render_height; // 실제 렌더링 해상도
|
|
float quality_scale; // 0.25, 0.5, 0.75, 1.0
|
|
};
|
|
|
|
// 4개 플레이어 → 각각 25% 해상도로 렌더링
|
|
if (player_count == 4) {
|
|
settings.quality_scale = 0.5f; // 4K → 1080p
|
|
settings.render_width = original_width * 0.5f;
|
|
settings.render_height = original_height * 0.5f;
|
|
}
|
|
|
|
장점:
|
|
- SimpleGPURenderer에서 텍스처 크기만 조정하면 됨
|
|
- dav1d 디코더는 그대로 사용 (전체 해상도 디코딩)
|
|
- GPU 스케일링으로 고품질 다운샘플링
|
|
- 구현이 비교적 간단
|
|
|
|
성능 향상:
|
|
- GPU 메모리: 75% 절약 (4K → 1080p 텍스처)
|
|
- 렌더링 속도: 4배 향상
|
|
- 디코딩은 동일하지만 렌더링 부하 대폭 감소
|
|
|
|
옵션 B: dav1d 레이어 디코딩 🔬 (고급)
|
|
|
|
AV1의 Scalable Video Coding (SVC) 기능 활용
|
|
|
|
구현 방안:
|
|
// dav1d settings에서 spatial layer 제한
|
|
Dav1dSettings settings;
|
|
dav1d_default_settings(&settings);
|
|
settings.operating_point = 0; // Base layer만 디코딩
|
|
settings.all_layers = 0; // 상위 레이어 스킵
|
|
|
|
장점:
|
|
- 디코딩 단계에서부터 성능 향상
|
|
- 메모리 사용량 최소화
|
|
- 네트워크 대역폭도 절약 (SVC 스트림 시)
|
|
|
|
단점:
|
|
- 파일이 SVC로 인코딩되어야 함
|
|
- 기존 AV1 파일은 대부분 단일 레이어
|
|
|
|
옵션 C: 선택적 프레임 디코딩 ⚡ (성능 최적화)
|
|
|
|
해상도는 유지하되 디코딩 품질/속도 조정
|
|
|
|
구현 방안:
|
|
// dav1d에서 디코딩 스레드 수 동적 조정
|
|
if (player_count >= 4) {
|
|
settings.n_threads = 1; // 각 플레이어당 1스레드
|
|
} else {
|
|
settings.n_threads = 4; // 단일 플레이어는 4스레드
|
|
}
|
|
|
|
// 그레인 필터 비활성화로 성능 향상
|
|
settings.apply_grain = 0; // Film grain 효과 스킵
|
|
|
|
권장 구현 순서
|
|
|
|
1단계: GPU 렌더링 스케일링 (옵션 A)
|
|
- SimpleGPURenderer에서 텍스처 크기 동적 조정
|
|
- 즉시 75% 성능 향상 효과
|
|
|
|
2단계: 디코더 최적화 (옵션 C)
|
|
- 스레드 수 및 품질 옵션 동적 조정
|
|
- 추가 20-30% 성능 향상
|
|
|
|
이 방법이 프레임 스킵보다 훨씬 자연스럽고 효과적일 것 같습니다. 어떤 옵션부터 구현해보시겠습니까?
|