不同浏览器之间的WebGL参数不一致

3

我的WebGL应用程序在使用Intel Graphics IGPs的PC上遇到了与内存相关的问题。

在尝试找到瓶颈时,我从浏览器中获取到不一致的数据。

使用:

var viewport = gl.getParameter(gl.MAX_VIEWPORT_DIMS);
var texturesize = gl.getParameter(gl.MAX_TEXTURE_SIZE);
var renderbuffer = gl.getParameter(gl.MAX_RENDERBUFFER_SIZE);

我在同一台电脑上得到的值不一致:

Chrome

  • gl.MAX_VIEWPORT_DIMS = 16384
  • gl.MAX_TEXTURE_SIZE = 16384
  • gl.MAX_RENDERBUFFER_SIZE = 16384

Firefox

  • gl.MAX_VIEWPORT_DIMS = 16384
  • gl.MAX_TEXTURE_SIZE = 8192
  • gl.MAX_RENDERBUFFER_SIZE = 8192

Safari

  • gl.MAX_VIEWPORT_DIMS = 8192
  • gl.MAX_TEXTURE_SIZE = 16384
  • gl.MAX_RENDERBUFFER_SIZE = 8192

使用在线WebGL浏览器报告时,我得到了相同的值。

谁知道这里正在发生什么?

3个回答

1

https://browserleaks.com/webgl中检查差异,例如正在使用哪个底层API(未掩码渲染器),或者正在使用哪个VS和PS版本:也许一个浏览器正在使用一个库版本,而另一个正在使用其他版本(例如Direct3D9和Direct3D11)。甚至不同的浏览器出于某种原因可能会向下夹紧值。

然而,即使从不同的浏览器获取不同的值,这些都是1D限制,您的应用程序应该使用更小的值。

例如对于渲染缓冲区和视口:4K分辨率为3840 x 2160像素(更小),甚至8K也小于8192。即使具有8192 1D限制,由于内存原因,您的计算机可能不支持8K。

对于纹理,同样存在问题:16384 x 16384的纹理可能会使用1GB的VRAM(取决于纹素格式和其他问题),并且由于分配问题(VRAM已经分配了块),这么大的纹理甚至可能无法在2GB或4GB的GPU中分配...在英特尔GPU中可能会更难。

如果您希望您的应用程序在不同的电脑上运行,您应该使用更小的值,这样您提到的不同值就不会对您产生影响:如果您想要您的应用程序在不同的电脑上运行而没有问题,您必须使用更小的值(或至少有不同的替代方案使用更小的值)。

谢谢,现在更有意义了。 这些读数来自我的GPU,这一个已经足够了。 我正在尝试找到低规格GPU的瓶颈,不一致的数据让我感到困惑。 - ubernurbs

1
  1. 浏览器可以自由实现它们自己的限制。

    例如,Firefox有一个开发功能 可以强制多个较小的限制。

    查看 WebKit(Safari)源代码,我们可以看到 它被硬编码为返回8192或更少。不知道为什么。您需要问WebKit团队。

  2. 在具有多个GPU的机器上,浏览器可以自由选择一个GPU或另一个GPU。用户也可以在操作系统级别或其浏览器设置中设置每个浏览器使用哪个GPU。

  3. 浏览器可以选择不同的方式来实现WebGL(通过OpenGL,通过OpenGL ES,通过DirectX,通过Metal,通过Vulkan,在软件中等等...)


0

由于这不是一个实际的问题,所以没有答案。

总之,浏览器不会提供可靠的数据,因此像https://webglstats.com/webgl/parameter/MAX_RENDERBUFFER_SIZE这样的统计数据只是一个指示而不是“真实”数据。

据我所见,最有用的信息是未遮罩的渲染器。 我想我必须在WebGL中构建自己的检测,并测试我需要的最小值。 然后将结果与未遮罩的渲染器信息一起存储在服务器上,这样我就可以提供符合最低要求的GPU列表。

感谢您提供的优秀信息!


浏览器揭示了它们选择的限制。你的GPU可能能够做更多的事情,但是那个浏览器不会让你这样做。知道GPU的实际限制是没有用的,因为浏览器不会让你超过他们设置的限制。这与JavaScript中单个页面允许使用的内存量的限制没有什么不同。它可能远远少于用户机器上的内存量。 - gman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接