CHƯƠNG II. SETUP DIRECTX

Link Source code HD không che: https://goo.gl/2rU2Hr 
Các bạn nên mở sources code vừa đọc vừa so sánh với tut này vì mình sẽ giải thích những gì trong sources code.


1. Cài đặt thư viện

  • ClbGameUIT cũng có một vài cuốn tài liệu có nói về việc cài đặt thư việc DirectX rất chi tiết, nên ở bước này mình sẽ không nói đến mà sẽ đưa link đến tài liệu để các bạn tham khảo.Link HD không che: http://clbgameuit.com/threads/begin-directx.6/

  • Về việc tạo cửa sổ game, tạo device của DirectX có nói hết kĩ càng trong nùi tài liệu ở link trên nên mình sẽ bỏ qua phần này và tiến với việc cài đặt vòng lặp game. Tuy nhiên các bạn yên tâm là mình sẽ có link về sources code cho mỗi bài.

2. GameGlobal

  • Đây là class sẽ chứa thông tin Global tức là được sử dụng xuyên suốt trong game như HINSTANCE, HWND, LPD3DXSPRITE, LPDIRECT3DDEVICE9,…(cú pháp đặt class của DirectX thật là vl ☹ )

  • Thì class này sẽ chứa các hàm và biến static để lưu những dữ liệu này. Và chúng được mình set các thuộc tính chủ yếu trong lúc khởi tạo windows các bạn có thể xem source để biết thêm.

3. GameTime

  • Cơ chế của vòng lặp game đó là tạo 1 vòng while xong chúng ta sẽ xử lý trong vòng while đó, tuy nhiên vòng lặp while chạy rất nhanh và chúng ta cần xử lý thời gian cho mỗi lần lặp while sao cho không nhanh quá. Thì mình sẽ sử dụng System Information Functions được hỗ trợ sẵn trong windows.h để xử lý cái này.

  • FPS là gì? FPS (Frame per Second) có thể hiểu nà na ná là tốc độ render (vẽ) lên màn hình của game. Giống như phim ảnh để có thể thấy hình chuyển động thì phải lật nhiều hình trong vòng 1 giây, thì game cũng vậy. FPS càng cao thì game càng mượt mà. Bạn có thể vào đây để xem gae 30FPS và game 60FPS sẽ khác nhau thế nào http://30vs60.com

  • GameTime là 1 class Singleton và có 2 hàm quan trọng là StartCounter() và GetCounter(). Sẽ được sử dụng để đo khoảng thời gian mỗi vòng lặp while và từ đó điều chỉnh FPS cho hợp lý.




  • StartCounter():
void GameTime::StartCounter()
{
    if (!QueryPerformanceFrequency(&mClockRate))
    {
        return;
    }
    QueryPerformanceCounter(&mStartTime);
    
}


             Hàm này có chức năng như lấy thời gian lúc đấy với thời gian có thể đo được bằng micro                     second. Và được đặt đầu mỗi vòng lặp while để lấy thời gian lúc đó.

  • GetCounter():
float GameTime::GetCouter()
{
    QueryPerformanceCounter(&mEndTime);
    mDelta.QuadPart = mEndTime.QuadPart - mStartTime.QuadPart;
    return ((float)mDelta.QuadPart / mClockRate.QuadPart);
}


             Hàm này sẽ lấy thời gian lúc gọi hàm so với lúc gọi hàm StartCounter().

4. GameLoop

- Để tạo vòng lặp game mình sẽ tạo 1 class Game để dễ quản lý.

- Hàm InitLoop() đây là hàm được sử dụng để tạo vòng lặp game và được gọi khi khởi tạo đối tượng Game. Bắt đầu mỗi vòng While mình sẽ chạy hàm StartCounter() lấy thời gian lúc đó.

- Mình có khai báo biến float delta = 0, delta này sẽ chứa tổng thời gian thực hiện của những vòng while, vì máy tính ko phải lúc nào cũng ổn định lúc nó sung như trai 20 thì có khi thực hiện while rất nhanh hơn khi nó lag như trâu về già thì lại thực hiện chậm vkl, cho nên lâu lâu có hiện tượng gọi là “tụt FPS” giống như tụt huyết áp đối với game thủ lúc đang chơi game vậy. Biến delta này sẽ được cộng vào nhờ hàm của class GameTime mình đã giải thích phía trên và bạn xem code đễ thấy rõ.
- Còn biến float tickPerFrame = 1.0f / mFPS đây là delta time chuẩn khi game đạt đúng FPS mà bạn đặt (mình set ở đây là 60 FPS) thì 60 FPS thì tương đương với 1/60 s sẽ update và render 1 lần. giống như trong 1 / 60s thì bạn sẽ lật được 1 tấm ảnh trong xấp ảnh.

- Khi delta >= tickPerFrame tức là lúc này vòng whilte đã chạy thời gian lâu hơn hoặc bằng FPS mà mình yêu cầu thì mình sẽ thực hiện update game và render game lên màn hình. Sau đó lại set delta về lại 0 và cứ như vậy lặp đi lặp cmn lại.

- Khi delta < tickperFrame tức là FPS cao hơn lúc bình thường, như bạn chơi game đôi khi sắm 1 con máy khủng vkl với card GTX 1080 với hệ thống tản nhiệt Nitơ bá vl cùng với những con chip core 7 thế hệ mới, SSD cả TB nhưng mà game low setting vẫn chỉ được 60 FPS mà mất thằng ngựa khác máy cùi hơn lại lên được 120 FPS thì ở đây game đã được cố định frame như thế này. Khi FPS cao hơn bình thường thì mình sẽ tạm sleep lại bằng khoảng thời gian nó nhanh hơn, sau đó sẽ update và render tiếp.

Tổng Kết


Trên là sơ lược về việc cài đặt vòng lặp game cũng khá là đơn giản chỉ làm sao để có thể cho nó ổn cmn định ở FPS mình đặt ra (ở đây là 60 shot/s). Các bạn xem thêm sources code và đọc lại nếu chưa hiểu thì đọc tầm 2 – n lần cho chắc :v .
Share on Google Plus

About Lộc Thọ

This is a short description in the author block about the author. You edit it by entering text in the "Biographical Info" field in the user admin panel.
    Blogger Comment
    Facebook Comment

0 Comment:

Post a Comment