STDIO
Tìm kiếm gần đây
    Nội dung
    0
    0
    Chia sẻ
    Nội dung
    0
    0
    Chia sẻ

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

    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.
    05/03/2016 27/09/2020 3 phút đọc
    Tìm Hiểu về Game Loop - Vòng Lặp Game

    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

    0 Bình luận
    Lập Trình Game

    Lập Trình Game

    Kiến thức, kỹ thuật, kinh nghiệm lập trình game.

    Khi bạn nhấn vào sản phẩm do chúng tôi đề xuất và mua hàng, chúng tôi sẽ nhận được hoa hồng. Điều này hỗ trợ chúng tôi có thêm kinh phí tạo nhiều nội dung hữu ích. Tìm hiểu thêm.
    STDIO

    Trang chính

    Công ty TNHH STDIO

    • 30, Trịnh Đình Thảo, Hòa Thạnh, Tân Phú, Hồ Chí Minh
      +84 28.36205514 - +84 942.111912
      developer@stdio.vn
    • 383/1 Quang Trung, Phường 10, Quận Gò Vấp, Hồ Chí Minh
      Số giấy phép ĐKKD: 0311563559 do sở Kế hoạch và Đầu Tư TPHCM cấp ngày 23/02/2012
    ©STDIO, 2013 - 2021