3

我一直在寻找有关 WebGL 以及可分配用于渲染的最大纹理数/内存量的信息。这显然是特定于硬件/设备的,因此我正在寻找一种智能处理纹理的方法。

我目前有 512x512 RGBA8 格式的纹理。潜在地,用户可以将 270 个纹理加载到内存中。我知道对于 mip 贴图,它的计算结果是每像素 4 个字节乘以 4/3。因此,单个纹理加上 mip 贴图将在 4 * 512 * 512 * 1.33 = 1.33MB 的区域内。总共需要 359.1MB 来将纹理加载到内存中。

这是最坏的情况,在中/高端机器上会很好,但一旦 WebGL 在 android 和低规格机器上广泛使用,我也想针对移动设备进行优化。

如果我将纹理减少到 256x256,我会注意到质量下降,但这可能是低端设备的一个选项。这导致每个纹理总共 4 * 256 * 256 * 1.33 = 0.33MB,总共 89.1MB。

无论如何,在尝试将纹理加载到 WebGL 上下文之前,API 是否可以确定总可用纹理内存?

一次可以加载到内存中的纹理总数是否也有上限?

当用户加载我的页面时,我想使用上述两个参数来获得合理的默认值。

4

1 回答 1

1

据我所知,没有办法做到这一点。从 Toji 的回答来看,这听起来像是出于安全原因。

我会考虑谁将使用您的应用程序,如果这组用户除了桌面上拥有出色专用显卡的严格用户之外的任何其他用户,那么请为每个人缩小纹理。也许您可以允许更高级别的图形作为选项,但要意识到这可能会导致某些/大多数人出现内存不足异常。

如果碰巧您没有一次使用所有这些纹理,您可以尝试跟踪正在使用的纹理,然后只将它们加载到内存中(并使用 卸载纹理gl.deleteTextures)。我猜想在运行时而不是在启动时删除和加载这么多纹理会花费很多时间,所以小心地这样做(一次只有几个)以保持帧率会很聪明。不确定您是否甚至可以在一帧中加载 1.33MB 的纹理,或者这是否适用于您的应用程序。

于 2013-02-12T06:50:19.257 回答