Lekce 06 - Výpočet FPS

Předmluva

FPS je zkratka z anglického frame per second volně přeloženo počet snímků za sekundu. Znamená (kupodivu:)) počet vykreslených snímků za jednu sekundu. K čemu slouží snad nemusím vysvětlovat, takže se podíváme rovnou na kód.

Praxe

Použijeme zdrojový kód z předchozí lekce, který se pro to ideálně hodí. Vzhledem k tomu že ješte neumíme vykreslovat text, musíme si pomoci jinak. Pro zobrazení FPS použijeme vlastnost Caption u našeho formuláře. Takže nastavte následující.

Formulář:
BorderStyle = 1
Caption = 0

Modul třídy:
Deklacace potřebných funkcí WinApi

Private Declare Function GetTickCount Lib "kernel32" () As Long
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Naše funkce umí nejen zjistit, ale také nastavit FPS. Použitá API funkce GetTickCount() nám vrací počet milisekund jež uběhly od spuštění počítače a funkce Sleep() pozastaví běh programu na zadanou dobu v milisekundách.

Public Sub SetGetFPS(ByVal SetFPS As Integer)
Static fps As Integer 'udrzuje aktualni pocet jiz zobrazenych snimku
Static previousTime As Long 'predchozi cas
Dim currentTime As Long 'aktualni cas

Select Case SetFPS
Case 0 'zjistuje a zobrazuje FPS
currentTime = GetTickCount()
fps = fps + 1

If currentTime - previousTime > 1000 Then
previousTime = currentTime
frmMain.Caption = fps
fps = 0
End If
Case Else 'nastavuje a zobrazuje FPS
Sleep 1000 \ SetFPS

currentTime = GetTickCount()
fps = fps + 1

If currentTime - previousTime > 1000 Then
previousTime = currentTime
frmMain.Caption = fps
fps = 0
End If
End Select
End Sub

Standartní modul:
V proceduře DrawScene přidejte za řádek Call DrawCube volání Call Engine.SetGetFPS(0).
..............

Call DrawCube
Call Engine.SetGetFPS(0) 'nove

A to je vše. Pokud voláme proceduru SetGetFPS s parametrem nula, je prováděn pouze výpočet FPS. Pokud zadáte ne-nula (ale kladné!!), bude FPS omezen na tuto hodnotu a rovněž proběhne vypočet FPS (pro kontrolu).

Musíte ovšem počítat s tím že přesnost výpočtů se pohybuje s odchylkou cca 1-4 snímky. Každé volání nás stojí několik milisekund a to se někde musí projevit. Taková odchylka je však ještě přijatelná. Jen se nelekněte pokud budete mít u vašich aplikací na začátku velmi nízké FPS. Uvědomte si že spouštíme projekt v režimu ladění a nepoužíváme skutečný fullscreen (to je mínus cca 10% výkonu), taky neaplikujeme žádné optimalizace (např. odstranění zadních stěn) atd. .

Zdrojové kódy ke stažení zde.

Příště (pokud bude dost času) se naučíme nahrávat komprimované a nekomprimované obrázky TGA a vytvářet z nich textury.

© 2005 Jindřich Mach & Jan Ticháček