Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

codingfarm

4. 예제 응용 프로그램 프레임워크 - 메서드 본문

computer graphics/DX12 book

4. 예제 응용 프로그램 프레임워크 - 메서드

scarecrow1992 2021. 2. 8. 23:00

이 책의 예제 프로그램들은 d3dUtil.h, d3dUtil.cpp, d3dApp.h, d3dApp.cpp 파일의 코드를 사용한다.

d3dUtil 파일 : 유용한 편의용 코드가 포함됨

d3dApp 파일 : direct3D 예제 응용 프로그램을 캡슐화 하는데 스이는 핵심 Direct3D 응용 프로그램 클래스 코드가 들어 있다.

 

Win32 프로그래밍 지식은 이미 있다고 가정한다.

이 프레임워크는 창 생성 코드와 Direct3D 초기화 코드를 숨기는것이 목적이다.

 


개요

본격적으로 분석하기에 앞서 프로젝트의 class diagram과 sequence diagram을 통해 클래스 관계와 실행 흐름에 대해 살펴보겠다.

 

 

1. Sequence Diagram

 

 

 

InitDirect3D와 D3DApp의 관계를 눈여겨 볼만하다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
class D3DApp {
protected :
    D3DApp(HINSTANCE hInstance);
    D3DApp(const D3DApp& rhs) = delete;
    D3DApp& operator=(const D3DApp& rhs) = delete;
    virtual ~D3DApp();
 
public:
    static D3DApp* GetApp();
    virtual bool Initialize();
 
 
protected:
    virtual void OnResize(); 
    virtual void Update(const GameTimer& gt)=0;
    virtual void Draw(const GameTimer& gt)=0;
 
    static D3DApp* mApp;
};
 
 
D3DApp::D3DApp(HINSTANCE hInstance)
:    mhAppInst(hInstance)
{
    // Only one D3DApp can be constructed.
    assert(mApp == nullptr);
    mApp = this;
}
 
D3DApp* D3DApp::GetApp()
{
    return mApp;
}
 
 
class InitDirect3DApp : public D3DApp {
public:
    public:
    InitDirect3DApp(HINSTANCE hInstance);
    ~InitDirect3DApp();
 
    virtual bool Initialize()override;
 
private:
    virtual void OnResize()override;
    virtual void Update(const GameTimer& gt)override;
    virtual void Draw(const GameTimer& gt)override;
};
 
 
InitDirect3DApp::InitDirect3DApp(HINSTANCE hInstance)
: D3DApp(hInstance) 
{ }
 
InitDirect3DApp::~InitDirect3DApp()
{ }
 
bool InitDirect3DApp::Initialize()
{
    if(!D3DApp::Initialize())
        return false;
    
    return true;
}
 
void InitDirect3DApp::OnResize()
{
    D3DApp::OnResize();
}
cs

InitDirect3DApp 클래스가 D3DApp을 상속받는다.

만약 InitDirect3DApp의 인스턴스를 생성하게 되면 D3DApp의 생성자가 호출되며, 여기서 mApp 필드에 생성된 인스턴스가 저장된다.

mApp은 static type이며, 이 필드는 static 메서드인 GetApp을 통해 접근 가능하다.

즉, InitDirect3DApp이 어디서 생성되든, D3DApp의 GetApp메서드를 통해 프로그램 전역에서 접근 가능하다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Comments