辅助屏幕上的 WebGL 性能
WebGL Performance on secondary screens
我一直在修补我自己的 WebGL 项目,发现了一些棘手的性能问题。一开始我把自己的渲染图删减到只剩下一行:
gl.clear(gl.COLOR_BUFFER_BIT);
仅仅调用那一行就导致性能从 60fps 下降到 ~40fps。调用该行不会直接影响性能,js-profiler 显示大部分时间花费在 "idle",但对 requestAnimationFrame 的调用每秒仅发生约 40 次。
然后我注意到这个问题似乎取决于我打开浏览器的屏幕。当我将选项卡拉到主屏幕时,fps 保持在 ~60。我还有 2 个屏幕,它们都是 1080p,但是在辅助屏幕上做任何 WebGL 的性能下降到 ~40fps。 CPU 负载和 GPU 负载似乎没有区别,只是 fps 不同。
我不仅可以用我的代码重现这个,还可以用这个来重现:
http://media.tojicode.com/q3bsp/
在我的主屏幕上全屏播放可以得到很好的 60 fps。在我的辅助屏幕上它是 ~40fps。
是否有任何解释为什么在副屏幕上性能不可靠?我是 运行 Radeon HD 7850 作为显卡。主屏幕通过 HDMI 连接,两个有问题的辅助屏幕都使用 DVI 到 mini-Displayport 适配器。
该问题显示在 Chrome 和 Firefox 中,但不显示在 IE11 中。我在 Windows 7 x64.
TL;DR: AFAIK 除了上一段中提到的以外,没有其他解决方案
据我所知,这就是 Windows 的工作方式,很难甚至无法修复。浏览器必须修复它,而且工作量太大了。
问题是,至少据我所知,Windows 将每个显示器视为一个单独的设备。这些设备彼此有效隔离。就 Windows 而言,它们可能 运行ning 在不同的图形卡上,即使它们碰巧 运行ning 在同一张卡上,它也会将它们视为 运行宁在不同的卡片上
因此,当您编写本机 windows 图形程序(例如浏览器)时,默认情况下您选择 1 个设备。您创建一个 window,分配设备,并将所有图形资源分配给该设备(着色器、纹理、缓冲区、渲染缓冲区)
如果您的 window 移动到另一个屏幕,那些资源(着色器、纹理、缓冲区、渲染缓冲区)在其他设备上不存在。事实上,考虑到该设备可能 运行ning 在不同的显卡上,资源甚至可能与该卡不兼容。 (例如:纹理太大,着色器功能在第二张卡上不可用,...)
因此,Windows 所做的是在程序选择的设备上呈现 window,然后将结果复制到另一台设备,以便它可以显示在第二台设备的屏幕上。 这种复制和重新显示是速度变慢的根源。
在 window 跨越 2 显示的情况下,没有其他解决方案。在 window 完全移动到另一个显示器的情况下,smart 程序 可以 识别 window 打开不同的显示器,创建该设备上所有资源的副本,然后开始在该设备上渲染。我在上面指出的问题是该设备可能与第一台设备不具有相同的 features/memory/capabilities,因此它可能不具有 运行。更糟糕的是,某些事情,比如复制渲染缓冲区,真的很痛苦。
某些 directX 示例会在您移动 window 时切换设备,但 DirectX 具有此模型,您的应用程序应该能够随时重新加载所有资源。
Chrome,Safari,Firefox 真的没有这个奢侈。如果您在一台设备上启动您的页面,他们无法真正切换到新设备(就像我上面提到的,因为它很难并且因为该设备可能 运行 您的页面。也许设备 1 支持浮点纹理和设备 2没有)
OSX 没有这个问题 AFAIK 因为 OSX 不允许多显卡。这意味着当你使用第二个显示器时,他们总是知道一切都在同一个 GPU 上。当然,这也意味着您不能 运行 更多显示?我不是 mac 大师。也许它确实支持更多的 GPU 可以或用于和 运行s 陷入类似的问题。
在一些较新版本的 Windows 中,他们可能会以某种方式虚拟化设备或更改模型,以便同一 GPU 上的设备神奇地不必进行复制。我不认为他们已经这样做了。
一些 GPU 供应商(AMD、NVidia)在其控制面板中有一个特殊模式,可用于 2 个分辨率完全相同的显示器。在这种情况下,他们有效地告诉 OS 有 1 个显示器,但在卡中,他们将显示器隔开 2 个以上的显示器。因为 OS 认为只有 1 台显示器,所以只有 1 台设备,这些问题就消失了。如果您有 2 台分辨率相同的显示器,请尝试启用此模式。
我一直在修补我自己的 WebGL 项目,发现了一些棘手的性能问题。一开始我把自己的渲染图删减到只剩下一行:
gl.clear(gl.COLOR_BUFFER_BIT);
仅仅调用那一行就导致性能从 60fps 下降到 ~40fps。调用该行不会直接影响性能,js-profiler 显示大部分时间花费在 "idle",但对 requestAnimationFrame 的调用每秒仅发生约 40 次。
然后我注意到这个问题似乎取决于我打开浏览器的屏幕。当我将选项卡拉到主屏幕时,fps 保持在 ~60。我还有 2 个屏幕,它们都是 1080p,但是在辅助屏幕上做任何 WebGL 的性能下降到 ~40fps。 CPU 负载和 GPU 负载似乎没有区别,只是 fps 不同。
我不仅可以用我的代码重现这个,还可以用这个来重现: http://media.tojicode.com/q3bsp/
在我的主屏幕上全屏播放可以得到很好的 60 fps。在我的辅助屏幕上它是 ~40fps。
是否有任何解释为什么在副屏幕上性能不可靠?我是 运行 Radeon HD 7850 作为显卡。主屏幕通过 HDMI 连接,两个有问题的辅助屏幕都使用 DVI 到 mini-Displayport 适配器。 该问题显示在 Chrome 和 Firefox 中,但不显示在 IE11 中。我在 Windows 7 x64.
TL;DR: AFAIK 除了上一段中提到的以外,没有其他解决方案
据我所知,这就是 Windows 的工作方式,很难甚至无法修复。浏览器必须修复它,而且工作量太大了。
问题是,至少据我所知,Windows 将每个显示器视为一个单独的设备。这些设备彼此有效隔离。就 Windows 而言,它们可能 运行ning 在不同的图形卡上,即使它们碰巧 运行ning 在同一张卡上,它也会将它们视为 运行宁在不同的卡片上
因此,当您编写本机 windows 图形程序(例如浏览器)时,默认情况下您选择 1 个设备。您创建一个 window,分配设备,并将所有图形资源分配给该设备(着色器、纹理、缓冲区、渲染缓冲区)
如果您的 window 移动到另一个屏幕,那些资源(着色器、纹理、缓冲区、渲染缓冲区)在其他设备上不存在。事实上,考虑到该设备可能 运行ning 在不同的显卡上,资源甚至可能与该卡不兼容。 (例如:纹理太大,着色器功能在第二张卡上不可用,...)
因此,Windows 所做的是在程序选择的设备上呈现 window,然后将结果复制到另一台设备,以便它可以显示在第二台设备的屏幕上。 这种复制和重新显示是速度变慢的根源。
在 window 跨越 2 显示的情况下,没有其他解决方案。在 window 完全移动到另一个显示器的情况下,smart 程序 可以 识别 window 打开不同的显示器,创建该设备上所有资源的副本,然后开始在该设备上渲染。我在上面指出的问题是该设备可能与第一台设备不具有相同的 features/memory/capabilities,因此它可能不具有 运行。更糟糕的是,某些事情,比如复制渲染缓冲区,真的很痛苦。
某些 directX 示例会在您移动 window 时切换设备,但 DirectX 具有此模型,您的应用程序应该能够随时重新加载所有资源。
Chrome,Safari,Firefox 真的没有这个奢侈。如果您在一台设备上启动您的页面,他们无法真正切换到新设备(就像我上面提到的,因为它很难并且因为该设备可能 运行 您的页面。也许设备 1 支持浮点纹理和设备 2没有)
OSX 没有这个问题 AFAIK 因为 OSX 不允许多显卡。这意味着当你使用第二个显示器时,他们总是知道一切都在同一个 GPU 上。当然,这也意味着您不能 运行 更多显示?我不是 mac 大师。也许它确实支持更多的 GPU 可以或用于和 运行s 陷入类似的问题。
在一些较新版本的 Windows 中,他们可能会以某种方式虚拟化设备或更改模型,以便同一 GPU 上的设备神奇地不必进行复制。我不认为他们已经这样做了。
一些 GPU 供应商(AMD、NVidia)在其控制面板中有一个特殊模式,可用于 2 个分辨率完全相同的显示器。在这种情况下,他们有效地告诉 OS 有 1 个显示器,但在卡中,他们将显示器隔开 2 个以上的显示器。因为 OS 认为只有 1 台显示器,所以只有 1 台设备,这些问题就消失了。如果您有 2 台分辨率相同的显示器,请尝试启用此模式。