如何优化VBO/IBO以最大限度地利用GPU缓存
How to Optimizing a VBO/IBO to maximize GPU cache usage
我正在使用CUDA上运行的Marching Cubes算法从体积数据生成网格。
我已经尝试过保存网格并用三种方式进行渲染。
- 将一组粗糙的三角形保存为顶点数据的连续数组。我估计如果第一次通过创建OpenGL VBO,将其映射到CUDA,并以以下格式将顶点数据写入其中
V0x, V0y, V0z, N0x, N0y, N0z, V1x, V1y, V1z, N1x, N1y, N1z, ...
并用CCD_ 2绘制。
VBO中的冗余顶点、每个多维数据集的冗余顶点,无索引。
- 取步骤1中的网格,使用
thrust::sort()
和thrust::unique()
删除冗余顶点,并使用thrust::lower_bound()
计算索引。将结果保存到映射到CUDA的OpenGL VBO/IBO中。用CCD_ 6绘制模型
VBO中没有冗余顶点,生成的索引。
- 为每个立方体生成一个唯一的顶点列表,将它们与它们的索引一起存储在VBO中,在IBO中形成三角形。使用
glDrawElements()
渲染
VBO中的冗余顶点,每个多维数据集的唯一顶点,每个立方体的生成索引
现在,对于相同ISO值的同一数据集,我得到的FPS是
Method 1 : 92 FPS, 30,647,016 Verts, 0 Indices
Method 2 : 122 FPS, 6,578,066 Verts, 30,647,016 Indices
Method 3 : 140 FPS, 20,349,880 Verts, 30,647,016 Indices
即使方法2产生的顶点数量最少,FPS也很低。我相信这是因为索引的顺序可以最大限度地减少GPU缓存的使用。方法3的索引顺序获得更高的GPU缓存使用率,因此FPS也更高。
如何修改/修改方法2以获得更高的FPS?
有两件事可以帮助:
- 尝试通过将顶点大致按绘制顺序放置来优化数据缓存的使用
- 尝试优化转换后缓存的使用(这里有一种算法可以做到这一点,实现可能可以在网上找到(
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 使用指针从C++中的数组中获取最大值
- 操作顺序以最大限度地提高精度
- 在高数据包速率下最大限度地减少丢弃的 UDP 数据包 (Windows 10)
- 模棱两可的功能超载[例如最大限度()]
- 如何最大限度地减少使用标量 SIMD 内部函数的 SIMD 注册表的双重负载开销
- 如何通过只加载用户需要的内容来最大限度地提高字符串的效率
- 通过ARM NEON程序集最大限度地优化元素乘法
- CUDA:最大限度地减少大型数据类型的银行冲突
- 工具来帮助最大限度地减少C++程序中宏的使用
- 如何最大限度地使用数字0来优化程序
- 如何最大限度地减少来自 arduino 的串行通信读取错误
- 如何在最大限度地提高大小有效性的同时,将3态的位运算符实现为任何大小的内存
- Windows c++如何最大限度地启动应用程序
- BerkeleyDB最大限度地提高性能和减少数据丢失
- 在std容器上执行一系列操作时,最大限度地减少峰值内存使用
- 最大限度地理解子阵列_问题
- 如何优化VBO/IBO以最大限度地利用GPU缓存
- 使用 Boost 的 file_mapping 和mapped_region最大限度地减少内存使用?
- 最大限度地提高孩子的幸福感