帧率计数器






3.60/5 (4投票s)
一个极简的帧率计数器。
引言
这是一个快速、实用的帧率计数器,适用于你的图形应用程序,它可以不停地绘制(就像典型的游戏一样)。它可以更新以用于其他应用程序,例如跟踪文件下载的字节数。然后可以使用该速率来估计时间。但是,提供此计数器的目的是将其用作图形性能的计数器。
使用代码
这可能看起来很熟悉,但并非如此。我见过两种类型的帧率计数器。这是一种,另一种是一个返回callCount
的函数,并且Paint
例程检查:If frameRate() > 0 Then
并立即更新一个局部值。这个计数器的不同之处在于它为你执行此操作,并更改变量的值(此处称为currentFrameRate
)。该值每秒更改一次,并设置为该秒内Paint循环执行的次数。你只需要根据需要使用此值,例如将其绘制到表面上,并且提供了基于GDI+的说明。它绝不是精确到小数点的,我会允许大约 1 的变化。但是,如果你的帧速率低于 10,那么我无论如何都会担心用户体验,而不管代码的潜在不准确性。
有创造力的人甚至可以将此代码改编用于其他用途,例如跟踪进程的性能(每秒处理的对象数)。你甚至可以更改时间,以便你获得每分钟的调用计数。但是,它是为秒配置的,如果你更改时间刻度,请注意callCount
变得过高。
要实际使用代码
- 将以下代码插入到源文件中
- 将以下内容添加到你的声明部分,并确保该函数将可以访问它(例如,将它们保存在同一个类中)
- 在你的绘图例程(例如,
myForm_Paint
)中,添加以下行
' Framerate Counter
Private Sub advanceFrameRate()
Static ptlu As Double ' Time of last framerate update.
' Show me hardware that can do 32k F/sec...
Static callCount As Integer
' Increment the callCounter
callCount += 1
' Change 1000 if an alternate time value is desired.
If (Environment.TickCount - ptlu) >= 1000 Then
currentFrameRate = callCount
' Reset the callCount, AFTER updating the value.
callCount = 0
' Reset the timeUpdated
ptlu = Environment.TickCount
Else
End If
End Sub
Private currentFrameRate As Integer
' The Call statement is not needed, but makes it obvious.
Call advanceFrameRate()
e.Graphics.DrawString(paintingFrameRate & " F/sec", & _
framerateFont, Brushes.Black, Xpos, Ypos)
注意:上面的行使用 GDI+,并假设你位于 Me.Paint
处理程序中。 随意使用 DirectX 绘图,甚至可以使用 MessageBox
向用户报告此情况。 framerateFont
是你选择的 System.Drawing.Font
。 此外,画笔颜色可能会更改,尤其是在你的背景为黑色时。 我倾向于使用
Private framerateFont As Font = _
New Font("Verdana", 12, FontStyle.Regular, GraphicsUnit.Pixel)
注意:此行需要在声明中 Imports System.Drawing
。 Xpos
和 Ypos
表示你希望将代码放置在窗体上的任何位置,并且可以在必要时替换为 System.Drawing.Point
。
我并不完全在意你是否将我的名字放在代码上。 虽然,我很乐意下载一个在下载页面上写有“包含来自忍者(Ninja)的代码”的应用程序。
历史
这是我提交的原始版本。