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

10 KiB

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

static LPDIRECT3DDEVICE8 m_pd3dDevice;
static LPDIRECT3D8 m_pD3D;
  • 역할: 전체 그래픽 시스템의 루트 클래스
  • 영향도: (최상위 - 모든 렌더링 의존)

파일: RenderDevice.h / RenderDevice.cpp

LPDIRECT3DDEVICE8 m_pd3dDevice;
  • 역할: 렌더링 디바이스 래퍼
  • 영향도:

파일: EnumD3D.h / EnumD3D.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 헤더 파일 변경

// 변경 전
#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 디바이스 생성 변경

// DX8
Direct3DCreate8(D3D_SDK_VERSION);
CreateDevice(..., &d3dpp, &m_pd3dDevice);

// DX9
Direct3DCreate9(D3D_SDK_VERSION);
CreateDevice(..., &d3dpp, &m_pd3dDevice);

2.5 Present 파라미터 변경

// 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: 준비 단계

  • 현재 코드 분석 완료
  • DX9 SDK 설치 확인
  • dx9 브랜치 생성
  • DX9 라이브러리 준비

Phase 2: 코어 인터페이스 변환 (우선순위: 최상)

  1. EnumD3D.h/cpp - 디바이스 열거 시스템

    • LPDIRECT3D8LPDIRECT3D9
    • D3DCAPS8D3DCAPS9
    • D3DADAPTER_IDENTIFIER8D3DADAPTER_IDENTIFIER9
    • Direct3DCreate8()Direct3DCreate9()
  2. BaseGraphicsLayer.h/cpp - 그래픽 시스템 루트

    • LPDIRECT3DDEVICE8LPDIRECT3DDEVICE9
    • LPDIRECT3D8LPDIRECT3D9
    • 디바이스 생성 코드 수정
  3. RenderDevice.h/cpp - 렌더 디바이스

    • LPDIRECT3DDEVICE8LPDIRECT3DDEVICE9

Phase 3: 텍스처 및 리소스 시스템 (우선순위: 상)

  1. Texture.h/cpp, NTexture.h/cpp - 텍스처 관리

    • IDirect3DTexture8IDirect3DTexture9
    • IDirect3DSurface8IDirect3DSurface9
    • D3DXCreateTextureFromFile 호환성 확인
  2. VertexBuffer.h/cpp - 버텍스 버퍼

    • IDirect3DVertexBuffer8IDirect3DVertexBuffer9
    • IDirect3DIndexBuffer8IDirect3DIndexBuffer9
  3. RenderTexture.h/cpp, RenderTargetTexture.h/cpp

    • 렌더 타겟 관련 코드 업데이트

Phase 4: 렌더링 시스템 (우선순위: 상)

  1. Zalla3D Scene Class - 씬 렌더링

    • Z3DRenderable.h/cpp
    • Z3DTexture.h/cpp
    • Z3DGeneralChrModel.h/cpp
    • Z3DMultipartSkin.h/cpp
    • NMesh.h/cpp
    • OctreeScene.h/cpp
  2. Effect 시스템

    • EffMeshloader.h/cpp
    • SMRHeader.h/cpp
    • CGemRender.h/cpp

Phase 5: UI 및 폰트 (우선순위: 중)

  1. d3dfont.h/cpp - 폰트 시스템

    • ID3DXFont 인터페이스 업데이트
  2. Sprite 시스템

    • Sprite.h
    • RYLSpriteEX.h

Phase 6: 고급 기능 (우선순위: 중)

  1. 셰이더 시스템

    • 버텍스/픽셀 셰이더 코드 검토
    • 셰이더 버전 확인 및 업데이트
  2. 워터 및 특수 효과

    • WaterW.h/cpp
    • WaterScene.h/cpp

Phase 7: 프로젝트 설정 (우선순위: 최상)

  1. vcxproj 파일 수정
    • 링크 라이브러리 변경
    • 인클루드 경로 업데이트
    • 프리프로세서 정의 수정

Phase 8: 테스트 및 검증 (우선순위: 최상)

  1. 빌드 및 테스트
    • 컴파일 오류 수정
    • 런타임 테스트
    • 성능 비교
    • 렌더링 결과 검증

3.2 자동화 스크립트

# 헤더 파일 일괄 변경
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