纹理内存使用

Texture Memory Usage

我正在尝试了解我的应用程序消耗了多少纹理内存。我有以下类型的纹理和计算:

  1. RGB 纹理 -> textureWidth * textureHeight * 3(内存使用)
  2. RGBA 纹理 -> textureWidth * textureHeight * 4(内存使用)

因此我想知道图形驱动程序是否可以分配比上面计算的内存更多的内存?

几个简单的答案:

据我所知,(大多数)硬件设备支持打包 24 位 RGB 数据已经有大约 2 年了。在现代硬件中,这通常以 "XRGB"(或等效)格式表示,其中每个像素有一个填充字节。在硬件上有效地处理跨越高速缓存行等的像素是很痛苦的。此外,由于许多应用程序(阅读"games")使用texture compression,支持完全打包的 24 位似乎有点多余。

纹理尺寸:如果特定硬件的纹理尺寸不是'nice'(例如,也许,比方说,x不是16字节的倍数,或者,比如 4x4 或 8x8 块),那么驱动程序可能会填充纹理的物理尺寸。

最后,如果您有 MIP 映射(并且您确实需要 this for performance 以及质量原因),它会将纹理大小扩大大约 33%。

除了 Simon F 的回答之外,还值得注意的是,编写糟糕的应用程序可能会强制驱动程序为同一纹理的多个副本分配内存。如果它试图修改纹理,而它仍然被正在进行的渲染操作引用,就会发生这种情况。这通常称为 "resource copy-on-write" 或 "resource ghosting"。

这里的博客解释的比较详细:

https://community.arm.com/developer/tools-software/graphics/b/blog/posts/mali-performance-6-efficiently-updating-dynamic-resources