Search…

Tìm Hiểu về Game Loop - Vòng Lặp Game

Ngô Đình DũNgô Đình
27/09/20203 min read
Game loop là 1 vòng lắp được lặp đi lặp lại liên tục, giữ cho game vận hành không ngừng trước khi nhận được thông điệp thoát từ người chơi.

Game loop hay vòng lặp game là gì?

Thành phần chính của game loop là 1 vòng lặp. Những thay đổi của game sẽ được cập nhật rồi vẽ lại trong mỗi lần lặp.

Game loop được xem như thành phần "trái tim" của game. Nắm rõ được cấu trúc của game loop có thể xây dựng cấu trúc code tốt hơn, xử lý các vấn đề phát sinh khi code.

Thử xem xét 1 game loop sơ khai như bên dưới:

init();

while(true) {
    update();     draw(); }

Chức năng của đoạn code này ban đầu sẽ gọi hàm khởi tạo init() sau đó vào vòng lặp, mỗi lần lặp sẽ gọi hàm update() để cập nhật các thông tin và gọi hàm draw() để vẽ lại.

Trong trường hợp này, game loop được thể hiện là những gì được viết với vòng lặp while.

Với vòng lặp này thì các hàm update()draw() sẽ được gọi nhanh nhất có thể. Nhược điểm lớn nhất là không quản lý được số lần lặp trên 1 giây, vì vậy nó ít được dùng trong thực tế.

Thử cải tiến để được 10 lần lặp trên 1 giây:

while(true){
	update();
	draw();
	Sleep(100);
}

Nhưng như vậy thì thời gian mỗi lần lặp sẽ phụ thuộc vào 2 hàm update(), draw() vì hàm thực thi có lúc nhanh lúc chậm khác nhau. Tiếp tục cải tiến:

while(true) {
	clock_t time_start=0;
	double time_ellapse = 0;
	time_start = clock();
update(); draw();
time_ellapse = double(clock() - time_start) * 1000 / CLOCKS_PER_SEC; Sleep(100 - time_ellapse); }

Số lần lặp sẽ không phụ thuộc vào 2 hàm update()draw(), 0.1s/(lần lặp), vì thời gian sleep đã trừ đi thời gian thực thi của 2 hàm này.

Tuy vẫn còn chưa hoàn chỉnh như chưa xử lý khi thời gian thực thi 2 hàm lớn hơn 0.1s do xử lý sẽ có lúc chậm dẫn đến update hoặc draw chậm, trường hợp đó game sẽ giật (lag), cần nhiều kỹ thuật hơn để tối ưu hóa thực thi của update()draw().

Hiểu được game loop sẽ giúp ích gì?

Theo dõi quá trình hiện thực game loop từ đơn sơ đến cải tiến ở trên, có 1 số vấn đề cần rút ra:

  • Cân nhắc khối lượng tính toán hàm update(), nếu hàm này quá cồng kềnh sẽ dẫn đến hiệu suất chung của game giảm như giật.
  • Biết được nên xử lý những tính toán nặng như tải ảnh, phân bổ tại thời điểm nào cho phù hợp. Ví dụ khởi tạo sprite, label, background, hiệu ứng, game logic hay trạng thái của game thì thêm khi nào, kiểm tra và quản lý ra sao.

Về công nghệ

Có những công nghệ cao như Unity hoặc Cocos2d-x, tất cả bao gồm Game Loop đã được ẩn giấu, kiến trúc của các engine này đã xây dựng thành các component nhưng hiểu được game loop giúp tối ưu hơn quá trình lập trình.

Bài chung series

IO Stream

IO Stream Co., Ltd

developer@iostream.co
383/1 Quang Trung, ward 10, Go Vap district, Ho Chi Minh city
Business license number: 0311563559 issued by the Department of Planning and Investment of Ho Chi Minh City on February 23, 2012

©IO Stream, 2013 - 2024