게임개발/스터디

[스터디] DirectX9의 메모리 풀

감물 2024. 6. 20. 16:59

DirectX9의 메모리 풀

typedef enum _D3DPOOL {

    D3DPOOL_DEFAULT   = 0,

    D3DPOOL_MANAGED   = 1,

    D3DPOOL_SYSTEMMEM = 2,

    D3DPOOL_SCRATCH   = 3,

    D3DPOOL_FORCE_DWORD = 0x7fffffff

} D3DPOOL;

 

 

DirectX9은 여러 메모리 풀을 사용하는데 그 구분을 D3DPOOL이라는 열거형으로 하고 있다. 메모리 풀은 4개가 있는데 하나씩 간단하게 알아보겠다. 초반에는 D3DPOOL_MANAGED만 사용할 것이다. 나중에 고급 기술을 익히다 보면D3DPOOL_DEFAULT D3DPOOL_SYSTEMMEM도 사용하게 될 것이다.

 

 

D3DPOOL_DEFUALT

디폴트 메모리 풀을 의미하는데 VRAM에 데이터를 할당할 때 사용한다. , 그래픽 카드의 VRAM에 생성된 메모리 풀을 이용하겠다는 것이다. 하지만 처음부터 사용하기에는 워낙 까다롭고 신경 쓸 게 많아서 초반에는 추천하지 않는다. (Reset Lost)

 

D3DPOOL_MANAGED

가장 사용하기가 편한 메모리 풀이다. 설명을 보면 VRAM과 시스템 메모리 중 적절한 곳을 사용한다고 하는데 일반적으로는 시스템 메모리이다. 특별한 일이 없다면 malloc()이나 new처럼 힙 영역에 메모리를 할당해준다. 참고로 시스템 메모리에 할당한 메모리를 VRAM에 올리는 것도 가능하다. DirectX9이 내부적으로 판단하기도 하지만 PreLoad()를 이용하면 강제로 VRAM에 올릴 수도 있다. 그런데 뭐... 초반에는 VRAM을 처리하기가 어려우므로 메모리 풀은 D3DPOOL_MANAGED로만 사용하는 걸 추천한다.

 

D3DPOOL_SYSTEMMEM

시스템 메모리에 할당할 데이터를 지정할 때 사용한다.

 

D3DPOOL_SCRATCH

시스템 메모리에 할당할 데이터를 지정하는 건 같지만 그래픽 카드로부터 자유롭다. D3DPOOL_SYSTEMMEM은 그래픽 카드에 의존하므로 데이터에 접근이 가능하지만, D3DPOOL_SCRATCH는 그래픽 카드에 의존하지 않기 때문에 데이터에 접근이 불가능하다. 하지만 메모리 풀에서 메모리 풀로 데이터 복사는 가능하다. 스크린샷을 찍을 때 사용되는 메모리 풀이다.

 

 

내용을 좀 생략했는데 DirectX9이 사용하는 메모리 풀은 장치 손실(Lost Device)과 관련이 있다. 장치 손실은 프로그램을 실행한 뒤에 전체화면으로 바꾼다던가 Alt + Tab을 누를 때 발생한다. 장치 손실이 발생하면 메모리 풀에 있는 데이터를 다시 적용해야 하는데 D3DPOOL_DEFAULT인 경우에는 처리가 까다롭다. 장치 손실이 발생하면 장치 복구(Reset Device)를 해야 하는데 다른 메모리 풀은 시스템 메모리에 있으니 괜찮지만, D3DPOOL_DEFAULT은 메모리를 해제한 후에 다시 할당해야 한다. 이 과정이 생각보다 복잡하다. 그래서 초반에는 시스템 메모리와 VRAM을 왔다 갔다 할  수 있는 D3DPOOL_MANAGED를 사용한다.

D3DPOOL_MANAGED의 단점은 VRAM이 아니라 시스템 메모리에 의존해서 처리 속도가 느리다는 건데...

예제 프로그램 정도는 D3DPOOL_MANAGED만 사용해도 무난하다. 나중에 DirectX9이 좀 익숙해지면 그때 바꿔보자!.

 

 

D3DPOOL_DEFAULT D3DPOOL_MANAGED를 가장 많이 사용하는데 초반에는 D3DPOOL_MANAGED!

괜히 D3DPOOL_DEFAULT를 사용했다가 텍스처를 다룰 때 멘붕되고 엄청 헤매게 될 것이다. 일단은 D3DPOOL_MANAGED에 익숙해진 다음에 D3DPOOL_DEFAULT를 사용하면 될 것이다.

 

 

PC의 물리적인 메모리는 system memory, video memory가 있고, system memory AGP Aperture가 위치한다. system메모리가 부족하면 하드에 가상메모리를 만들듯이, 비디오메모리가 부족하면 시스템메모리에 AGP 영역을 만들어서 비디오메모리처럼 쓰는듯하고, 이 부분은 DirectX가 알아서 해주므로 딱히 내가 해줄 것은 없다. 아무튼 리소스를 D3DPOOL_DEFAULT 로 로딩하면, 비디오 메모리(모자라면 AGP에도)에 메모리가 잡히고, D3DPOOL_MANAGED 로 로딩하면 시스템 메모리에 로드가 되고, DrawPrimitive시에 비디오 메모리에 없으면 카피해서 그리고, 있으면 비디오 메모리에 있던 것을 그냥 쓰는 듯 하다. 그렇게 되면 MANAGED의 경우 시스템메모리에도 있고, 그것을 카피한 비디오에도 메모리가 잡혀서 2배가 된다. 이건 device lost DX가 알아서 시스템 메모리에서 다시 비디오메모리로 카피한다는 것을 뒷받침한다.

 

D3DPOOL_DEFAULT 일 경우 생성시부터 비디오메모리 쪽에 잡혀서 상관없겠지만, D3DPOOL_MANAGED 경우 로딩 당시에는 비디오메모리는 비어있고, 그려줄 때 카피를 행하게 되는데, 미리 시스템 메모리에 로드 된 것을 비디오 메모리에 카피해두는 함수가 PreLoad().

 

 

https://blog.naver.com/ruvendix/221333044853

 

메모리 풀(Memory Pool) 1편

이번 포스팅 안내안녕하세요 루벤딕스입니다. 이제 DirectX9을 본격적으로 시작하기 위해 알아야 할 내용...

blog.naver.com

 

https://blog.naver.com/ruvendix/221333068487

 

메모리 풀(Memory Pool) 2편

이번 포스팅 안내안녕하세요 루벤딕스입니다. 저번 포스팅에서 메모리 풀에 대해 알아봤는데요, 생소한 내...

blog.naver.com