microsoft / DirectXTK12

The DirectX Tool Kit (aka DirectXTK12) is a collection of helper classes for writing DirectX 12 code in C++
https://walbourn.github.io/directx-tool-kit-for-directx-12/
MIT License
1.48k stars 394 forks source link

Model rendering performance is slower than expected #32

Closed walbourn closed 6 years ago

walbourn commented 6 years ago

The Model class renders a little slower than expected, which is particularly noticeable on Xbox One.

walbourn commented 6 years ago

This issue was traced to the fact that ModelMeshPart uses GraphicsMemory for the VB/IB. This effectively means it uses "DYNAMIC" (GPU/CPU shared memory) rather than "STATIC" (GPU only accessible memory like VRAM) memory allocation. This works fine for PrimitiveBatch, SpriteBatch, Constant Buffers, etc. and simplifies the interface for GeometricPrimitive.

Given that most use of Model is for static rather than dynamic geometry, this issue should be fixed by making ModelMeshPart use ID3D12Resource pointers for VB and IB instead. This will require breaking changes to the existing Model loading API since it will now require a device instance as well as a ResourceUploadBatch to complete the transfer to GPU memory. This will also impact anyone doing their own custom loaders or drawing with the DirectX 12 version of Model.

walbourn commented 6 years ago

Another option is to create a parallel StaticModel, StaticModelMesh, and StaticModelPart. Then there can be either an Optimize method on the Model class which converts to a StaticModel, or you can have direct loading of` StaticModel.

walbourn commented 6 years ago

See this pull request.

You can optionally call model->LoadBuffers(device, uploadBatch); to convert a model from a dynamic VB/IB to a static VB/IB for better performance.