Khái niệm
- Frame: một vòng lặp của game gọi là một frame. Mỗi vòng lặp gồm 2 thao tác chính là update và render (đã trình bày ở các phần trước)
- Framerate: tầng số frame, tính bằng số lần lập/số frane thực hiện trong một giây (fps). [Xem thêm]. Cũng có thể hiểu là số lần vẽ lên màn hình tính trong thời gian một giây. Thông thường với game ngưỡng thấp nhất chấp nhận được là 8 fps (frame per second) và không có ngưỡng tối đa.
- FrameDt: khoảng thời gian dùng để thực hiện xong một frame.
- Limit framerate: là kỹ thuật giới hạn số lượng frame trong 1 giây. Kỹ thuật này giúp:
+ Ổn định framerate chung cho cả game
+ Giảm tình trạng game lúc nhanh lúc chậm
+ Giúp đồng bộ hóa framerate của game trên các device khác nhau
+ Giảm năng lượng tiêu tốn không cần thiết. Fps càng cao, đồng nghĩa với việc CPU/GPU làm việc trong khoảng thời gian dài với công suất cao, gây hao phí không cần thiết. Limit framerate giữ fps ở mức độ vừa phải, tạo ra khoảng thời gian "nghĩ ngơi" cho CPU/GPU
Kỹ thuật Limit framerate
Như đã trình bày ở trên, Limit framerate đảm bảo fps được duy trì ổn định quanh một giá trị qui ước. Giả sử mong muốn tốc độ game ổn định ở khoảng 25 fps.
25 fps40ms/frame
Như vậy, mỗi lần update & render trung bình khoảng 80 ms. Trong trường hợp tổng thời gian update + render nhỏ hơn 80ms, game được phép "ngủ" trong khoảng thời gian còn lại.
- Frame 1: tổng thời gian update + render là 20ms. Do đó, game được sleep trong khoảng 20ms còn lại
- Frame 2: tổng thời gian update + render là 50ms > 40ms. Không cần sleep (hoặc sleep 1)
- Frame 3: tổng thời gian update + render là 25ms. Do đó, game được sleep trong khoảng 15ms còn lại
Kỹ thuật limit fps không phải là kỹ thuật làm tăng fps. Để nâng cao fps cho game, cần kỹ thuật optimization.
Nên limit fps bao nhiêu?
Không có một giá trị cụ thể nào được đưa ra cho câu trả lời này. Tùy vào từng game, từng loại game mà người lập trình/nhà sản xuất đưa ra con số qui định cho mình. Thông thường, fps = 25 là ổn.
Tuy nhiên, việc limit fps sẽ không có tác dụng nếu fps thật sự nhỏ hơn fps cần limit. Xem ví dụ trên, frame 2. Trong trường hợp này, limit fps không có vai trò gì khi đặt ở ngưỡng 25fps. Tuy nhiên, với ngưỡng 12.5 fps (80 ms/frame), limit fps lại có tác dụng.
Implementation
Bước 1: Lấy ngày giờ hệ thống
Ta cần một hàm lấy giờ hệ thống để tính toán khoảng thời gian dùng cho update + render. Để làm được điều này:- Khai báo thư viện time.h trong header.h để sử dụng hàm clock(). Việc khai báo này được thực hiện với config PLATFORM_WIN32_VS. Các platform khác có một chút khác biệt ta sẽ đề cập sau
- Trong CDevice, thêm hàm GetTimer() trả về ngày giờ hệ thống.
Bước 2: Tạo lớp CFpsManager quản lý fps
Lớp CFpsManager cũng được thiết kế dạng singleton, gồm các phương thức:
- SetLimitFps: thiết lập thông số limit fps
- BeginCounter: Được gọi khi bắt đầu tình toán fps
- EndCounter: Được gọi tại ví trí kết thúc tính đoán fps và thực hiện limit frame rate
- GetFrameDt: Lấy FrameDT hiện tại
- GetRuntimeFps: Lấy Fps hiện tại (giá trị do đạc thực tế). Kết quả trả về có thể không trùng khớp với giá trị thiết lập bởi SetLimitFps
Ngoài cái chức năng chính trên, CFpsController còn có thể mở rộng, phục vụ cho việc thống kê fps.
Bước 3: Cài đặt chức năng tính toán fps vào vòng lập chính của game
Ta tiến hành hiệu chỉnh CGame
Post a Comment Blogger Facebook
Post a Comment