我正在学习directx。它为如何做事提供了很大的自由度,但可能不同的策略执行不同,并且它几乎没有提供关于性能良好的使用模式可能是什么的指导。
使用directx时,每次渲染都需要多次交换一堆新数据吗?
最明显的,也可能是非常低效的使用方式是这样的。
策略 1
在每一个渲染
加载模型 0 的所有内容(包括纹理)并渲染它(IASetVertexBuffers、VSSetShader、PSSetShader、PSSetShaderResources、PSSetConstantBuffers、VSSetConstantBuffers、Draw)
加载模型 1 的所有内容(包括纹理)并渲染它(IASetVertexBuffers、VSSetShader、PSSetShader、PSSetShaderResources、PSSetConstantBuffers、VSSetConstantBuffers、Draw)
ETC...
我猜如果要加载的最大的东西有专用的插槽,你可以部分提高效率,例如,如果模型 0 的纹理真的很复杂,不要在每一步都重新加载它,只需将它加载到插槽 1 中并保留它那里。当然,由于我不确定 DX11 中每种类型肯定有多少个寄存器,所以这很复杂(有人能指出这方面的文档吗?)
策略2
选择一些纹理槽用于加载,另一些用于永久存储最复杂的纹理。
只有一次
将最复杂的模型、着色器和纹理加载到专用于永久存储的插槽中
在每一个渲染
使用您为加载和渲染而留出的插槽(IASetVertexBuffers、VSSetShader、PSSetShader、PSSetShaderResources、PSSetConstantBuffers、VSSetConstantBuffers、Draw)加载模型 0 尚未存在的所有内容
使用为加载和渲染预留的插槽(IASetVertexBuffers、VSSetShader、PSSetShader、PSSetShaderResources、PSSetConstantBuffers、VSSetConstantBuffers、Draw)加载模型 1 尚不存在的所有内容
ETC...
策略3 我不知道,但以上可能都是错误的,因为我真的很陌生。
在directx(特别是DX11)上进行高效渲染以使其尽可能高效的标准策略是什么?