Files
Client/DX8_TO_DX9_MIGRATION_PLAN.md
docker-debian 97264e3d7f DX8 to DX9 Migration - Phase 1: Core Interfaces and Headers
Major Changes:
- Converted all d3d8.h includes to d3d9.h
- Converted all d3dx8.h includes to d3dx9.h
- Updated all DX8 interfaces to DX9:
  * LPDIRECT3D8 -> LPDIRECT3D9
  * LPDIRECT3DDEVICE8 -> LPDIRECT3DDEVICE9
  * IDirect3DTexture8 -> IDirect3DTexture9
  * IDirect3DSurface8 -> IDirect3DSurface9
  * IDirect3DVertexBuffer8 -> IDirect3DVertexBuffer9
  * IDirect3DIndexBuffer8 -> IDirect3DIndexBuffer9
- Updated structs:
  * D3DCAPS8 -> D3DCAPS9
  * D3DADAPTER_IDENTIFIER8 -> D3DADAPTER_IDENTIFIER9
- Updated API calls:
  * Direct3DCreate8 -> Direct3DCreate9
- Updated project files (.vcxproj, .vcproj):
  * d3d8.lib -> d3d9.lib
  * d3dx8.lib -> d3dx9.lib
  * dxerr8.lib -> dxerr.lib
- Fixed d3dfont.h/cpp:
  * Updated StateBlock from DWORD handles to IDirect3DStateBlock9*
  * Changed BeginStateBlock/EndStateBlock/CaptureStateBlock/ApplyStateBlock
  * Updated render states (D3DRS_EDGEANTIALIAS -> D3DRS_ANTIALIASEDLINEENABLE)
  * Moved texture sampling states from SetTextureStageState to SetSamplerState

Files affected: 250+ files across Engine and Client directories
Conversion method: Automated sed scripts with manual fixes for stateblocks

Next phase: Build testing and runtime verification
2025-12-01 09:25:06 +09:00

349 lines
10 KiB
Markdown

# 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 <d3d8.h>
#include <d3dx8.h>
// 변경 후
#include <d3d9.h>
#include <d3dx9.h>
```
### 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/<d3d8\.h>/<d3d9.h>/g' {} +
find . -type f \( -name "*.h" -o -name "*.cpp" \) -exec sed -i 's/<d3dx8\.h>/<d3dx9.h>/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