# DirectX 8 to DirectX 9 Migration Plan ## RiskYourLife Client --- ## 1. 현재 DX8 사용 현황 분석 ### 1.1 DX8 의존성 통계 - **DX8 헤더 include 수**: 74개 파일 - **DX8 인터페이스 사용**: 1002회 참조 - **주요 링크 라이브러리**: - `d3d8.lib` (2.4 KB) - `d3dx8.lib` (2.1 MB) - `d3dx8dt.lib` (2.7 MB - 디버그) - `dxerr8.lib` (1.1 MB) ### 1.2 핵심 DX8 인터페이스 사용 위치 #### A. 엔진 코어 (Zalla3D Base Class) **파일**: `BaseGraphicsLayer.h` / `BaseGraphicsLayer.cpp` ```cpp static LPDIRECT3DDEVICE8 m_pd3dDevice; static LPDIRECT3D8 m_pD3D; ``` - **역할**: 전체 그래픽 시스템의 루트 클래스 - **영향도**: ⭐⭐⭐⭐⭐ (최상위 - 모든 렌더링 의존) **파일**: `RenderDevice.h` / `RenderDevice.cpp` ```cpp LPDIRECT3DDEVICE8 m_pd3dDevice; ``` - **역할**: 렌더링 디바이스 래퍼 - **영향도**: ⭐⭐⭐⭐⭐ **파일**: `EnumD3D.h` / `EnumD3D.cpp` ```cpp static LPDIRECT3D8 m_pD3D; static D3DADAPTER_IDENTIFIER8 d3dAdapterIdentifier; static D3DCAPS8 d3dCaps; ``` - **역할**: 디바이스 열거 및 기능 확인 - **영향도**: ⭐⭐⭐⭐ **파일**: `Texture.h` / `Texture.cpp`, `NTexture.h` / `NTexture.cpp` - **역할**: 텍스처 관리 시스템 - **DX8 함수**: `D3DXCreateTextureFromFile`, `CreateTexture` - **영향도**: ⭐⭐⭐⭐ **파일**: `d3dfont.h` / `d3dfont.cpp` - **역할**: 폰트 렌더링 - **영향도**: ⭐⭐⭐ #### B. 엔진 렌더링 (Zalla3D Scene Class) **주요 파일**: - `Z3DRenderable.h/cpp` - 렌더링 가능 오브젝트 베이스 - `Z3DTexture.h/cpp` - 텍스처 관리 - `Z3DGeneralChrModel.h/cpp` - 캐릭터 모델 - `Z3DMultipartSkin.h/cpp` - 멀티파트 스킨 시스템 - `NMesh.h/cpp` - 메시 관리 - `OctreeScene.h/cpp` - 옥트리 씬 - `WaterW.h/cpp` - 워터 렌더링 - `SectorScene.cpp` - 섹터 기반 씬 - `SceneManager.cpp` - 씬 매니저 **영향도**: ⭐⭐⭐⭐ #### C. 이펙트 시스템 **주요 파일**: - `Effect/CGemRender.h/cpp` - 보석 렌더링 - `Effect/EffMeshloader.h/cpp` - 이펙트 메시 로더 - `Effect/SMRHeader.h/cpp` - SMR 포맷 - `Effect/CEffscript.h/cpp` - 이펙트 스크립트 **영향도**: ⭐⭐⭐ #### D. 클라이언트 UI (RYLClient) **주요 파일**: - `RYLClient/Sprite.h` - 스프라이트 시스템 - `RYLClient/RYLUI/RYLSpriteEX.h` - 확장 스프라이트 - `RYLClient/GUITextEdit.h` - UI 텍스트 - `RYLClient/GUITooltip.h` - 툴팁 **영향도**: ⭐⭐⭐ #### E. 카메라 및 액션 제어 **주요 파일**: - `CharacterActionControl/CameraControl.h` - `CharacterActionControl/CCameraScript.h` **영향도**: ⭐⭐ ### 1.3 D3DX8 헬퍼 함수 사용 현황 **많이 사용되는 함수들**: - `D3DXCreateTextureFromFile` / `D3DXCreateTextureFromFileEx` - 텍스처 로드 - `D3DXLoadMeshFromX` - X파일 메시 로드 - `D3DXMatrixMultiply` / `D3DXMatrixInverse` - 매트릭스 연산 - `D3DXVec3TransformCoord` - 벡터 변환 - `D3DXCreateFont` - 폰트 생성 **사용 파일**: 29개 파일 --- ## 2. DX8 → DX9 주요 변경사항 ### 2.1 인터페이스 버전 변경 | DX8 | DX9 | |-----|-----| | `LPDIRECT3D8` | `LPDIRECT3D9` | | `LPDIRECT3DDEVICE8` | `LPDIRECT3DDEVICE9` | | `IDirect3DTexture8` | `IDirect3DTexture9` | | `IDirect3DSurface8` | `IDirect3DSurface9` | | `IDirect3DVertexBuffer8` | `IDirect3DVertexBuffer9` | | `IDirect3DIndexBuffer8` | `IDirect3DIndexBuffer9` | | `D3DCAPS8` | `D3DCAPS9` | | `D3DADAPTER_IDENTIFIER8` | `D3DADAPTER_IDENTIFIER9` | ### 2.2 헤더 파일 변경 ```cpp // 변경 전 #include #include // 변경 후 #include #include ``` ### 2.3 라이브러리 변경 ``` d3d8.lib → d3d9.lib d3dx8.lib → d3dx9.lib d3dx8dt.lib → d3dx9d.lib (디버그) dxerr8.lib → dxerr9.lib ``` ### 2.4 디바이스 생성 변경 ```cpp // DX8 Direct3DCreate8(D3D_SDK_VERSION); CreateDevice(..., &d3dpp, &m_pd3dDevice); // DX9 Direct3DCreate9(D3D_SDK_VERSION); CreateDevice(..., &d3dpp, &m_pd3dDevice); ``` ### 2.5 Present 파라미터 변경 ```cpp // DX8 D3DPRESENT_PARAMETERS d3dpp; // DX9 - 동일하지만 일부 플래그 추가됨 D3DPRESENT_PARAMETERS d3dpp; // PresentationInterval 옵션 확장 ``` ### 2.6 셰이더 관련 변경 - **Vertex Shader**: 버전 1.x → 2.0/3.0 지원 - **Pixel Shader**: 버전 1.x → 2.0/3.0 지원 - 셰이더 상수 테이블 관리 개선 ### 2.7 리소스 관리 변경 - **Lock 플래그**: `D3DLOCK_NOSYSLOCK` 제거됨 - **쿼리 시스템**: 새로운 쿼리 인터페이스 추가 --- ## 3. 마이그레이션 전략 ### 3.1 단계별 접근 (Phase-by-Phase) #### **Phase 1: 준비 단계** ✅ - [x] 현재 코드 분석 완료 - [x] DX9 SDK 설치 확인 - [x] dx9 브랜치 생성 - [ ] DX9 라이브러리 준비 #### **Phase 2: 코어 인터페이스 변환** (우선순위: 최상) 1. **EnumD3D.h/cpp** - 디바이스 열거 시스템 - `LPDIRECT3D8` → `LPDIRECT3D9` - `D3DCAPS8` → `D3DCAPS9` - `D3DADAPTER_IDENTIFIER8` → `D3DADAPTER_IDENTIFIER9` - `Direct3DCreate8()` → `Direct3DCreate9()` 2. **BaseGraphicsLayer.h/cpp** - 그래픽 시스템 루트 - `LPDIRECT3DDEVICE8` → `LPDIRECT3DDEVICE9` - `LPDIRECT3D8` → `LPDIRECT3D9` - 디바이스 생성 코드 수정 3. **RenderDevice.h/cpp** - 렌더 디바이스 - `LPDIRECT3DDEVICE8` → `LPDIRECT3DDEVICE9` #### **Phase 3: 텍스처 및 리소스 시스템** (우선순위: 상) 4. **Texture.h/cpp, NTexture.h/cpp** - 텍스처 관리 - `IDirect3DTexture8` → `IDirect3DTexture9` - `IDirect3DSurface8` → `IDirect3DSurface9` - `D3DXCreateTextureFromFile` 호환성 확인 5. **VertexBuffer.h/cpp** - 버텍스 버퍼 - `IDirect3DVertexBuffer8` → `IDirect3DVertexBuffer9` - `IDirect3DIndexBuffer8` → `IDirect3DIndexBuffer9` 6. **RenderTexture.h/cpp, RenderTargetTexture.h/cpp** - 렌더 타겟 관련 코드 업데이트 #### **Phase 4: 렌더링 시스템** (우선순위: 상) 7. **Zalla3D Scene Class** - 씬 렌더링 - `Z3DRenderable.h/cpp` - `Z3DTexture.h/cpp` - `Z3DGeneralChrModel.h/cpp` - `Z3DMultipartSkin.h/cpp` - `NMesh.h/cpp` - `OctreeScene.h/cpp` 8. **Effect 시스템** - `EffMeshloader.h/cpp` - `SMRHeader.h/cpp` - `CGemRender.h/cpp` #### **Phase 5: UI 및 폰트** (우선순위: 중) 9. **d3dfont.h/cpp** - 폰트 시스템 - `ID3DXFont` 인터페이스 업데이트 10. **Sprite 시스템** - `Sprite.h` - `RYLSpriteEX.h` #### **Phase 6: 고급 기능** (우선순위: 중) 11. **셰이더 시스템** - 버텍스/픽셀 셰이더 코드 검토 - 셰이더 버전 확인 및 업데이트 12. **워터 및 특수 효과** - `WaterW.h/cpp` - `WaterScene.h/cpp` #### **Phase 7: 프로젝트 설정** (우선순위: 최상) 13. **vcxproj 파일 수정** - 링크 라이브러리 변경 - 인클루드 경로 업데이트 - 프리프로세서 정의 수정 #### **Phase 8: 테스트 및 검증** (우선순위: 최상) 14. **빌드 및 테스트** - 컴파일 오류 수정 - 런타임 테스트 - 성능 비교 - 렌더링 결과 검증 ### 3.2 자동화 스크립트 ```bash # 헤더 파일 일괄 변경 find . -type f \( -name "*.h" -o -name "*.cpp" \) -exec sed -i 's///g' {} + find . -type f \( -name "*.h" -o -name "*.cpp" \) -exec sed -i 's///g' {} + # 인터페이스 변경 find . -type f \( -name "*.h" -o -name "*.cpp" \) -exec sed -i 's/LPDIRECT3D8/LPDIRECT3D9/g' {} + find . -type f \( -name "*.h" -o -name "*.cpp" \) -exec sed -i 's/LPDIRECT3DDEVICE8/LPDIRECT3DDEVICE9/g' {} + find . -type f \( -name "*.h" -o -name "*.cpp" \) -exec sed -i 's/IDirect3DTexture8/IDirect3DTexture9/g' {} + find . -type f \( -name "*.h" -o -name "*.cpp" \) -exec sed -i 's/IDirect3DSurface8/IDirect3DSurface9/g' {} + find . -type f \( -name "*.h" -o -name "*.cpp" \) -exec sed -i 's/IDirect3DVertexBuffer8/IDirect3DVertexBuffer9/g' {} + find . -type f \( -name "*.h" -o -name "*.cpp" \) -exec sed -i 's/IDirect3DIndexBuffer8/IDirect3DIndexBuffer9/g' {} + # 구조체 변경 find . -type f \( -name "*.h" -o -name "*.cpp" \) -exec sed -i 's/D3DCAPS8/D3DCAPS9/g' {} + find . -type f \( -name "*.h" -o -name "*.cpp" \) -exec sed -i 's/D3DADAPTER_IDENTIFIER8/D3DADAPTER_IDENTIFIER9/g' {} + # API 함수 변경 find . -type f \( -name "*.h" -o -name "*.cpp" \) -exec sed -i 's/Direct3DCreate8/Direct3DCreate9/g' {} + ``` --- ## 4. 리스크 및 주의사항 ### 4.1 높은 리스크 영역 1. **셰이더 코드**: 버전 차이로 인한 호환성 문제 가능 2. **렌더 스테이트**: 일부 스테이트 동작 변경 3. **텍스처 포맷**: 일부 포맷 지원 차이 4. **성능**: DX9가 더 최적화되어 있을 수 있음 ### 4.2 테스트 체크리스트 - [ ] 디바이스 생성 및 초기화 - [ ] 텍스처 로드 및 렌더링 - [ ] 캐릭터 모델 렌더링 - [ ] UI 렌더링 - [ ] 이펙트 시스템 - [ ] 폰트 렌더링 - [ ] 워터 렌더링 - [ ] 전체 게임 실행 --- ## 5. DX9 SDK 요구사항 ### 5.1 필요 파일 - **Include**: `d3d9.h`, `d3dx9.h`, `d3dx9core.h`, `d3dx9math.h`, `d3dx9mesh.h`, `d3dx9tex.h` - **Lib**: `d3d9.lib`, `d3dx9.lib`, `d3dx9d.lib`, `dxerr9.lib`, `dxguid.lib` - **DLL**: `d3d9.dll`, `d3dx9_43.dll` (재배포 필요) ### 5.2 SDK 버전 - **권장**: DirectX 9.0c (August 2009) - 가장 안정적 - **최소**: DirectX 9.0b --- ## 6. 예상 작업 시간 | Phase | 작업 | 예상 시간 | |-------|------|----------| | 1 | 준비 | 0.5일 | | 2 | 코어 인터페이스 | 1일 | | 3 | 텍스처/리소스 | 1일 | | 4 | 렌더링 시스템 | 2일 | | 5 | UI/폰트 | 1일 | | 6 | 고급 기능 | 1일 | | 7 | 프로젝트 설정 | 0.5일 | | 8 | 테스트/검증 | 2일 | | **합계** | | **9일** | --- ## 7. 롤백 계획 ### 7.1 브랜치 전략 - `master`: DX8 원본 유지 - `dx9`: DX9 마이그레이션 작업 - 문제 발생 시 언제든 master로 복귀 가능 ### 7.2 백업 - 현재 작업 중인 Client 디렉토리 전체 백업 권장 - Git 커밋을 단계별로 세밀하게 진행 --- ## 8. 다음 단계 1. ✅ 이 문서 검토 2. ⏳ DX9 SDK 라이브러리 준비 3. ⏳ Phase 2 시작: EnumD3D 변환 4. ⏳ 단계별 커밋 및 테스트 --- **작성일**: 2025-11-30 **작성자**: Claude (AI Assistant) **현재 브랜치**: dx9