C/C++

Hiện Thực Frame Per Second (FPS) Trong SDL

Giới thiệu

Frame Per Second (FPS) là một khái niệm khá phổ biến trong game nó có ý nghĩa là số frame trên 1 giây mà máy tính có thể render, FPS càng cao thì thể hiện độ mượt của game càng cao. Với những engine như Unity hay Cocos2dx thì những engine đó đã hiện thực FPS sẵn. Trong bài viết này tôi sẽ hướng dẫn các bạn hiện thực lại FPS với thư viện SDL ở mức độ cơ bản.

Tiền đề bài viết

Tiếp nối những bài viết hướng dẫn lập trình với framework SDL (Simple DirectMedia Layer).

Trong bài viết tôi sẽ sử dụng FPS thay vì Frame Per Second.

Đối tượng hướng đến

Những lập trình viên đã có kiến thức vững chắc về ngôn ngữ lập trình C++, mong muốn tìm hiểu và hiện thực lại FPS sử dụng thư viện SDL.

Ý tưởng

Ta có đoạn mã như dưới đây:

Kết quả chạy chương trình:

sdl_fps_ss_01

Giả sử ở đây là mỗi lần biến x được in ra thì xem như một frame được vẽ lên màn hình. Chúng ta thấy frame được vẽ ra quá nhanh, không thể biết được là bao nhiêu frame/second.

Ý tưởng đặt ra là chúng ta sẽ xác định và kiểm soát số frame được render trên 1 giây bằng cách:

Gọi:

FPS là số frame mà chúng ta cần render trên 1 giây. Ở đây tôi sẽ gán FPS = 60.

DELAY_TIME  = 1000 milisecond/FPS, chính là thời gian tính trên lý thuyết để máy tính tính toán và render xong 1 frame. Như vậy mỗi frame sẽ cần khoảng 16 miliseconds để có thể tính toán và render lên màn hình.

frameStart là thời gian bắt đầu của 1 frame;

frameTime là thời gian thực sự để máy tính tính toán và render xong 1 frame kể từ thời điểm bắt đầu.

Kiểm tra nếu frameTime < DELAY_TIME thì delay một khoảng thời gian bằng đúng DELAY_TIME – frameTime. Nghĩa là nếu máy tính tính toán và render xong 1 frame nhanh hơn số thời gian lý thuyết cần cho 1 frame nên ta phải delay khoảng thời gian còn lại.

Hiện thực

Hàm SDL_GetTicks() có chức năng lấy về tổng số miliseconds từ khi SDL được khởi tạo.

Với mỗi vòng lặp thì chúng ta lấy thời gian bắt đầu của 1 frame, sau khi tính toán và render xong, ta lấy tiếp thời gian mà máy tính đã tính toán và render xong 1 frame, kiểm tra điều kiện, nếu thỏa mãn sẽ delay số miliseconds còn lại (DELAY_TIME – frameTime) sau đó mới bắt đầu sang frame tiếp theo.

Kết quả sau khi chạy chương trình:

sdl_fps_ss_02

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.