【问题标题】:Three.js: What's the upper limit for holding 60 FPS on an average desktop?Three.js:在普通台式机上保持 60 FPS 的上限是多少?
【发布时间】:2017-05-22 09:21:01
【问题描述】:

我目前正在使用 Three.js 开发一款游戏。我已经学习了四年软件工程,并且已经在后端专业工作了两年,但除了一些简单的 Unity 实验之外,我几乎没有接触过图形。

根据 renderstats.js,我目前有 ~22,000 个顶点和 ~8,000 个面,而我的桌面(高于平均水平)无法以高于 20 FPS 的速度运行。我使用的是 Lambert 材质以及单一的环境光,所以我觉得这个要求并不过分。

考虑到这些数字,这是three.js 渲染的预期行为吗?

【问题讨论】:

  • 在控制台中输入renderer.info.render.calls。价值是多少?
  • 我正在查看大约 5,500 个绘图调用。
  • 难怪。那是你的问题。
  • 感谢您的帮助!

标签: three.js game-engine


【解决方案1】:

我很确定这还没有结束,您可能错过了一些大幅提升性能的可能性。

但只是先给你一些数字,

    1234563平均 GPU 上的点/顶点。
  • 仅使用简单的形状和材质,我已经获得了三个.js,可以在 60FPS 下毫无问题地渲染 500k 三角形(1080p 分辨率)范围内的东西。对于最新的高端 GPU,您可能可以将这些数字乘以 10。

但是,这些数字并没有真正的帮助。

一些提示:

  • 如果你想调试你的渲染性能,你应该首先添加一些指标。 Renderstats 很好,但我建议为此集成 http://spite.github.io/rstats/ (see the example)。

  • 一般来说,材料的选择并不重要,GPU 比大多数人想象的要强大得多。这更有可能是管道中其他地方的问题。来自评论的编辑:在某些情况下,例如带有慢速 GPU 的高分辨率显示器(想想移动设备),这可能不太真实,复杂的着色器代码可能会降低您的网站速度,但它可能值得先看其他点。由于渲染本身发生在线程外(因此您无法使用 devtools-profiler 等常规工具测量其持续时间),您可以使用EXT_disjoint_timer_query-extension 获取有关 GPU 上正在发生的事情的一些信息。

  • the number of drawcalls shouldn't be too high:three.js 需要为场景中渲染的每个MeshPoints-object 执行一次drawcall,并且与具有大量顶点的对象相比,太多的对象通常是一个更大的问题.可以通过将多个几何图形合并为一个并利用多种材质、顶点颜色等来减少绘制调用的数量。

  • 如果您在进行后处理,GPU 需要多次渲染屏幕上的每个像素。这也可能会极大地限制您的表现。这可以通过将多个后处理通道合并为一个来优化(我承认,这将是一项艰巨的工作..)

  • 1234563每帧 8-12 毫秒)。有人告诉我还有一些方法可以优化 javascript 性能 :)

【讨论】:

  • 感谢您的详细回复。对于我自己的情况,我通过合并静态景观网格来减少绘制调用的数量。
  • 移动 GPU 没有那么强大,材料选择仍然很重要。即使在台式机上,现在也有大量运行 HI-DPI 屏幕的台式机显示英特尔 GPU
  • @Martin Schuhfuß 当您说普通 GPU 时,您会想到什么 GPU - 英特尔 IGPU?还是 GTX1060?
  • @PranavRai 并不重要,因为 - 我从我的回答中引用 - “这些数字并没有真正的帮助。”。这里的一般想法是,大多数 GPU 将能够每帧多次处理全高清分辨率的每个像素(所以我们已经在谈论 2M 片段)。多少取决于确切的 GPU 规格,例如着色器单元的数量、内存带宽等。这只是为了表明可能存在大量优化潜力。
  • 但这是否意味着threejs甚至WebGL没有自己的开销?我觉得这实在是太好了……
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-03
  • 2018-10-28
  • 1970-01-01
  • 2016-04-12
  • 1970-01-01
  • 2010-11-16
  • 2013-07-05
相关资源
最近更新 更多