반응형

D3DXCreateTextureFromFileEx() 함수

송정헌2010-03-12 19:53:37주소복사
조회 764  스크랩 2

01.HRESULT D3DXCreateTextureFromFileEX(
02.       LPDIRECT3DDEVICE9 pDevice,       // 디바이스
03.       LPCTSTR pSrcFile,                  // 텍스쳐 파일 경로
04.       UINT Width,                           // 폭과 높이 0인 경우 파일로부터 취득
05.       UINT Height,                                         
06.       UINT MipLevels,                     // 밉레벨의 수 0인경우 완전한 밉맵체인 
07.       DWORD Usage,                     // 렌더링 타겟으로서 사용
08.       D3DFORMAT Format,              // D3DFORMAT 열거형 멤버
09.       D3DPOOL Pool,                      // 텍스처의 배치처가 되는 메모리 클래스 기술
10.       DWORD Filter,                       // 필터 
11.       DWORD MipFileter,
12.       D3DCOLOR ColorKey,            // 투영이 되는 D3DCOLOR의 값 
13.       D3dXIMAGE_INFO *pSrcInfo,  // 이미지 파일내에 여러 정보 
14.       PALETTEENTRY *pPalette,       // 저장하는 256색 팔레트를 나타내는 포인터
15.      LPDIRECT3DTEXTURE9 *ppTexture
16.);
 
 
 
 
 
==========================================================================================

D3DXCreateTextureFromFileEx를 쓸때 항상 주의하자!

http://telnet.or.kr/directx/graphics/reference/d3dx/functions/texture/d3dxcreatetexturefromfileex.htm

관련 레퍼런스 문서이다.

프로젝트를 진행하다가, D3DXCreateTextureFromFileEx를 이용해 텍스쳐를 불러오는 부분에서 엄청난

오버헤드가 발생하는 것을 발견하였다. 고작 수십 메가바이트의 텍스쳐를 로딩하는 데 10초 가까운 시간이 걸리는 것.



1. 문제점이 저 함수에 있는지를 확인한다.

가장 단순하게, 관련 코드를 주석 처리하고 프로그램을 돌려본다. 로딩이 사라졌다. 역시 저 함수가 문제다.


2. VTune로 어디에서 오버헤드가 걸리는지 확인한다.

확인 결과, 쌩뚱맞은 D3DXSHProjectCubeMap이라는 함수가 cpu clock의 대부분을 소요하고 있다는 사실을 확인하였다.

구글링 결과, 별다른 함수는 아니고, 'VTune 내부의 라이브러리 오류가 아니냐'라는 의견도 보였다. 하지만, 그것은 아닐 테고.

디스어셈블리를 보다, 함수 이름이 명확하게 찍혀 있다. 맞는 함수 같다.


하지만, 프로그램 내부에서 저 함수를 사용한 일은 없다. 다시 문제 해결에 나선다.


3. 레퍼런스를 다시 뜯어본다.

http://telnet.or.kr/directx/graphics/reference/d3dx/functions/texture/d3dxcreatetexturefromfileex.htm

다시 눈을 크게 뜨고 보자. 5번째 parameter에서 밉맵의 깊이를 정한다. 필자가 사용한 코드는,
(필자가 작성한 코드는 아니다. 다른 프로그래머의 코드를 튜닝하고 있던 중이였다.)

hr = D3DXCreateTextureFromFileEx(g_pd3dDevice, token, _textureWidth, _textureHeight, 0, 0,
D3DFMT_UNKNOWN,D3DPOOL_DEFAULT,D3DX_FILTER_BOX | D3DX_FILTER_DITHER, 0, 0, 0, 0, &pTexture);

이다. 5번째 파라미터가 0. 결과적으로 텍스쳐를 불러올 때 마다 완전한 밉맵 체인을 형성한다.


이거야 원. 빨라질래야 빨라질 수가 없다. 1로 바꾼다. 밉맵을 따로 만들지 않는다.


4. 확인.

다시 빌드. 실행. 로딩이 10배는 빨라진 것 같다.

VTune도 잘못된 부분을 집어낸 게 아닌 것 같다. 위에서 나온 D3DXSHProjectCubeMap라는 함수가 밉맵을 형성할 때

내부적으로 호출되는 함수가 아닐까,, 라고 추측해 본다.




5. 결론

레퍼런스. 꼼꼼히 보고 코딩하자. 괜히 피보는 수가 있다.

반응형

+ Recent posts