일단 Device 차원의 최적화를 이야기할까 한다. 나머지는 프로그래머의 역량에 따라 충분히 개선될 수 있기 때문이다. 그렇지만 지금 이 글에 나오는 내용은 단순히 프로그래머의 역량에 의존적이지 않기 때문에 필히 알아두어야 하겠다.
1. 자주 업데이트 되는 VertexBuffer와 IndexBuffer는 일반적으로 D3DPOOL_DEFAULT 에 생성해야 한다.
D3DPOOL_MANAGED메모리풀을 사용하면 보통 두 번의 메모리 복사가 일어나므로 퍼포먼스 향상에 도움이 되지 않는다.
2. 가능하면 생성된 버퍼로부터 값들을 읽지 말아야 한다.
일반적으로 AGP나 비디오 메모리로부터 값을 읽는것은 매우 느리다. 이것은 옛날 2D 때부터도 그랬다. 그래서 만일 값들을 많이 읽어야 한다면 차라리 D3DPOOL_SYSTEMMEM 에 버퍼를 생성하고 읽는게 낫다.
아니면 System 에 따로 Buffer의 복사본을 두고 쓰는게 낫다.
3. 오직 쓰기만하는 버퍼는 D3DUSAGE_WRITEONLY 와 D3DPOOL_MANAGED를 사용하라.
DirectX Software Development Kit Document에는 D3DUSAGE_WRITEONLY flag 를 사용하면 버퍼에 쓰고 화면에 렌더링하는데 가장 효율적인 메모리 위치를 찾아 할당해준다고 나와있다.
그렇다면 메로리 할당 순서는?
1. 렌더타겟
2. D3DPOOL_DEFAULT
3. D3DPOOL_MANAGED
이 순서를 반드시 지키는 것이 큰 규모의 게임을 만드는데 큰 도움이 될 것이다. 나중에 비디오 메모리가 부족하다고 난리치지말자.
1. 자주 업데이트 되는 VertexBuffer와 IndexBuffer는 일반적으로 D3DPOOL_DEFAULT 에 생성해야 한다.
D3DPOOL_MANAGED메모리풀을 사용하면 보통 두 번의 메모리 복사가 일어나므로 퍼포먼스 향상에 도움이 되지 않는다.
2. 가능하면 생성된 버퍼로부터 값들을 읽지 말아야 한다.
일반적으로 AGP나 비디오 메모리로부터 값을 읽는것은 매우 느리다. 이것은 옛날 2D 때부터도 그랬다. 그래서 만일 값들을 많이 읽어야 한다면 차라리 D3DPOOL_SYSTEMMEM 에 버퍼를 생성하고 읽는게 낫다.
아니면 System 에 따로 Buffer의 복사본을 두고 쓰는게 낫다.
3. 오직 쓰기만하는 버퍼는 D3DUSAGE_WRITEONLY 와 D3DPOOL_MANAGED를 사용하라.
DirectX Software Development Kit Document에는 D3DUSAGE_WRITEONLY flag 를 사용하면 버퍼에 쓰고 화면에 렌더링하는데 가장 효율적인 메모리 위치를 찾아 할당해준다고 나와있다.
그렇다면 메로리 할당 순서는?
1. 렌더타겟
2. D3DPOOL_DEFAULT
3. D3DPOOL_MANAGED
이 순서를 반드시 지키는 것이 큰 규모의 게임을 만드는데 큰 도움이 될 것이다. 나중에 비디오 메모리가 부족하다고 난리치지말자.

















