# πŸ”₯ MAJOR REFACTORING GUIDE - 기술 뢀채 제거 및 μ½”λ“œ κ°„μ†Œν™” **⚠️ CRITICAL: 이 λ¬Έμ„œλŠ” ν˜„μž¬ μ§„ν–‰ 쀑인 λŒ€κ·œλͺ¨ λ¦¬νŒ©ν† λ§μ˜ 핡심 κ°€μ΄λ“œμž…λ‹ˆλ‹€.** **AI 토큰 μ ˆμ•½ 및 μž‘μ—… 연속성을 μœ„ν•΄ λ°˜λ“œμ‹œ 읽고 따라야 ν•©λ‹ˆλ‹€.** --- ## 🎯 **λ¦¬νŒ©ν† λ§ λͺ©ν‘œ** ### **κ·Όλ³Έ 문제 인식** ν˜„μž¬ codebaseλŠ” **"방어적 μ½”λ”©"**으둜 μ¦μƒλ§Œ μΉ˜λ£Œν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€: - ResourceBarrier NULL 포인터 β†’ NULL 체크 μΆ”κ°€ (❌ 증상 치료) - GPU λ¦¬μ†ŒμŠ€ 생성 μ‹€νŒ¨ β†’ 더 λ§Žμ€ fallback 둜직 (❌ λ³΅μž‘λ„ 증가) - μ΄ˆκΈ°ν™” μˆœμ„œ 문제 β†’ 더 λ§Žμ€ μƒνƒœ 체크 (❌ 기술 뢀채 증가) ### **ν•΄κ²° μ² ν•™: "μ‚­μ œ ν›„ μ˜¬λ°”λ₯Έ μž¬μ„€κ³„" (Delete & Redesign Properly)** > **"잘λͺ»λœ κ³ μ„±λŠ₯ κ΅¬ν˜„" < "μ˜¬λ°”λ₯Έ 섀계 기반 κ΅¬ν˜„"** **ν˜„μž¬ νŒŒμ΄ν”„λΌμΈ 문제점:** - **κ³Όλ„ν•œ 좔상화**: 3단계 λ³΅μž‘ν•œ νŒŒμ΄ν”„λΌμΈμœΌλ‘œ μ„±λŠ₯ μ €ν•˜ - **잘λͺ»λœ λ¦¬μ†ŒμŠ€ 관리**: NULL placeholder둜 μΈν•œ ν¬λž˜μ‹œ λ‹€λ°œ - **μ—­νš¨κ³Όμ  λ©€ν‹°μŠ€λ ˆλ“œ**: μ˜€λ²„ν—€λ“œ > μ‹€μ œ μ„±λŠ₯ ν–₯상 - **디버깅 λΆˆκ°€λŠ₯**: λ³΅μž‘ν•œ μƒνƒœ λ¨Έμ‹ μœΌλ‘œ 문제 좔적 λΆˆκ°€ **λͺ©ν‘œ:** 1. **μ¦‰μ‹œ λͺ©ν‘œ**: μ•ˆμ •μ μΈ CPU 기반 μž¬μƒ (6800 β†’ 800 라인) 2. **μ΅œμ’… λͺ©ν‘œ**: μ˜¬λ°”λ₯Έ GPU νŒŒμ΄ν”„λΌμΈ μž¬μ„€κ³„ (λ‹¨μˆœν•˜μ§€λ§Œ 효율적) --- ## πŸ“‹ **단계별 μ‹€ν–‰ κ³„νš** ### **🎯 전체 λ‘œλ“œλ§΅** #### **1단계: 잘λͺ»λœ νŒŒμ΄ν”„λΌμΈ 제거** (ν˜„μž¬ μ§„ν–‰ 쀑) - λ³΅μž‘ν•œ λ©€ν‹°μŠ€λ ˆλ“œ νŒŒμ΄ν”„λΌμΈ μ‚­μ œ - μ•ˆμ •μ μΈ CPU 기반 μž¬μƒ 확보 #### **2단계: μ˜¬λ°”λ₯Έ GPU νŒŒμ΄ν”„λΌμΈ μž¬μ„€κ³„** (ν–₯ν›„) ```cpp // μƒˆλ‘œμš΄ λ‹¨μˆœ 섀계 CPU Thread: VideoPacket β†’ AV1Decode β†’ YUV Frame ↓ (Zero-copy handoff) GPU Thread: YUV Frame β†’ D3D12 Upload β†’ YUVβ†’RGB Shader β†’ Screen ``` #### **3단계: 점진적 μ΅œμ ν™”** (μ΅œμ’…) - 이쀑 λ²„νΌλ§μœΌλ‘œ CPU-GPU 병렬화 - ν”„λ‘œνŒŒμΌλ§ 기반 μ„±λŠ₯ νŠœλ‹ --- ### **πŸ—‘οΈ Phase 1: 잘λͺ»λœ νŒŒμ΄ν”„λΌμΈ μ™„μ „ 제거** #### **1.1 제거 λŒ€μƒ νŒŒμΌλ“€ (μ¦‰μ‹œ μ‚­μ œ)** ```bash # Pipeline 디렉토리 전체 제거 rm -rf src/Pipeline/ThreadedDecoder.* rm -rf src/Pipeline/OverlappedProcessor.* rm -rf src/Pipeline/DependencyScheduler.* # λ³΅μž‘ν•œ GPU 관리 제거 rm -rf src/Rendering/CommandListPool.* rm -rf src/Rendering/DirectTextureAllocator.* # μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” μœ ν‹Έλ¦¬ν‹° 제거 rm -rf src/Common/PacketPool.* rm -rf src/Common/FramePool.* ``` #### **1.2 VideoPlayerControl.xaml.h λ‹¨μˆœν™”** ```cpp // μ œκ±°ν•  λ³΅μž‘ν•œ 멀버듀 ❌ std::unique_ptr<::Vav2Player::ThreadedDecoder> m_threadedDecoder; ❌ std::unique_ptr<::Vav2Player::OverlappedProcessor> m_overlappedProcessor; ❌ std::shared_ptr<::Vav2Player::DependencyScheduler> m_dependencyScheduler; ❌ std::shared_ptr<::Vav2Player::FrameDependencyScheduler> m_frameScheduler; ❌ bool m_useMultiThreadedDecoding = true; ❌ bool m_useOverlappedPipeline = true; ❌ bool m_useDependencyScheduling = true; // μœ μ§€ν•  핡심 멀버듀 βœ… std::unique_ptr m_fileReader; βœ… std::unique_ptr m_decoder; βœ… std::unique_ptr m_d3d12Renderer; // 선택적 ``` #### **1.3 μ œκ±°ν•  λ³΅μž‘ν•œ λ©”μ„œλ“œλ“€** ```cpp // VideoPlayerControl.xaml.cppμ—μ„œ μ™„μ „ μ‚­μ œ ❌ void InitializeThreadedDecoder(); ❌ void ShutdownThreadedDecoder(); ❌ void InitializeOverlappedProcessor(); ❌ void ShutdownOverlappedProcessor(); ❌ void InitializeDependencyScheduler(); ❌ void ShutdownDependencyScheduler(); ❌ void ProcessSingleFrameThreaded(); ❌ void ProcessSingleFrameOverlapped(); ❌ void ProcessSingleFrameScheduled(); ❌ bool SubmitPacketForDecoding(); ❌ bool SubmitPacketForOverlappedProcessing(); ❌ bool SubmitFrameForScheduledProcessing(); ``` ### **πŸ”§ Phase 2: λ‹¨μˆœ 처리 경둜둜 톡합** #### **2.1 ProcessSingleFrame() λŒ€ν­ λ‹¨μˆœν™”** ```cpp // BEFORE: 1000+ 라인의 λ³΅μž‘ν•œ λΆ„κΈ° 처리 void ProcessSingleFrame() { if (m_useDependencyScheduling && m_frameScheduler) { ProcessSingleFrameScheduled(); } else if (m_useOverlappedPipeline && m_overlappedProcessor) { ProcessSingleFrameOverlapped(); } else if (m_useMultiThreadedDecoding && m_threadedDecoder) { ProcessSingleFrameThreaded(); } else { ProcessSingleFrameLegacy(); } } // AFTER: 10라인의 λ‹¨μˆœ μ„ ν˜• 처리 void ProcessSingleFrame() { VideoPacket packet; if (!m_fileReader->ReadNextPacket(packet)) return; VideoFrame frame; if (!m_decoder->DecodeFrame(packet, frame)) return; RenderFrameToScreen(frame); // 단일 λ Œλ”λ§ 경둜 } ``` #### **2.2 RenderFrameToScreen() λ‹¨μˆœν™”** ```cpp void RenderFrameToScreen(const VideoFrame& frame) { // GPU λ Œλ”λ§ μ‹œλ„ (선택적) if (m_useHardwareRendering && m_d3d12Renderer && m_d3d12Renderer->IsInitialized()) { if (m_d3d12Renderer->TryRenderFrame(frame)) { return; // μ„±κ³΅ν•˜λ©΄ μ™„λ£Œ } } // CPU λ Œλ”λ§ (항상 λ™μž‘ν•˜λŠ” fallback) RenderFrameSoftware(frame); } ``` ### **🧹 Phase 3: ν”„λ‘œμ νŠΈ 파일 정리** #### **3.1 Vav2Player.vcxproj 정리** ```xml ❌ ❌ ❌ ❌ ❌ ❌ βœ… βœ… βœ… βœ… ``` --- ## 🎯 **단계별 μ•„ν‚€ν…μ²˜ λͺ©ν‘œ** ### **Phase 1 μ™„λ£Œ ν›„: λ‹¨μˆœ μ•ˆμ •ν™” μ•„ν‚€ν…μ²˜** ``` VideoPlayerControl β”œβ”€β”€ WebMFileReader (파일 νŒŒμ‹±) β”œβ”€β”€ IVideoDecoder (AV1 λ””μ½”λ”©) └── SoftwareRenderer (CPU λ Œλ”λ§, 100% μ•ˆμ •) ``` ### **Phase 2 λͺ©ν‘œ: μ˜¬λ°”λ₯Έ GPU νŒŒμ΄ν”„λΌμΈ** ``` VideoPlayerControl β”œβ”€β”€ WebMFileReader (파일 νŒŒμ‹±) β”œβ”€β”€ IVideoDecoder (AV1 λ””μ½”λ”©) β”œβ”€β”€ GPUTextureUploader (효율적 GPU μ—…λ‘œλ“œ) β”œβ”€β”€ YUVToRGBConverter (GPU 셰이더) └── D3D12Presenter (ν™”λ©΄ 좜λ ₯) ``` ### **단계별 데이터 ν”Œλ‘œμš°** ``` Phase 1: WebM β†’ Packet β†’ Frame β†’ CPU Render β†’ Screen Phase 2: WebM β†’ Packet β†’ Frame β†’ GPU Pipeline β†’ Screen ↓ (Zero-copy, λ‹¨μˆœ 병렬) ``` ### **μ½”λ“œ 크기 λͺ©ν‘œ** | μ»΄ν¬λ„ŒνŠΈ | ν˜„μž¬ | λͺ©ν‘œ | κ°μ†Œμœ¨ | |----------|------|------|--------| | VideoPlayerControl.xaml.cpp | 2500쀄 | 400쀄 | -84% | | Pipeline/* | 3000쀄 | 0쀄 | -100% | | Rendering/* | 1500쀄 | 800쀄 | -47% | | **전체** | **7000쀄** | **1200쀄** | **-83%** | --- ## ⚠️ **μ€‘μš”ν•œ 섀계 원칙** ### **1. λ‹¨μˆœμ„± μš°μ„  (Simplicity First)** - **λ³΅μž‘ν•œ μ΅œμ ν™” < λ‹¨μˆœν•œ λ™μž‘** - **λ©€ν‹°μŠ€λ ˆλ“œ < λ‹¨μΌμŠ€λ ˆλ“œ + λΉ λ₯Έ 디코더** - **GPU νŒŒμ΄ν”„λΌμΈ < CPU λ Œλ”λ§ + 선택적 GPU** ### **2. ν™•μ‹€μ„± μš°μ„  (Reliability First)** - **100% λ™μž‘ν•˜λŠ” κΈ°λ³Έ κΈ°λŠ₯ > 50% λ™μž‘ν•˜λŠ” κ³ κΈ‰ κΈ°λŠ₯** - **NULL 체크보닀 NULL 생성 λ°©μ§€** - **λ°©μ–΄ 코딩보닀 원인 제거** ### **3. μœ μ§€λ³΄μˆ˜μ„± μš°μ„  (Maintainability First)** - **μ„ ν˜• 처리 경둜 > λ³΅μž‘ν•œ μƒνƒœ λ¨Έμ‹ ** - **λͺ…ν™•ν•œ μ—λŸ¬ 처리 > λ³΅μž‘ν•œ fallback** - **적은 μ½”λ“œ > λ§Žμ€ κΈ°λŠ₯** --- ## 🚨 **μž‘μ—… 쀑 μ£Όμ˜μ‚¬ν•­** ### **μ ˆλŒ€ ν•˜μ§€ 말 것** ❌ **λ°©μ–΄ μ½”λ”© μΆ”κ°€**: NULL 체크, try-catch λ‚¨λ°œ ❌ **κΈ°λŠ₯ μΆ”κ°€**: μƒˆλ‘œμš΄ νŒŒμ΄ν”„λΌμΈμ΄λ‚˜ μ΅œμ ν™” ❌ **점진적 μˆ˜μ •**: κΈ°μ‘΄ λ³΅μž‘ν•œ μ½”λ“œλ₯Ό μ‘°κΈˆμ”© 고치기 ### **λ°˜λ“œμ‹œ ν•  것** βœ… **μ½”λ“œ μ‚­μ œ**: μ˜μ‹¬μŠ€λŸ¬μš°λ©΄ μ‚­μ œ βœ… **λ‹¨μˆœν™”**: λ³΅μž‘ν•œ λΆ„κΈ°λ₯Ό μ„ ν˜• 처리둜 βœ… **ν…ŒμŠ€νŠΈ**: 각 λ‹¨κ³„λ§ˆλ‹€ κΈ°λ³Έ λ™μž‘ 확인 --- ## πŸ“ **μ§„ν–‰ 상황 체크리슀트** ### **Phase 1: νŒŒμ΄ν”„λΌμΈ 제거** - [ ] ThreadedDecoder.* μ‚­μ œ - [ ] OverlappedProcessor.* μ‚­μ œ - [ ] DependencyScheduler.* μ‚­μ œ - [ ] CommandListPool.* μ‚­μ œ - [ ] VideoPlayerControl.xaml.h 멀버 정리 - [ ] VideoPlayerControl.xaml.cpp λ©”μ„œλ“œ 정리 ### **Phase 2: 둜직 λ‹¨μˆœν™”** - [ ] ProcessSingleFrame() λ‹¨μˆœν™” (1000쀄→10쀄) - [ ] RenderFrameToScreen() λ‹¨μˆœν™” - [ ] LoadVideo() μ΄ˆκΈ°ν™” 둜직 λ‹¨μˆœν™” - [ ] μ—λŸ¬ 처리 λ‹¨μˆœν™” ### **Phase 3: ν”„λ‘œμ νŠΈ 정리** - [ ] .vcxproj 파일 정리 - [ ] λΉŒλ“œ ν…ŒμŠ€νŠΈ - [ ] κΈ°λ³Έ λ™μž‘ ν…ŒμŠ€νŠΈ (λΉ„λ””μ˜€ μž¬μƒ) - [ ] μ½”λ“œ 라인 수 μΈ‘μ • --- ## πŸ”„ **쀑간 쀑단 μ‹œ μž¬μ‹œμž‘ κ°€μ΄λ“œ** ### **상황 νŒŒμ•… 질문** 1. "ν˜„μž¬ μ–΄λŠ PhaseκΉŒμ§€ μ™„λ£Œλ˜μ—ˆλ‚˜?" 2. "λΉŒλ“œκ°€ μ„±κ³΅ν•˜λŠ”κ°€?" 3. "κΈ°λ³Έ λΉ„λ””μ˜€ μž¬μƒμ΄ λ™μž‘ν•˜λŠ”κ°€?" ### **λΉ λ₯Έ μž¬μ‹œμž‘ λͺ…λ Ήμ–΄** ```bash # 1. ν˜„μž¬ μƒνƒœ 확인 find src/ -name "*.cpp" | grep -E "(Threaded|Overlapped|Dependency)" | wc -l # 2. λΉŒλ“œ ν…ŒμŠ€νŠΈ cd "D:/Project/video-av1/vav2/Vav2Player/Vav2Player" MSBuild Vav2Player.vcxproj //p:Configuration=Debug //p:Platform=x64 //v:minimal # 3. ν—€λ“œλ¦¬μŠ€ ν…ŒμŠ€νŠΈ cd "x64/Debug/Headless" ./Vav2PlayerHeadless.exe "D:/Project/video-av1/sample/simple_test.webm" ``` ### **μš°μ„ μˆœμœ„ 볡ꡬ μˆœμ„œ** 1. **λΉŒλ“œ μˆ˜μ •** (컴파일 μ—λŸ¬ ν•΄κ²°) 2. **κΈ°λ³Έ λ™μž‘ 볡ꡬ** (ProcessSingleFrame λ‹¨μˆœν™”) 3. **λΆˆν•„μš”ν•œ μ½”λ“œ μ‚­μ œ** (Phase 1 계속) --- ## πŸ’‘ **성곡 μ§€ν‘œ** ### **μ •λŸ‰μ  μ§€ν‘œ** - 전체 μ½”λ“œ 라인 수: < 1500쀄 - λΉŒλ“œ μ‹œκ°„: < 30초 - λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰: < 100MB - λΉ„λ””μ˜€ μž¬μƒ 성곡λ₯ : 100% ### **정성적 μ§€ν‘œ** - μ½”λ“œ μ΄ν•΄ν•˜κΈ° 쉬움 - 디버깅 μ‹œκ°„ 단좕 - μƒˆ κΈ°λŠ₯ μΆ”κ°€ μš©μ΄μ„± - ν¬λž˜μ‹œ λ°œμƒλ₯  0% --- **⚑ 핡심 λ©”μ‹œμ§€: "μ‚­μ œκ°€ 졜고의 디버깅이닀"** *λ¬Έμ„œ μž‘μ„±μΌ: 2025-09-21* *μ΅œμ’… μ—…λ°μ΄νŠΈ: μ§„ν–‰ 쀑*