Hallo VB-Paradise Community
Hab wegen einem Spiel kürzlich einen FPS-Messer gebraucht. Da für mich auch die Berechnung der durschnittlichen Frame Rate interessant war, hab ich diese Funktion auch eingebaut. Ich weiß ein sehr simpler Zweck, da ich aber im Inet nur FPS-Meter in VB für die aktuelle bzw. max. und min. Framerate gefunden haben, dachte ich es wäre interessant den Code hier für die Nachwelt zu teilen.
Natürlich kann man damit alle möglichen Aktualisierungsintervalle messen!
Hier die Klasse:
Spoiler anzeigen
Verwendungsbeispiel, kleine DirectX Anwendung:
Spoiler anzeigen
Hoffe vll kann ich irgendjemanden mal damit helfen.
LG Kryo4lex
Hab wegen einem Spiel kürzlich einen FPS-Messer gebraucht. Da für mich auch die Berechnung der durschnittlichen Frame Rate interessant war, hab ich diese Funktion auch eingebaut. Ich weiß ein sehr simpler Zweck, da ich aber im Inet nur FPS-Meter in VB für die aktuelle bzw. max. und min. Framerate gefunden haben, dachte ich es wäre interessant den Code hier für die Nachwelt zu teilen.
Natürlich kann man damit alle möglichen Aktualisierungsintervalle messen!
Hier die Klasse:
VB.NET-Quellcode
- Option Strict On
- Public Class FPS_Measure
- ' api declare
- Public Declare Function GetTickCount Lib "kernel32" () As Long
- ' is one sec. ?
- Private FPS_LastCheck As Long
- ' FPS were counted
- Private FPS_Count As Long
- ' here is the actual FPS number
- Public FPS_Current As Integer
- ' AVG FPS
- Public FPS_AVG As Double
- ' highest FPS
- Public FPS_Highest As Integer
- ' lowest FPS
- Public FPS_Lowest As Integer
- Public Sub Measure_FPS(ByVal calcHighest As Boolean, ByVal calcLowest As Boolean, ByVal calcAVG As Boolean)
- If GetTickCount() - FPS_LastCheck >= 1000 Then
- FPS_Current = CInt(FPS_Count)
- FPS_Count = 0 ' set the counter
- FPS_LastCheck = GetTickCount()
- End If
- If calcHighest Then
- measure_FPS_Highest()
- End If
- If calcLowest Then
- measure_FPS_Lowest()
- End If
- If calcAVG Then
- measure_FPS_AVG()
- End If
- FPS_Count = FPS_Count + 1
- End Sub
- Private Sub measure_FPS_Highest()
- ' highest FPS
- If FPS_Current > FPS_Highest Then
- FPS_Highest = FPS_Current
- End If
- End Sub
- Private Sub measure_FPS_Lowest()
- ' lowest FPS
- If FPS_Current < FPS_Lowest Then
- FPS_Lowest = FPS_Current
- End If
- End Sub
- ' the last n FPSs
- Private FPS_HISTORY_NR As Integer = 10
- ' is one sec. ?
- Private FPS_AVG_LastCheck As Long
- ' values of the last fps
- Private FPS_AVG_last_readings(FPS_HISTORY_NR) As Double
- 'we'll be reading the stats every second
- Private STAT_INTERVAL As Integer = 1000 ' ms
- ' Index of last status stored
- Private idx_lastStatusStored As Integer = 0
- '10 Messwerte --> FPS_HISTORY_NR und das erfassen eines neuen alle 1000 ms --> STAT_INTERVAL sind die besten Konfigurationseinstellungen.
- Private Sub measure_FPS_AVG()
- 'Works with ring buffer principle
- If GetTickCount() - FPS_AVG_LastCheck >= STAT_INTERVAL Then
- FPS_AVG_last_readings(idx_lastStatusStored) = FPS_Current
- If idx_lastStatusStored >= FPS_HISTORY_NR Then
- idx_lastStatusStored = 0
- Else
- idx_lastStatusStored += 1
- End If
- Dim sum As Double = 0
- For i As Integer = 0 To FPS_HISTORY_NR - 1
- sum += FPS_AVG_last_readings(i)
- Next
- FPS_AVG = sum / FPS_HISTORY_NR
- FPS_AVG_LastCheck = GetTickCount()
- End If
- End Sub
- End Class
Verwendungsbeispiel, kleine DirectX Anwendung:
VB.NET-Quellcode
- Private Sub draw()
- drawfont = New Direct3D.Font(d3ddev, New System.Drawing.Font("IMPACT", 32, FontStyle.Regular, GraphicsUnit.Pixel))
- Dim fps_measure As New FPS_Measure 'Unsere in einer eigenen vb-Datei definierte Klasse
- Do While gamerun 'Game Loop also zyklisch aufgerufener Code Abschnitt, dessen Aktualisierungsintervall wir messen wollen!
- Dim cursorposx As Integer = Cursor.Position.X
- Dim cursorposy As Integer = Cursor.Position.Y
- d3ddev.Clear(ClearFlags.Target Or ClearFlags.ZBuffer, bkgcolor, 1, 0)
- d3ddev.BeginScene()
- 'Bei diesem Beispiel zeichnen wir einen Namen auf den Screen. Die spezifischen Werte werden auch auf den Bildschirm gezeichnet.
- 'hier werden die Variablen die die jeweiligen Werte enthalten gleich direkt als String verwendet. Eben abhängig vom Anwendungdzweck
- drawfont.DrawText(Nothing, "ALEX", cursorposx, cursorposy, Color.DarkCyan)
- drawfont.DrawText(Nothing, "FPS Current: " & fps_measure.FPS_Current, 0, 0, Color.DarkCyan)
- drawfont.DrawText(Nothing, "FPS Average: " & fps_measure.FPS_AVG.ToString("0.00"), 0, 36, Color.DarkCyan)
- drawfont.DrawText(Nothing, "FPS Highest: " & fps_measure.FPS_Highest, 0, 72, Color.DarkCyan)
- drawfont.DrawText(Nothing, "FPS Lowest: " & fps_measure.FPS_Lowest, 0, 108, Color.DarkCyan)
- d3ddev.EndScene()
- d3ddev.Present()
- Windows.Forms.Application.DoEvents()
- fps_measure.Measure_FPS(True, True, True) 'Aufruf unserer Messfunktion mittels 3 Parametern: Ob er die Höchste, Niedrigste und Durchschnittsanzahl berechnen soll --> bei False minimalste Performence Unterschiede
- Loop
- End Sub
Hoffe vll kann ich irgendjemanden mal damit helfen.
LG Kryo4lex