- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用Three.js WebGL场景,在缩小时注意到60 FPS,以便可以看到所有观测值(约20,000个三角形),但是在放大时,FPS却很低,因此只有一小部分三角形的子集在 View 中。
我想弄清楚是什么原因造成了这种差异。我的直觉是相反的说法是正确的:我假设当用户在近,远剪切平面中缩放时,会从场景中删除许多三角形,这会增加FPS。我想弄清楚为什么在这种情况下这种直觉是错误的。
如何识别在three.js程序中使用的完整调用堆栈?理想情况下,我想确定所有函数/方法调用以及执行该函数所需的时间,以便我可以找出用户正在放大的着色器的哪一部分正在杀死FPS。
最佳答案
GPU具有一些基本的运算能力。这应该是很明显的。一种是每个顶点运行一次顶点着色器。另一个是每个像素/片段运行一次片段着色器。
几乎总是比顶点多一吨像素。单个1920x1080屏幕将近200万像素,但可以覆盖3个顶点三角形或4或6个顶点四边形(2个三角形)。这意味着覆盖整个屏幕的顶点着色器运行了3到6次,而片段着色器运行了200万次!!!
向片段着色器发送过多的工作称为“填充绑定(bind)”。您将填充率最大化(用像素填充三角形),这就是您所看到的。在更糟糕的情况下,在我的2014 MacBook Pro上,在达到填充速率限制(每秒更新60帧)之前,我可能只能绘制6个左右的屏幕像素。
有各种解决方案。
第一个是z缓冲区。 GPU将首先测试深度缓冲区,以查看是否需要运行片段着色器。如果深度测试失败,则GPU不需要运行片段着色器。因此,如果您对不透明的对象进行排序和绘制,则最靠近的对象首先到达最远的对象,然后,距离中的大多数对象在渲染其三角形的像素时将无法通过深度测试。请注意,这仅在您的片段着色器不写入gl_FragDepth
并且不使用discard
关键字的情况下才可行。
这是一种“避免 overdraw ”的方法。过度绘制是指绘制多次的任何像素。如果您在远处绘制一个立方体,然后近距离绘制一个球体,使其覆盖该立方体,则对于为该立方体渲染的每个像素,球体像素都会“覆盖”该像素。那是浪费时间。
如果您的片段着色器真的很复杂,因此运行缓慢,则某些3D引擎将绘制“Z缓冲区预传递”。他们将使用最简单的顶点和片段着色器绘制所有不透明的几何图形。顶点着色器仅需要位置。片段着色器仅发出一个恒定值。他们甚至会关闭对颜色缓冲区gl.colorMask(false, false, false, false)
的绘图,或者如果硬件支持的话,可能只制作深度仅帧缓冲区。然后,他们使用它来填充深度缓冲区。完成后,他们将使用昂贵的着色器和将深度测试设置为LEQUAL
(或适用于其引擎的任何方法)再次渲染所有内容。这样,每个像素将仅渲染一次。当然它不是免费的,它仍然需要GPU时间来尝试对三角形进行栅格化并测试每个像素,但是如果着色器很昂贵,它仍然比 overdraw 更快。
另一种方法是尝试找出哪些对象将被更近的对象遮挡,甚至不将其提交给GPU。 There are tons of ways to do this,通常涉及边界球和或边界框。一些potentially visible sets技术也可以帮助遮挡剔除。您甚至可以要求GPU使用occlusion queries来计算其中的一部分,尽管仅在WebGL2中可用
查看是否被填充的最简单方法是使 Canvas 变小,例如2x1像素(或者只是将浏览器窗口的尺寸变小)。如果您的应用开始快速运行,则很可能已达到极限。如果它仍然运行缓慢,则可能是几何绑定(bind)(顶点着色器做过多的工作),也可能是CPU绑定(bind)(无论您在CPU上所做的任何工作都花费了太长时间,无论是调用WebGL命令还是计算动画或碰撞)或物理学之类的东西)。
在您的情况下,您可能处于填充边界,因为您看到所有三角形都较小时,它运行得很快(因为绘制的像素很少),而放大时看到很多三角形覆盖了屏幕,那么它运行得很慢(因为也是如此)许多像素)。
没有真正的“简单”解决方案。我真的只是取决于您要做什么。显然您使用的是three.js,我知道它可以对透明对象进行排序。我不知道它是否为不透明的对象排序。我认为列出的其他技术超出了three.js的范围,并且更多的取决于您的应用程序,以便将事物带入或带出场景或将其可见性设置为false等。
注意:here is a simple demo to show how little overdraw your GPU can handle。它只是绘制了一堆全屏四边形。默认情况下,在无法再达到60fps之前,它可能无法绘制那么多图像(尤其是全屏尺寸)。启用从前到后的排序功能,它将可以绘制更多内容,但仍然达到60fps。
另请注意,启用混合比禁用混合要慢。这应该很清楚,因为在不混合GPU的情况下只会写入像素。进行混合时,GPU必须首先读取目标像素,以便它可以进行混合,因此速度较慢。
关于three.js - 在Three.js中调试低FPS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50071894/
我的 Linux Centos Apache 服务器的性能有问题。我有一个程序(用 c 语言编写)可以同时执行许多 http 请求。这个过程本身看起来非常有效,就好像我可以同时向外部服务器发出 500
我想知道如何将并行端口上的数据引脚设置为高电平和低电平。我相信我可以使用 PyParallel 来实现此目的,但我不确定如何设置特定的引脚。 谢谢! 最佳答案 您在这里谈论的是软件-硬件接口(inte
让我有一个像这样的日期时间索引的数据框: date_time open high low close vol 2018-05-13 18:00:00 70.
在 emacs Octave 模式下,当我输入 M-x run-octave 时,命令会卡住,所以我使用 C-g 进行转义。我可以用 C-x b 切换到 *Inferior Octave* 缓冲区,但
我正在 sklearn 中运行 gridsearchCV,尝试使用此代码找到最佳模型参数。 modelDNN= KerasRegressor(build_fn=build_DNN_model, epo
美好的一天。我想知道 android 存储是否低,它会影响应用程序性能吗?因为同一个应用程序在另一台设备上运行速度很快,而同样的应用程序在另一台设备上非常滞后,后者有 12GB 内存中的 2GB 可用
所以我在列卡上有一个带有索引的表 当我运行时 SELECT COUNT(DISTINCT(card)) FROM table 它返回 490 个不同的条目 但是当我运行的时候 SHOW INDEXES
我正在使用手动方法将二进制转换为十进制。此代码在最后一位为高的情况下工作正常,例如:1001。当最后一位为零 [低] 时会出现错误。例如:1010 应该给出 10 但给出 5,因为没有考虑最后一位。有
我一直在努力优化我的站点和数据库,并且我一直在使用 mysqltuner.pl 来帮助解决这个问题。除了表缓存命中率,无论我在 my.cnf 中将它提高多高,我几乎都得到了正确的结果,我仍然命中大约
深入研究 sprite kit (xcode 5)。我正在使用两个示例程序,1. 创建新项目时包含的默认宇宙飞船示例和 2. 我下载的 Adventure Game。 在 iOS 模拟器中运行这些示例
编辑: 感谢大家在这里提供答案,项目已完成。 https://github.com/0xyg3n/ProcessDaemon/ 如果有人想出可能会更好的多线程解决方案,我想。 我是 C# 的新手,我想
我有一个交换 Word 变量的字节(低/高)的过程(它与 System.Swap 函数执行相同的操作)。该过程在编译器优化关闭时有效,但在编译器优化打开时无效。有人可以帮我解决这个问题吗? proce
我以前听说过这些术语描述语言,例如 C 并不是一种低级语言,C++是中级语言,而Python是一种高级语言。我知道它必须与代码的编译方式以及代码的编写方式有关。但是我想知道的是,什么将语言定义为这三类
我有一个关于 NoSQL 类型数据库的问题,特别是 MongoDB,但它通常适用于大多数键值或基于文档的存储。 NoSQL 的一些卖点是速度和可扩展性,但在我看来,与关系数据库相比,开销很大。 你有很
如果没有此代码,fps 为 60-65。但是当我使用这段代码时,fps 下降到 50。 另一个问题是某些设备上的 FPS 太低。然而,游戏非常简单。我对所有形状使用 ShapeRenderer。游戏在
您好,我的名字是 Ryan,我目前正在开发自己的 2D java 游戏。目前游戏世界中有很多物体。游戏重新开始时,世界会加载 100 棵随机放置的树木,这些树木是使用数组列表和树类制作的。我的游戏使用
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我刚刚将我的 Heroku postgres 数据库从 Kappa 计划(800MB RAM,postgres 9.1)升级到 Ronin 计划(1.7GB RAM,postgres 9.2),但性能
现在我正在使用我的 NSDictionary 并运行所有值的循环以找到低值、高值和计算平均值。 由于我是IOS 的新手,所以我想问问是否有更好的方法来做到这一点。有没有? 谢谢。 最佳答案 这个问题的
我目前正在使用 genuino 101 进行一个项目,我需要通过 i2c 读取大量数据,以填充任意大小的缓冲区。从下图中我可以看到读取请求本身只需要大约 3毫秒,写请求大约 200 纳秒。 但是在同一
我是一名优秀的程序员,十分优秀!