memory - 使用 webgl 在 chrome 上的 GPU 中的纹理成本是多少?
问题描述
所以我最近正在使用 webgl 来测试 GPU 上的内存成本。
我可以理解,如果我用 512 512,RGBA 加载图像,通常它应该花费 512 512 * 4 字节,即 1MB,即使我添加 mipmap 1.33MB 顶部。
但老实说,如果我加载了很多这种 512 * 512 的图像,然后我会检查内存监视器,这比它应该的要多得多。
有谁知道它是如何工作的?非常感谢
解决方案
无法知道使用了多少内存。这取决于浏览器、驱动程序和操作系统。
您加载图像(通过 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 可能有对齐限制,迫使它填充您的纹理。
- 浏览器可能会尝试为您交换纹理,而不是驱动程序本身。
换句话说,你无法真正知道。
也就是说,我们可以观察并查看系统报告的内容。当然,我的系统在这个版本的浏览器中报告的内容可能在不同的系统上会有所不同,或者不同的浏览器,或者同一浏览器的不同版本,或者操作系统升级或驱动程序升级等不同......
推荐阅读
- javascript - 停止重定向 onSubmit() 并改为显示错误消息
- python - 你如何用 Scrapy 抓取图像?
- php - 如何自定义 laravel 数组验证错误键和消息
- sql - Postgres 将空字符串转换为 NULL
- flutter - 在 Flutter onTap 中动态添加/删除 Widget 列表
- python - 如何为 matplotlib FuncAnimation 定义 func 参数
- r - 将 GPS 经纬度跟踪数据转换为足球场上的位置 x 和位置 y?
- swift - Swift:更改系统光标
- python - “无”不能与数字相比较。还有其他选择吗?
- python - 2dArray 的最小值