IT-Academy Logo
Sign Up Login Help
Home - Programmieren - Visual Basic - Framerate berechnen (VB)



Framerate berechnen (VB)

Manche Spieler interessiert die Framerate (kurz FPS) die ein Spiel erzeugt. Unter Verwendung von DirectX und Visual Basic werden wir in diesem Artikel die Framerate berechnen und eine Funktion DrawFPS zur Ausgabe schreiben.


Autor: Tobias Surmann (incsoft)
Datum: 16-04-2003, 09:06:45
Referenzen: keine
Schwierigkeit: Profis
Ansichten: 8155x
Rating: 5 (3x bewertet)

Hinweis:

Für den hier dargestellte Inhalt ist nicht der Betreiber der Plattform, sondern der jeweilige Autor verantwortlich.
Falls Sie Missbrauch vermuten, bitten wir Sie, uns unter missbrauch@it-academy.cc zu kontaktieren.

[Druckansicht] [Als E-Mail senden] [Kommentar verfassen]



Aber was ist nun die Framerate?

Die Framerate gibt an, wie viele Bilder (Frames) pro Sekunde vom Computer dargestellt werden können. Wer schon mal ein Daumenkino gebastelt hat, kennt den Effekt. Wenn man die einzelnen Bilder zu langsam hintereinander ablaufen lässt, entsteht keine Animation sondern das Bild ruckelt. Ab 25 Bilder pro Sekunde sieht der Mensch einzelne Bilder als Film bzw. Animation. Gute Grafikkarten schaffen heutzutage aber deutlich mehr Bilder pro Sekunde. So sehen die Animationen noch flüssiger aus.

Wir benötigen eine öffentliche Variable, die die FPS (Frames per second) speichert. Wir deklarieren diese im Modul modDDraw.

Public FPS As Integer

Nun können wir aus allen Funktion auf die Variable zugreifen und ihr einen neuen Wert zuweisen oder ihren Wert lesen.

Im gleichen Modul definieren wir schon mal den Funktionskopf der Prozedur CountFPS

Public Sub CountFPS()

End Sub
Diese berechnet wie viele Bilder pro Sekunde angezeigt werden und speichert den Wert in FPS ab.

Public Sub CountFPS()

    Static LastTime As Long
    Static counter As Integer
    
    counter = counter + 1
    
    If DX.TickCount - LastTime >= 1000 Then
        
        LastTime = DX.TickCount
        FPS = counter
        counter = 0
        
    End If

End Sub
Die ersten beiden Zeilen deklarieren zwei statische Variablen. Diese werden innerhalb der Prozedur immer wieder gebraucht um die Werte des vorigen Durchlaufs zu speichern, deshalb sind diese auch als Static deklariert.

LastTime speichert, wann das letzte Mal eine Messung der Framerate erfolgt ist. Die Variable counter zählt die gezeichneten Frames. Mit der Zeile

    If DX.TickCount - LastTime >= 1000 Then
prüfen wir ob zwischen dem aktuellen Durchlauf und der letzten Messung schon 1000 ms = 1 sek. vergangen sind. Trifft dies zu, speichern wir in LastTime die aktuelle Zeit.

        LastTime = DX.TickCount
Der globalen Variablen FPS wird nun die Variable counter zugewiesen, die gezählt hat, wie viele Bilder seit dem letzten Messen gezeichnet wurden. Danach wird counter wieder auf 0 gesetzt und ein neuer Kreislauf beginnt.

FPS erhält nun den von uns gesuchten Wert, nämlich die Anzahl der gezeichneten Bilder pro Sekunde.

Jetzt müssen wir die Framerate nur noch ausgeben. Dies machen wir, indem wir den Wert einfach als Text auf dem Backbuffer ausgeben.

Dazu wechseln wir in die Prozedur DrawFPS im Modul modDDraw und fügen als einzige Zeile in die Prozedur

BackBuffer.DrawText 250, 10, "FPS: " & FPS, False

ein.

Damit wird nun auch die aktuelle Framerate in unserem Spiel angezeigt.

Wir sind aber noch nicht ganz fertig. Wir überlegen uns jetzt einmal, was passiert, wenn unser Spiel auf verschieden schnellen Computern läuft. Als Beispiel nehmen wir

Rechner A: Celeron 400 MHz, 160 MB SD-RAM, 2 MB Grafik (Notebook)
Rechner B: Pentium III 800 MHz, 256 MB SD-RAM, 64 MB Grafik
Rechner C: Athlon 1400 MHz, 256 MB DDR-RAM, 64 MB Grafik

um das Ganze konkret zu veranschaulichen.

Diese Computer produzieren unterschiedliche Framerates beim Spielen. Klar, dass Rechner A, das Notebook, schnell einen gefüllten Grafikspeicher hat und die Grafikdaten in den Arbeitsspeicher auslagern muss. Dadurch verringert sich allerdings auch stark die Darstellungsgeschwindigkeit, da das RAM nun mal nicht so schnell wie der Grafikkartenspeicher ist. Wenn wir das Spiel nun auf dem Notebook entwickeln, und wir haben es endlich geschafft und sind fertig, wollen dies unbedingt auch mal auf dem Desktop-Rechner (Rechner B) ausprobieren, dann erwartet uns eine ziemlich unangenehme Überraschung: Das Spiel läuft viel zu schnell. Genauso wäre es, wenn wir das Spiel auf Rechner B entwickelt hätten und ein Freund spielt mit Rechner C.

Um dies zu verhindern, legen wir eine maximale Framerate fest. Diese darf nicht überschritten werden, da ja dann das Spiel zu schnell läuft und dadurch unspielbar wird. Ich denke, eine "gesunde" Framerate liegt bei ungefähr 60 FPS.

Wird diese unterschritten können wir allerdings nichts dagegen tun, außer eine bessere Grafikkarte mit einem schnelleren Grafikchip und einem größeren Speicher zu kaufen.

Wir lassen jetzt schnellere Rechner eine Schleife durchlaufen, die eigentlich nichts tut außer den Rechner solange zu beschäftigen, bis er nur noch eine Framerate von 60 FPS erreicht.

Wir erweitern die Funktion CountFPS wie folgt.

Zu den Deklarationen fügen wir

    Static savedTick As Long
hinzu. savedTick speichert, wann zum letzten Mal die CountFPS-Prozedur durchlaufen wurde. Deshalb muss sie als Static deklariert werden.

Mit

    While DX.TickCount - savedTick < 1000 \ 60
        DoEvents
    Wend
Warten wir einfach solange, bis ungefähr nur noch 60 Frames pro Sekunde angezeigt werden können. Ersetzen Sie zum Testen die 60 durch z.B. 20 und es werden nur noch etwa 20 Frames pro Sekunde gezeichnet.

Jetzt fehlt nur noch das Speichern der aktuellen Zeit, damit wir darauf beim nächsten Durchlauf wieder über die Variable savedTick zugreifen können.

    savedTick = DX.TickCount
Tatsächlich läuft ein Spiel, welches die oben gezeigt Funktion verwendet nun nicht schneller als vom Programmierer angegeben.


[back to top]



Userdaten
User nicht eingeloggt

Gesamtranking
Werbung
Datenbankstand
Autoren:04506
Artikel:00815
Glossar:04116
News:13565
Userbeiträge:16552
Queueeinträge:06243
News Umfrage
Ihre Anforderungen an ein Online-Zeiterfassungs-Produkt?
Mobile Nutzung möglich (Ipone, Android)
Externe API Schnittstelle/Plugins dritter
Zeiterfassung meiner Mitarbeiter
Exportieren in CSV/XLS
Siehe Kommentar



[Results] | [Archiv] Votes: 1142
Comments: 0