【问题标题】:WebGL Rendering Optimization - MatricesWebGL 渲染优化 - 矩阵
【发布时间】:2017-06-13 20:59:38
【问题描述】:

我正在尝试使用 WebGL 以最有效的方式渲染数十万个纹理。

目前我已经达到了相当不错的流程,大约 20K 工件以 100fps+ 的速度渲染。仍然不够高兴,我进行了 chrome 分析以检查代码中可能存在的瓶颈,并且我发现我的矩阵旋转计算占据了很大的一块蛋糕:

以及对应的Bottom-Up trace:

您知道可以在这里执行哪些类型的优化吗?似乎“旋转”操作以某种方式占用了异常数量的资源。

Matrix4 代码:https://github.com/scarlettgamestudio/scarlett-framework/blob/feature/render_optimizations/src/math/matrix4.js

SpriteBatch:https://github.com/scarlettgamestudio/scarlett-framework/blob/feature/render_optimizations/src/core/spriteBatch.js

纹理着色器:https://github.com/scarlettgamestudio/scarlett-framework/blob/feature/render_optimizations/src/shaders/textureShader.shader.js

非常感谢。

【问题讨论】:

  • 这可能会在Code Review中问得更好
  • 在绑定到请求动画帧的垂直同步时如何获得 200+ fps?
  • @LJᛃ vsync 适应显示器刷新率,因为我的显示器是 144hz,所以帧率可以上升到那个数字。

标签: javascript matrix optimization webgl matrix-multiplication


【解决方案1】:

除了在该代码中保存一些乘法和缩短路径之外,从微优化的角度来看,没有任何剩余,假设您已经为所有值使用了类型化数组(matrixaxis )。

根据您的应用程序逻辑,您有以下选项:

  • 仅使用适当的剔除方法旋转实际可见的部分
  • 假设您没有绑定顶点,通过在顶点着色器中执行旋转将旋转卸载到 GPU
  • 假设您旋转相同的角度,存储旋转矩阵而不是重建它

另外请注意,渲染是与主线程异步的,因此不会在跟踪中考虑,很可能还有通过优化渲染代码来提高性能的方法。

由于我在您提供的跟踪中阅读了“精灵”,因此我会首先尝试将旋转卸载到 GPU。

【讨论】:

  • typedarrays appear to be slower than native javascript arrays?。在那个例子中,“TDLMath”和“twgl-native”使用的是javascript数组,而“twgl”和“TDLFast”使用的是typedarrays。最重要的是V8 is missing some basic optimizations that SpiderMonkey is not,但无论如何本机都比类型数组更快。我不知道那是因为它们没有被完全优化,还是只是转换 float->double->float 正在破坏性能。
  • 感谢您的积分。我不是顶点绑定,使用卸载旋转是我接下来肯定会尝试的东西。关于你的最后一点(存储旋转矩阵),它对于真正的案例场景,现在我正在通过修改所有对象属性(需要完全重新计算)来做最坏的情况。更多代码,这是我正在开发的 spritebatch:github.com/scarlettgamestudio/scarlett-framework/blob/feature/…
  • @gman 感谢您指出这一点,让我们希望事情变得更好或 SIMD.js 接管 ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-02
  • 2013-01-23
  • 1970-01-01
  • 2014-07-15
  • 1970-01-01
  • 2020-03-10
相关资源
最近更新 更多