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. 결론
레퍼런스. 꼼꼼히 보고 코딩하자. 괜히 피보는 수가 있다.
반응형
'그래픽스(Graphics) > DirectX9~12' 카테고리의 다른 글
MFC에서 픽킹시 좌표얻기 (0) | 2012.11.02 |
---|---|
텍스쳐 반투명, 알파값 없는 이미지 (0) | 2012.11.02 |
이펙트 렌더링 g_pEffect->BeginPass(i) (0) | 2012.11.02 |
SetRenderState 정리 (0) | 2012.11.02 |
렌더타겟,스텐실 (0) | 2012.11.02 |