關於我們 最新消息 程式製作 作品下載 教學資源 友站連結


教學資源

遊戲設計 -> 遊戲回圈和FPS的計算
我們知道,遊戲的畫面是不斷的更新,今天我們所要介紹的就是遊戲的回圈和FPS的計算。

首先,說到回圈,CPU一次只能做一件事,可是為何Window可以一邊聽MP3一邊上網等等....同時做很多事?因為Window它不停的切換做不同的事,所以讓我們感覺是多功的,接下來說到事件,我們知道當視窗被按或滑鼠移動等等事件,看起來像是被動發生的,其實是程式裡面有一個不停跑的回圈,一直去檢查看看有沒有事情發生,這個回圈會一直跑,直到程式結束為止,然而,說了那麼多廢話,到底跟主題有什麼關係呢?有的!我們一向都把更新遊戲的動作放到這個檢查事件的回圈裡,如此一來,遊戲可以更新,事件也不會因為更新遊戲而沒辦法去接收,如果是使用VB的話,假如遊戲畫面需要非常流暢,千萬不要使用Timer元件,Timer元件其實一點都不準,最好另外自己呼叫一個無限回圈,以此最為更新用,為了避免事件無法接收,請一定要加一個DoEvents。

接下來講到了我們的重點,FPS的計算,何為FPS呢?這可不是指"第一人稱射擊遊戲(First Personal Shooting)",而是指"Frames Per Second",也就是每秒鐘畫面更新的次數,如果是畫面不需流暢的遊戲來說,FPS不需要很好,但是如果是節奏快的遊戲,FPS就相當重要,一款好的遊戲如果畫面不停的閃動、停格,我想再好也沒人有耐心玩得下去,所以通常我們在開發Game時都會弄個FPS來看看我們Game的速度是否在我們的要求內,以及做何更改可以讓速度更快,好了,不多說廢話,我們來介紹FPS的計算方法。

在這之前,我們先來介紹一下我們時間的標準來源,就是Window提供的GetTickCount函數,它可以回傳自開以來所經歷的毫秒數,也就是千分之一秒,我們就利用這個函數來計算FPS。

長整數 更新次數 Frames = 0
長整數 FPS計算周期 UpdateTime = 1000
長整數 上次FPS計算時間 LastTime = 0
浮點 FPS = 0

我們現在有了 Frames、UpdateTime、LastTime、FPS這幾個變數,Frames是指更新的次數,UpdateTime是指多久算一次FPS,而LastTime是指上次計算FPS的時間,FPS就不用說了,就是存FPS結果的地方,首先,我們把Frames放在遊戲更新的回圈裡,每更新一次就+1,然後並在回圈裡加一個IF判斷,用GetTickCount()-LastTime和UpdateTime比,如果大於FPS計算周期,就表示該計算FPS了,於是就更新FPS的值吧。

這裡重點來了,FPS計算的公式如下

FPS = (Frames/(GetTickCount()-LastTime))*1000.0

最後,FPS計算完了,把LastTime設為GetTickCount(),也就是現在時間,Frames也要規0。

這樣說可能有點讓人聽不懂,所以我弄了一段用C/C++和VB寫的範例


int Frames = 0;
int UpdateTime = 1000;
int LastTime = 0;
double FPS = 0;

/////// 程式主要回圈 ////////
while(1)
{

UpdateGame(); // 更新遊戲

Frames++; // 增加更新的次數

if(GetTickCount()-LastTime>UpdateTime) // 如果時間超過,該更新
{
FPS = ((double)Frames/(double)(GetTickCount()-LastTime))*1000.0; // FPS的計算公式
LastTime = GetTickCount(); // 設定時間,給下次用
Frames = 0; // 更新次數規0
}
}


Dim Frames As Long
Dim UpdateTime As Long
Dim LastTime As Long
Dim FPS As Double

Frames = 0
UpdateTime = 1000
LastTime = 0
FPS = 0.0

Do While True

UpdateGame ' 更新遊戲

Frames = Frames + 1

If GetTickCount-LastTime>UpdateTime Then
FPS = (Frames/(GetTickCount-LastTime))*1000.0 ' FPS的計算公式
LastTime = GetTickCount() ' 設定時間,給下次用
Frames = 0 ' 更新次數規0
End If

DoEvents

Loop


完成於 2003.11.29

Victor工作室(http://www.kinmen.info/vic)所有 未經同意請勿轉載