![]() |
1
93
你需要一个平滑的平均值,最简单的方法是取当前的答案(绘制最后一帧的时间)并将其与前一个答案结合起来。
通过调整0.9/0.1的比率,你可以改变“时间常数”,也就是数字对变化的反应速度。支持旧答案的分数越大,变化越慢;支持新答案的分数越大,变化越快。显然这两个因素必须加在一起! |
![]() |
2
44
这是我在很多比赛中使用的。
|
![]() |
3
22
好吧,当然
但是,正如您所指出的,渲染单个帧所需的时间有很多变化,从ui的角度来看,以帧速率更新fps值根本不可用(除非该数字非常稳定)。 你想要的可能是移动平均线或某种装箱/重置计数器。 例如,您可以维护一个队列数据结构,该结构保存最近30、60、100帧中每个帧的渲染时间,或者保存您的帧(您甚至可以对其进行设计,以便在运行时可以调整限制)。要确定合适的fps近似值,可以从队列中的所有渲染时间确定平均fps:
渲染完新帧后,会将新的渲染时间排队,并将旧的渲染时间排队。或者,只有当渲染时间的总和超过某个预设值(例如1秒)时,才能出列。您可以维护“last fps value”和一个last updated timestamp,以便在需要时触发更新fps图。尽管如果格式一致,使用移动平均值,在每帧上打印“瞬时平均”fps可能是可以的。 另一种方法是使用重置计数器。保持精确的(毫秒)时间戳、帧计数器和fps值。渲染完帧后,递增计数器。当计数器达到预设限制(例如100帧)或时间戳超过某个预设值(例如1秒)后的时间时,计算fps:
然后将计数器重置为0并将时间戳设置为当前时间。 |
![]() |
4
11
每次呈现屏幕时递增一个计数器,并在一段时间间隔内清除该计数器以测量帧速率。 每隔3秒,取计数器/3,然后清空计数器。 |
![]() |
5
9
至少有两种方法: 第一个是其他人在我面前提到的。 我认为这是最简单和最可取的方法。你只是想知道
在这种情况下,计算fps与计算以下公式一样简单:
然后,有一个超级酷的方法,你可能会喜欢使用某一天: 假设你有“我”的框架来考虑。我将使用这个符号:f[0]、f[1]、…、f[i-1]来描述分别渲染第0帧、第1帧、…、第(i-1)帧所需的时间。
那么,i帧后fps的数学定义是
同样的公式,但只考虑i-1框架。
现在这里的诀窍是修改公式(1)的右侧,使其包含公式(2)的右侧,并替换为左侧。 就像这样(如果你把它写在纸上,你应该看得更清楚):
所以根据这个公式(我的数学推导技巧有点生疏),要计算新的fps,你需要知道前一帧的fps,渲染最后一帧的持续时间和渲染的帧数。 |
![]() |
6
5
这对大多数人来说可能是杀伤力太强了,这就是为什么我在实现它时没有发布它。但它非常健壮和灵活。 它存储一个具有最后一帧时间的队列,因此它可以准确地计算平均fps值,比只考虑最后一帧要好得多。 它还允许你忽略一个帧,如果你正在做的事情,你知道是要人为地把该帧的时间弄糟。 它还允许您在队列运行时更改要存储在队列中的帧数,以便可以动态测试对您来说什么是最佳值。
|
![]() |
7
2
好答案。你如何实现它取决于你需要它做什么。我更喜欢上面那个人写的“时间=时间*0.9+最后一帧*0.1”的跑步平均成绩。 不过,我个人更喜欢将我的平均值更重于更新的数据,因为在游戏中,尖峰是最难压扁的,因此对我最感兴趣。所以我会使用一些更像.7\.3分割的东西会使尖峰更快地出现(尽管它的效果也会更快地从屏幕上消失)。见下文) 如果你的注意力集中在渲染时间上,那么.9.1版本的拆分在b/c上运行得很好,它会更平滑。尽管对于游戏性/人工智能/物理来说,峰值是一个更值得关注的问题,因为这通常会使你的游戏看起来不稳定(这通常比低帧速率更糟糕,假设我们没有降到20 fps以下) 所以,我要做的是添加如下内容:
(填入3.0f,无论你发现什么幅度的峰值是不可接受的) 这样你就能找到 解决 fps发出它们发生的帧的结尾。 |
![]() |
8
2
一个比使用大量旧帧率更好的系统是这样做:
此方法使用的内存少得多,所需的代码少得多,并且比旧的帧速率更重视最近的帧速率,同时还能平滑突然的帧速率变化的影响。 |
![]() |
9
1
您可以保留一个计数器,在渲染每一帧后递增,然后在新的一秒时重置计数器(将前一个值存储为渲染帧的最后一秒) |
|
10
1
我是怎么做到的!
换句话说,滴答钟跟踪滴答声。如果是第一次,它会占用当前时间并将其放入“tickstart”。在第一个刻度之后,它使变量“fps”等于刻度时钟的刻度除以时间减去第一个刻度的时间。 fps是一个整数,因此是“(int)”。 |
![]() |
11
1
JavaScript:
|
![]() |
12
0
将计数器设置为零。每次绘制帧时,计数器都会递增。每秒钟打印一次计数器。泡沫,冲洗,重复。如果你想要额外的积分,保持一个运行计数器,除以总秒数为一个运行平均。 |
![]() |
13
0
在(C++类)伪代码中,这两个是我在工业图像处理应用中所使用的,它们必须处理来自外部触发相机的图像。“帧速率”的变化具有不同的来源(在带上生产速度较慢或更快),但问题是相同的。(我假设您有一个简单的timer.peek()调用,它给您提供了类似于nr of msec(nsec?)自应用程序启动或上次调用之后) 解决方案1:快速但不是每帧都更新
解决方案2:每帧更新一次,需要更多的内存和CPU
|
![]() |
14
0
|
![]() |
15
0
以下是我在爪哇的做法:
|
![]() |
16
0
下面是一个完整的例子,使用python(但是很容易适应任何语言)。它在martin的答案中使用了平滑方程,所以几乎没有内存开销,我选择了对我有用的值(可以随意使用常量来适应您的用例)。
|
![]() |
17
-1
存储开始时间并在每个循环中增加一次帧计数器?每隔几秒钟,您就可以打印framecount/(now-starttime),然后重新初始化它们。 编辑:OOPS。双忍者 |
![]() |
danial · 如何在多个字符串的每个位置找到最频繁的字符 2 年前 |
![]() |
Manny · 如何比较Perl中的字符串? 2 年前 |
![]() |
Diret · 获取范围内每个数字的子倍数的算法 2 年前 |
![]() |
Saif · 排序时python如何决定何时调用比较器? 2 年前 |