D3D에서 이용가능한 텍스처 메모리의 의미

반응형

출처 : http://blog.naver.com/lifeisforu/80022419898 

 
현재 필자의 그래픽카드의 스펙은 다음과 같다.

칩종류 : Geforce 6200
DAC 종류 : Integrated RAMDAC
메모리 크기 : 256 MB
어댑터 문자열 : Geforace 6200
BIOS 정보 : Version 5.44.A2.10.00

이제 IDirect3DDevice::GetAvailableTextureMem 메서드를 호출하면 그 결과는 다음과 같다.

509607936

Direct3D API 도움말에는 IDirect3DDevice::GetAvailableTextureMem 에 대해서 다음과 같이 기술하고 있다.

인용:
반환값은 가장 가까운 MB 근처의 값이다. 이것은 비디오 메모리가 추정하는 값이 정렬하기에는 결코 정확하지 않다는 사실과 특정 리소스에 의한 소비에 영향을 미치는 다른 이슈들을 반영하기 위해서 수행된다. 응용프로그램은 이 값을 사용해 얼마나 많은 수준의 밉맵이 할당되도록 시도할 수 있는 지와 같은 큰 규모의 리소스 결정을 하기 위해서 사용할 수 있지만, 이 값을 사용해 다른 리소스를 할당하기 위한 충분한 메모리가 남았는지를 판단할 수는 없다.


그렇다면 위에서 언급한 509607936 이라는 값의 의미는 무엇인지 생각해 볼 필요가 있다. 만약 도움말에서 언급했던 것처럼 이것이 MB 값이라면

509607936 MB / 1024 = 497664 GB
497664 / 1024 = 486 TB

가 된다. 상식적으로 말이 안 된다고 생각이 들 것이다. 좀 더 현실적인 값이 되기 위해서는

509607936 Byte / 1024 = 497664 KB
497664 KB / 1024 = 486 MB

그래도 우리가 가지고 있는 그래픽 카드의 메모리 한계보다 큰 수치가 나온다. 그렇지만 나름대로 현실적인 값이 되었다. 혹시나 해서 D3DXFONT 를 생성한 다음에도 호출해 보았지만 동일한 값이 나왔다.

아무래도 이 값은 비디오 메모리와 AGP 메모리를 모두 합한 정도의 값이 아닐까라는 추정을 해 보았다. 현재 상황에서 이것을 확신할 수는 없지만 말이다.

그래서 잠시 글을 중단하고 AGP 메모리에 대한 글을 검색해 보았다. http://www.imaso.co.kr/?doc=bbs/gnuboard_pdf.php&bo_table=article&page=1&wr_id=4618&publishdate=20040501 에 가면 전체 내용을 볼 수 있다.

인용:
AGP 메모리와 비디오 메모리
먼저 중요한 AGP(Accelerated Graphics Port)와 비디오 메모리에 관해 간단히 이야기해 보겠다. 필자가 AGP 메모리를 알아내기 위해 엔비디아 ATI 관계자에게 메일을 보내고 이곳저곳에서 문서를 찾아보고 그나마 3D 카드와 AGP의 관계를 알기까지는 꽤 오랜 시간이 걸렸다. 사용자는 CMOS에서 AGP Apecture 사이즈를 직접 지정할 수가 있는데, 만약 자신의 전체 램이 512MB라면 128MB~256MB 정도로 설정하고 256MB라면 64~128MB로 설정해서 사용하길 바란다(AGP 사이즈를 크게 할수록 많은 리소스를 사용하는 3D 게임들이 원활하게 돌아간다). 이처럼 AGP 메모리라고 해서 따로 있는 것이 아니라 그냥 일반 램인데 특별히 영역을 지정해주는 것이다.
단지 OS가 AGP 메모리를 특별하게 처리하는데 속도를 위해서 특별히 잘 관여하지 않는다고 보면 된다. OS는 안정성이 우선이기 때문에 일반 메모리의 경우 페이징 처리부터 가상메모리 처리 및 OS 통제가 심하지만 AGP는 3D 카드가 직접 읽을 수 있도록 CPU가 빨리 쓸 수 있도록 설계되어 있다. 다음은 AGP의 특성이다.

- CPU가 읽는(Read) 속도는 매우 느리고 쓰는 것은 빠르다.
- 3D 카드에서 시스템 메모리를 읽는 것은 매우 느리고 AGP 메모리를 읽는 것이 훨씬 빠르다.
- 사실상 물리적(Physical) 메모리에 잡힌다. 물리적 메모리에 잡힌다는 것은 속도상 많은 이득이 있다.
- AGP 메모리는 OS가 관리해 주기 때문에 많은 양의 메모리를 사용하더라도 그 이상의 메모리를 수용할 수가 있다. 다만 용량의 한계에 도달했을 때 시스템 메모리와 AGP 메모리간의 전송이 일어나 화면의 끊김 현상이 생기게 된다.

이와 같은 특성으로 인해 충돌검사를 한다고 버텍스 버퍼에 락(Lock)을 걸어서 읽는다거나 하는 경우가 없어야 할 것이다(버텍스 정보를 시스템 메모리에 같이 가지고 있든가 해야 된다). 그리고 또 한 가지 비디오 메모리에 대한 중요한 정의를 내린다면 ‘비디오 메모리 = AGP 메모리 + 3D 카드 메모리(예전에 텍스처 메모리라 불린)’이다. 여기서 3D 카드 메모리는 일반적으로 3D 카드 스펙 중 128MB 또는 64MB라고 이야기하는 용량을 말한다. 비디오 메모리에는 텍스처, Z-버퍼, 셰도우 버퍼, 프레임 버퍼, 버텍스 버퍼, 스텐실 버퍼 등 모든 3D 카드가 처리하는 것들이 올라가게 된다. 결국 중요한 것은 AGP 메모리나 3D 카드의 메모리나 비디오 메모리라고 해도 3D 하드웨어에서는 같이 처리된다는 점이다. D3D8 인터페이스 중 다음과 같은 API로 현재 사용할 수 있는 비디오 메모리 양을 알아낼 수 있다.

pd3dDevice->GetAvailableTextureMem();

이와 같은 API로 응용 프로그램의 리소스를 적절하게 비디오 메모리에 올릴 수 있는 디텍트(Detect) 기능을 넣어주면 좋다.


역시 AGP 와 3D 메모리를 합친 것이 비디오 메모리의 정의였다. 그렇다면 AGP에 230 MB 가 할당되었다는 것인데, 2의 배승수로 되어 있지 않다는 점이 약간 이상하기는 하지만, 뭐 상관없다. 알아냈다는 것이 중요하니까...

즉 GetAvailableTextureMem 로는 3D 카드가 가지고 있는 메모리 양을 알 수 없다는 문제점이 있다. 하지만 중요한 것은 비디오 메모리의 총량을 대충 알 수 있다는 점이다. 적어도 이 정도 정보만 알고 있다면, 메모리를 어느 정도 할당해야지 프로그램이 원할하게 돌아갈 수 있을지 결정하는 데는 큰 도움이 될 것이라 생각한다.

ps. 혹시 AGP를 관리하고자 한다면 AgpXXX 라는 함수들이 Video.h 에 들어 있다. MSDN을 참조하면 알 수 있을 것이다. 사용법도 잘 모르겠고 쓸 이유도 없다는 생각이 들기는 하지만, 혹시 필요할까 싶어서 일단 적어 보았다.

'유용한 것들_func' 카테고리의 다른 글

폴더지정 창 열기  (0) 2010.06.09
InterlockedIncrement(), InterlockedDecrement()  (0) 2010.06.04
IDirect3DDevice9::GetAvailableTextureMem  (0) 2010.06.01
메모리 정보 가져오기  (0) 2010.06.01
이미지 정보 (dx)  (0) 2010.05.12
TAGS.

Comments