不断地向GPU上传纹理(并替换旧的纹理)会带来多大的开销?我正在开发一个新的跨平台3D窗口系统,它使用OpenGL,并计划为每个窗口上传一个位图(包含UI元素)。该位图将与GPU同步更新(使用VSync)。我想知道这是否是个好主意,或者不断写入位图是否会造成太大的性能开销。谢谢!
不断地向GPU上传纹理(并替换旧的纹理)会带来多大的开销?我正在开发一个新的跨平台3D窗口系统,它使用OpenGL,并计划为每个窗口上传一个位图(包含UI元素)。该位图将与GPU同步更新(使用VSync)。我想知道这是否是个好主意,或者不断写入位图是否会造成太大的性能开销。谢谢!
像nVidia的Geforce 460M这样的显卡本地内存带宽为60GB/sec。
PCI express 2.0 x16最大可管理8GB/sec的数据传输。
因此,如果您试图通过PCIe总线传输太多纹理,那么可能会遇到内存带宽问题。在60Hz的情况下,每帧可提供大约136兆字节的数据。未经压缩的24位1920x1080图像大小大约为6兆字节。因此,您可以在一个16x图形卡上上传几个视频帧。
当然这并不是那么简单。PCIe还有大约20%的开销。所有绘制指令也必须通过该连接上传。
总体上,只要您不过度使用,您就应该没有问题。请记住,在一帧中上传下一帧(或更晚)才会使用的纹理是明智的做法。这样,您就不会创建瓶颈,渲染将停止等待PCIe上传完成。
最终,你的答案将会是性能分析。然而,在此之前,你可以进行一些早期的优化,例如在纹理没有发生变化时避免更新它。根据纹理的大小和像素格式,这可能会非常昂贵。
使用一个简单的情况来进行性能分析,模拟你所期望的使用方式。我怀疑(至少在没有我提到的优化的情况下)性能开销会非常大,如果你有几个更大的窗口,这取决于这些窗口的大小。