contributed by < OscarShiang
>
根據 [Frame rate - Wikipedia] 的描述
Frame rate (expressed in frames per second or FPS) is the frequency (rate) at which consecutive images called frames appear on a display.
可以知道 FPS 就是每秒我們更新了多少次遊戲畫面。
而對應到 raycaster
中就是在一秒內,main.cpp
中的 game loop 跑了幾次。
所以我們可以先看到 main.cpp:main
函式中的實作:
在這個 while 迴圈之中,我們可以看到 raycaster
利用這個迴圈重複地進行算繪,並將 floating-point 與 fixed-point 的 buffer 利用 SDL_RenderPresent
顯示在視窗上,因此從這邊我們可以判斷這個迴圈就是 game loop
根據 SDL Wiki 上的說明,我們可以知道在這邊使用到的 SDL_GetPerformanceCounter
是用來取得 SDL 內建的 high resolution counter 的數值,而我們可以透過這個數值差來算出兩次 game loop 之間相差多久。
而在上述程式碼中可以看到在取得兩個 frame 之間的 counter 差值後,我們是透過 tickFrequency
來算出時間差的,而這個部分可以回推到 main.cpp:93
的部分
SDL_GetPerformanceFrequency
這個函式在 SDL Wiki 中的描述是
Returns a platform-specific count per second.
因此我們可以透過這個函式得知當前運行平台每秒對應到多少 count,透過這樣我們就可以從 (nextCounter - tickCounter) / static_cast<float>(tickFrequency)
計算出產生這個 frame 所花費的時間。並從這邊推得 FPS 的數值。
在 FPS 的實作中,我使用兩個變數作為 counter,分別計算從上次更新 FPS 到目前的秒數以及產生的 frame 的數量
當 sec_counter
大於 1 時,將 frame_counter
中的數值作為 FPS 輸出,並清空
得到的執行結果如下:
為了方便在測試的過程中,查看 FPS 的數值,我將這個結果改以顯示在遊戲視窗的標題中
所以我們需要將程式碼進行以下的修改
而結果呈現如下紅框所示
因為 raycaster_table.h
中的數值是固定的,所以我們可以在編譯時期才產生
為了將在 RayCasterPrecalculator::Precalculate
計算出來的表格輸出到檔案中,我們需要修改其實作的回傳值
接著實作 table_generator
將結果輸出到檔案中
generate_table
的實作如下
測試其產生的結果是否正確
並將 table_generator
整合到 Makefile
中
在 all
這個 target 中調整順序就可以確保在編譯 raycaster 前會先將 raycaster_tables.h
這個表格產生出來後才開始進行編譯。
測試的結果如下
sysprog2020