首页 > 解决方案 > DirectX11 - 实例化顶点的缓冲区大小,大小不一

问题描述

使用 DirectX/C++,假设您在屏幕上多次绘制同一个模型。您可以使用 DrawIndexedInstanced() 来执行此操作。您需要在创建实例缓冲区时设置它的大小:

D3D11_BUFFER_DESC_instance.ByteWidth = sizeof(struct_with_instance_data)* instance_count;

如果 instance_count 可以在低值和高值之间变化,是否习惯性地创建具有最大值 (max_instance_count) 的缓冲区?并且只画需要的东西。那不会永久使用大量内存吗?重新创建缓冲区是一个缓慢的解决方案?

有什么好的方法?

谢谢你。

标签: directx-11

解决方案


所有方法都有优点和缺点。

  1. 创建 max.count - 正如您指出的那样,您将消耗额外的内存。

  2. 创建一些初始计数,并实现指数增长——你可以在运行时 OOM,增长的大缓冲区也可能导致分析器出现峰值。

根据应用程序,还有其他方法可能适合您,也可能不适合您。您可以创建相当大的固定大小缓冲区,以在循环中多次调用 DrawIndexedInstanced 渲染更多实例,从而在调用之间替换缓冲区中的数据。如果源数据是在运行时从其他东西生成的,它将很好地工作,您需要重新处理该部分以生成固定大小(最后一个除外)的批次而不是完整的缓冲区。如果缓冲区中的数据需要跨帧保持不变,例如,如果您使用计算着色器更新它,则将无法工作。


推荐阅读