使用 webgl 在 chrome 上的 GPU 中的纹理成本是多少?

how much does a texture cost in GPU on chrome with webgl?

所以我最近在用webgl测试GPU上的内存开销

我可以理解,如果我用 512512、RGBA 加载图像, 通常它应该花费 512512*4 字节,即 1MB,即使我添加 mipmap 1.33MB top.

但老实说,如果我加载了很多这种 512 * 512 的图像,然后我检查内存监视器,它比应该的多得多。

有人知道它是如何工作的吗? 非常感谢

无法知道使用了多少内存。这取决于浏览器、驱动程序和 OS.

您加载图像(通过 img 标签)并上传到纹理

  • 浏览器是否保留原始文件?取决于浏览器。
  • 浏览器解码图像。它是扔掉它还是保留它?取决于浏览器
  • 假设您要在 <img> 标签中显示该图像,浏览器可能会将解码后的图像数据上传到 GPU
  • 您要求将该图像复制到纹理中。 WebGL 有要求 <img> 标签没有,所以图像可能必须再次解码。如果是这样,当浏览器释放重新解码的图像时未定义。例如,它可能会缓存它以防您再次请求它
  • 该图像数据在具有 GPU 进程的浏览器中被发送到 GPU 进程,因此现在有 2 个副本,至少暂时如此。一个在CPU进程中,一个在GPU进程中。
  • GPU 进程然后将其上传到驱动程序。驱动程序本身可能保留 2 个副本。一个在 GPU 上,一个在 CPU 上。我知道较旧的 OpenGL 驱动程序曾经这样做,以便您可以引用比内存更多的纹理,DirectX 不会(或至少不习惯)
  • 驱动程序本身可以模拟某些格式。桌面 GPU 将 < RGBA8 扩展到 RGBA8 是很常见的。例如 R8 或 RGB8 或 RGBA UNSIGNED_SHORT_4444 等可能会或可能不会扩展到 RGBA8(或任何其他更高精度的格式)
  • GPU 可能有对齐限制,如果它的大小不正确,它会强制填充您的纹理。
  • 浏览器可能会尝试为您交换纹理,允许的不仅仅是驱动程序本身。

换句话说,你不可能真的知道。

也就是说,我们可以看看系统报告的内容。当然,我的系统在此版本的浏览器中报告的内容可能在不同的系统、不同的浏览器或同一浏览器的不同版本上有所不同,或者因 OS 升级或驱动程序升级而不同,等...