directx-11 - DirectX11 - 实例化顶点的缓冲区大小,大小不一
问题描述
使用 DirectX/C++,假设您在屏幕上多次绘制同一个模型。您可以使用 DrawIndexedInstanced() 来执行此操作。您需要在创建实例缓冲区时设置它的大小:
D3D11_BUFFER_DESC_instance.ByteWidth = sizeof(struct_with_instance_data)* instance_count;
如果 instance_count 可以在低值和高值之间变化,是否习惯性地创建具有最大值 (max_instance_count) 的缓冲区?并且只画需要的东西。那不会永久使用大量内存吗?重新创建缓冲区是一个缓慢的解决方案?
有什么好的方法?
谢谢你。
解决方案
所有方法都有优点和缺点。
创建 max.count - 正如您指出的那样,您将消耗额外的内存。
创建一些初始计数,并实现指数增长——你可以在运行时 OOM,增长的大缓冲区也可能导致分析器出现峰值。
根据应用程序,还有其他方法可能适合您,也可能不适合您。您可以创建相当大的固定大小缓冲区,以在循环中多次调用 DrawIndexedInstanced 渲染更多实例,从而在调用之间替换缓冲区中的数据。如果源数据是在运行时从其他东西生成的,它将很好地工作,您需要重新处理该部分以生成固定大小(最后一个除外)的批次而不是完整的缓冲区。如果缓冲区中的数据需要跨帧保持不变,例如,如果您使用计算着色器更新它,则将无法工作。
推荐阅读
- search - 你如何使用 vim-extension 在 vscode 中显示搜索文本?
- python - 在python中解析子/孙
- java - Java 静态到 Kotlin 的转换
- docker - Redis 将数据存储在 backup.db 文件中
- discord.js - 检查反应/每个用户,限制
- c - 使函数在 C 中的库外部不可见
- .htaccess - 当.htm 不在特定文件夹中时,htaccess 会重定向除 .htm 之外的所有内容
- python - 在谷歌云上运行 python 脚本时出现内存错误
- sql - 在层次结构表中复制一行及其下方的所有行
- python - 简单的 LSTM ValueError Python