17

在过去的一个月里,我一直在搞乱 WebGL,发现如果我创建并绘制一个大的顶点缓冲区,它会导致低 FPS。有谁知道如果我在 C++ 中使用 OpenGL 是否相同?

这是使用的语言(WebGL 中的 JavaScript)还是 GPU 的瓶颈?

像这样的WebGL示例表明,您可以使用一个具有良好性能的缓冲区绘制 150,000 个立方体,但除此之外,我得到 FPS 下降。这与 OpenGL 是否相同,还是能够处理更大的缓冲区?

基本上,我必须决定继续使用 WebGL 并尝试通过代码进行优化,或者 - 如果您告诉我 OpenGL 性能会更好并且这是语言速度瓶颈,请切换到 C++ 并使用 OpenGL。

4

4 回答 4

15

如果您只有一个 drawArrays 调用,则调用本身的 OpenGL 和 WebGL 之间应该没有太大区别。但是,在 Javascript 中设置数据可能会慢很多,所以这真的取决于你的问题。如果您的大部分数据是静态的(景观、房间),WebGL 可能适合您。否则,在 JS 中设置数据可能对您的目的来说太慢了。这真的取决于你的问题。

ps 如果您包含更多关于您正在尝试做的事情的详细信息,您可能会得到更详细/具体的答案。

于 2013-07-07T22:05:31.507 回答
3

有趣的是,我在 2000 年初使用glVertex()运行非常流畅的老式 API 编写了一个基于图块的游戏。我最近开始将它移植到 WebGL,glDrawArrays()现在在我的现代 PC 上,它的速度至少快了 10 倍,但性能却很糟糕。

原因似乎是我glBegin(GL_QUADS); glVertex()*4; glEnd();使用glDrawArrays(). 在 WebGL 中使用glDrawArrays()绘制一个多边形比在 C++中绘制一个多边形要慢得多。glVertex()

我不知道这是为什么。也许是因为 javascript 很慢。也许是因为 javascript 中的一些上下文切换问题。无论如何,我只能进行大约 500 个单多边形glDrawArray()调用,同时仍然获得 60 FPS。

每个人似乎都通过在 GPU 上做尽可能多的事情来解决这个问题,并且glDrawArray()每帧做的调用尽可能少。能否做到这一点取决于您要绘制的内容。在您链接的立方体示例中,它们可以在 GPU 上执行所有操作,包括移动立方体,这就是它快速的原因。从本质上讲,他们作弊了——通常 WebGL 应用程序不会那样。

谷歌进行了一次谈话,他们解释了这种技术(他们也在 GPU 上不切实际地计算了对象运动):https ://www.youtube.com/watch?v=rfQ8rKGTVlg

于 2015-01-06T08:33:37.917 回答
1

由于使用了更新版本的 api,OpenGL 更加灵活和优化。如果您说 OpenGL 更快、更强大,这是真的,但这也取决于您的需求。

如果您需要一个带有纹理的立方体网格,webGL 就足够了。但是,如果您打算构建具有大量顶点、后处理效果和不同渲染技术(以及置换类型、视差映射、逐顶点或曲面细分)的大型项目,那么 OpenGL 实际上可能是一个更好、更明智的选择。

优化缓冲区到单个调用,优化更新这些可以完成,但它当然有其局限性,是的,OpenGL 很可能无论如何都会表现得更好。

要回答,这不是语言瓶颈,而是使用了api 版本的瓶颈。WebGL 基于 OpenGL ES,它有一些优点,但运行速度有点慢,并且它比纯 OpenGL 具有更多的代码处理抽象级别,这就是降低性能的原因 - 需要评估更多代码。

如果您的项目不需要基于 Web 的解决方案,并且不关心支持哪些设备,那么 OpenGL 将是一个更好、更智能的选择。

希望这可以帮助。

于 2013-07-07T22:00:53.843 回答
1

与同等的 OpenGL 相比,WebGL 在相同硬件上的速度要慢得多,因为每次 WebGL 调用的监听频率都很高。

在桌面 OpenGL 上,这种开销至少是有限的,如果仍然相对昂贵的话。

但是在像 Chrome 这样的浏览器中,WebGL 不仅要求我们跨越 FFI 障碍来访问那些原生 OpenGL API 调用(这仍然会产生相同的开销),而且我们需要进行安全检查以防止 GPU 被劫持进行计算.

如果您正在查看诸如glDraw*每帧调用的调用之类的东西,这意味着我们正在谈论的调用数量可能少(一个)数量级。更有理由选择像instancing这样的东西,这样调用的数量就会大大减少。

于 2018-12-20T09:43:48.747 回答