我曾经假设绑定顶点比绑定着色器和纹理更重要,但现在我了解到情况正好相反。所以我正在重新配置我的绘图。基本上:
在一个模型中绘制多个网格,每个模型一个缓冲区是最优的吗?或者有没有一个替代的解决方案来绑定更少更大的缓冲区?(我曾经将所有的网格组合成一个大的缓冲区,并简单地调用偏移量,但现在这意味着我绑定了不必要的顶点,因为这些顶点现在可能会绑定,但稍后会使用)。
我所说的优化是指CPU、GPU和驱动程序的传输速度。
发布于 2017-07-19 22:57:44
当然,答案是“视情况而定”,这取决于GPU、驱动程序和您的应用程序需求。
绑定可以是非常轻量级的操作(类似于设置指针),或者可能需要将数据从主机(CPU)内存传输到GPU -这在很大程度上取决于GPU内存中的资源使用情况和驻留情况。例如,如果你有大量的静态几何图形与所有其他图形资源(如纹理、元素数组等)一起放入GPU内存中,那么一个大的缓冲区可能更好,因为你只需初始化它一次,驱动程序就会很快找出它应该是驻留的。
相反,如果你为每个对象使用了许多不同的资源(例如,切换许多纹理),而所有这些资源都不能同时驻留在GPU中,那么使用较小的缓冲区可能会更好,因为它为驱动程序提供了更多通过逐出回收内存的选择。然而,另一方面,它可能导致内存碎片,并可能浪费一些内存(尽管如果你关心这个问题,你不需要回答这个问题)。
我能提供的最好的建议是,如果您需要从CPU更新缓冲区中的数据,请尝试仅更新受这些更改影响的缓冲区区域。使用像glBufferSubData这样的东西,只更新您需要的区域(并且明智地;例如,如果您需要更新由几个字节隔开的两个1K块,那么可以在一个操作中完成所有这些操作)。尽量避免在离散内存的图形处理器系统上使用glMapBuffer和friends。该操作可能需要从GPU向GPU复制大量数据;它对集成内存的GPU系统的影响较小(尽管这不是一个具体的规则-缓冲区可能会在幕后重新格式化以实现更优化的内存操作)。
最明智的建议是:纠正错误,然后让它变得更快(只有在它还不够快的情况下)。
https://stackoverflow.com/questions/45191858
复制相似问题