在Direct3D 11中绘制具有不同数量原语的对象
Drawing objects in Direct3D 11 that have varying number of primitives
这是我的第一个问题,所以如果你对如何改进这个问题有任何建议,请随时告诉我:)
所以我的问题是:我有一个改变每一帧的对象,这导致了我计划通过管道发送的不同数量的顶点。显然,我不能即时改变顶点缓冲区的大小,那么最好的方法是什么呢?
以下是我的一些想法:
-
创建一个大小为n的顶点缓冲区,并简单地以n的集合传递顶点。缺点:一些顶点通过VS多次,所以性能略有下降(可能不明显),必须每帧调用Map/Unmap几次,这可能是有问题的。
-
创建一个巨大的顶点缓冲区,将容纳足够的顶点,我的对象永远不会超过缓冲区的大小。缺点:因为我事先不知道我的对象将有多少顶点,所以可能很难预测这个缓冲区的大小。此外,缓冲区可能会占用太多的空间。
-
每一帧,创建一个正确大小的新顶点缓冲区,并调用IASetVertexBuffer。缺点:这可能会有很大的性能问题…
1/这并不理想,因为正如您所说,您需要多次映射/取消映射,并且在两者之间进行绘制调用。您可以通过牺牲性能来换取更少的内存使用,在现代卡上(以千兆字节为单位),内存不太可能成为问题(如评论中提到的)。
2/与1相反,您需要单个Map/Unmap和单个绘制(您也可以在DeviceContext-> draw中指定顶点计数,以确保仅绘制缓冲区的相关部分)。这将是你性能方面的最佳选择,并且它应该不会太难定义某种形式的最大值(即使100万个多边形也没有那么多内存,并且你将很难让你的CPU每帧提供那么多数据)。
3/我在你的用例中没有看到任何好的好处(当你对一些不可变资源进行异步加载时,重新创建资源是常见的,所以它并不真正适用于这里)。
所以选择2,如果有一天内存成为一个问题,很容易回到1,但我怀疑这种情况永远不会发生。
- 如何使用 C++ 中的原语初始化类(如 std::字符串从 const char* 初始化)
- 出于什么目的,可能需要从Boost库中同步原语和容器
- 使用 c++11 的并发原语是否有一个体面的wait_any实现?
- 如何使用编译时常量原语的类型
- 从 JNI 中的原语获取数字的简单方法
- 如何在 Windows 上仅使用事件和联锁原语实现递归锁
- 库在C/C++和其他语言中重现Java原语hashCode逻辑
- 提升::精神(经典)原语与自定义解析器
- 如何从更基本的同步原语中创建多读/单写锁
- boost::asio:"strand"类型的同步原语有什么名称吗?
- Qt同步原语可以与非QThread线程一起使用吗
- std::vector<> 使用 resize() 派生,它不初始化原语和转发construct_back
- 数据结构的线程安全性,在哪里添加同步原语
- 我可以将哪些同步原语与克隆(2)(C/C++)一起使用
- 在使用jni时,如何清理jfloat等原语?
- 使用cgal创建参数化的3D原语
- 按值传递原语
- 将我转换的.obj文件转换为OpenGL原语
- java中的final关键字在应用时是否显示不同的效果:- 1)对原语2)对对象
- 在Direct3D 11中绘制具有不同数量原语的对象