65.9K
CodeProject 正在变化。 阅读更多。
Home

帧率计数器

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.60/5 (4投票s)

2007年7月27日

CPOL

2分钟阅读

viewsIcon

31415

downloadIcon

9

一个极简的帧率计数器。

Screenshot - framerate.jpg

引言

这是一个快速、实用的帧率计数器,适用于你的图形应用程序,它可以不停地绘制(就像典型的游戏一样)。它可以更新以用于其他应用程序,例如跟踪文件下载的字节数。然后可以使用该速率来估计时间。但是,提供此计数器的目的是将其用作图形性能的计数器。

使用代码

这可能看起来很熟悉,但并非如此。我见过两种类型的帧率计数器。这是一种,另一种是一个返回callCount的函数,并且Paint例程检查:If frameRate() > 0 Then并立即更新一个局部值。这个计数器的不同之处在于它为你执行此操作,并更改变量的值(此处称为currentFrameRate)。该值每秒更改一次,并设置为该秒内Paint循环执行的次数。你只需要根据需要使用此值,例如将其绘制到表面上,并且提供了基于GDI+的说明。它绝不是精确到小数点的,我会允许大约 1 的变化。但是,如果你的帧速率低于 10,那么我无论如何都会担心用户体验,而不管代码的潜在不准确性。

有创造力的人甚至可以将此代码改编用于其他用途,例如跟踪进程的性能(每秒处理的对象数)。你甚至可以更改时间,以便你获得每分钟的调用计数。但是,它是为秒配置的,如果你更改时间刻度,请注意callCount变得过高。

要实际使用代码

  1. 将以下代码插入到源文件中
  2. ' 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
  3. 将以下内容添加到你的声明部分,并确保该函数将可以访问它(例如,将它们保存在同一个类中)
  4. Private currentFrameRate As Integer
  5. 在你的绘图例程(例如,myForm_Paint)中,添加以下行
  6. ' 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.DrawingXposYpos 表示你希望将代码放置在窗体上的任何位置,并且可以在必要时替换为 System.Drawing.Point

我并不完全在意你是否将我的名字放在代码上。 虽然,我很乐意下载一个在下载页面上写有“包含来自忍者(Ninja)的代码”的应用程序。

历史

这是我提交的原始版本。

© . All rights reserved.