DX11 vs DX12 리소스 사용량

어쩐지 무겁더라…
Voxel Horizon의 DX12버전을 작업하던중 너무 무겁다고 생각했다.

Project D Online의 dx12버전은 dx11버전에 비해 50%만(?) 메모리(GPU/GPU Mapped System Memory)를 더 먹었지만 Voxel Horizon프로젝트에선 8배를 더 처먹는다!

Voxel Horizon은 정해진 맵데이터가 없는 대신 최대 8x8x8개의 복셀로 이루어진 수만개의 복셀 오브젝트가 존재한다.
복셀 오브젝트 한개당 Vertex Buffer 1개, Index Buffer 2개, Texture 1개를 만드는데 얘네들이 64KB얼라인이 강제되어서 이렇다. 점 1개짜리 VB 하나를 만들어도 64KB가 잡힌다. Constant Buffer에 대해선 64KB얼라인을 고려해서 그 안에서 쪼개서 할당해주게 만들었는데 VB/IB/Texture는 그냥 API로 할당 받아서 그대로 썼더니 이렇게 됐다.

해결책은 간단하다. CreateComittedResource()로 할당받을때 64KB의 배수 사이즈로 할당한 후에 그 안에서 내가 다시 잘개 쪼개쓰면 된다. 근데 이게 만만치 않다. 낭비 없이 쓰려면 일전에 언급한것처럼 어드레스만 리턴하는 heap을 만들어서 D3D Buffer에 맵핑해서 써야한다. 아니면 고정 사이즈 단위(2^n승 단위등)로 할당하면 훨씬 편하긴 하다. 낭비되는 공간이 좀 많겠지만.
후…DX8때 드라이버 불안정하던 시절에 CreateVeretxBuffer()호출 줄이려고 했던 짓을 또 하고 싶진 않다. 게다가 이거 thread-safe하게 만들어야 한다.-___-

어쨌든 이 프로젝트를 dx12에서도 무사히 돌리려면 결국 덩어리로 D3D리소스를 맵핑해서 그 안에서 쪼개쓰도록 하는 별도 자료구조를 만들어야한다.
아우 짜증나.

 

DX11
voxel_horizon_2017_0624_dx11

DX12
voxel_horizon_2017_0624_dx12


답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중