0
0
Lập trình
Harry Tran
Harry Tran106580903228332612117

🚀 Tăng Tốc Hiệu Suất TCJSgame với requestAnimationFrame

Đăng vào 9 giờ trước

• 4 phút đọc

Chủ đề:

KungFuTech

🚀 Tăng Tốc Hiệu Suất TCJSgame với Mở Rộng Đơn Giản

Bạn có sử dụng TCJSgame v1, v2, hay v3 để phát triển trò chơi 2D bằng JavaScript không?

Mặc định, TCJSgame sử dụng setInterval để chạy vòng lặp trò chơi, điều này hoạt động... nhưng không phải là nhanh nhất.

Trong bài viết này, chúng ta sẽ sử dụng Mở Rộng Hiệu Suất TCJSgame – một tiện ích nhỏ giúp trò chơi của bạn chạy mượt mà, nhanh hơn và nhất quán hơn.


🎯 Những Điều Bạn Sẽ Học

  1. Vấn đề với setInterval trong vòng lặp trò chơi.
  2. Tại sao requestAnimationFrame (rAF) là lựa chọn tốt hơn.
  3. Delta-time (dt) là gì và nó khắc phục tốc độ di chuyển như thế nào.
  4. Cách thêm bộ nhớ đệm tilemapculling đối tượng ngoài màn hình.
  5. Cách cài đặt và sử dụng mở rộng hiệu suất trong các dự án TCJSgame của bạn.

⚡ 1. Vấn Đề

Mặc định, TCJSgame hoạt động như sau:

Copy
this.interval = setInterval(() => this.update(), 20);

Điều này đồng nghĩa:

  • Trò chơi cố gắng chạy mỗi 20ms (~50 FPS).
  • Nếu máy tính của bạn chậm, khung hình sẽ giảm.
  • Nếu màn hình của bạn có tần số 120Hz, trò chơi sẽ trông kém mượt mà hơn.
  • Nó vẫn tiếp tục chạy ngay cả khi tab bị ẩn, gây lãng phí CPU.

⚡ 2. Giải Pháp: requestAnimationFrame

Thay vì setInterval, các trò chơi hiện đại sử dụng:

Copy
requestAnimationFrame(loop);
  • Khớp với tỷ lệ làm mới màn hình của bạn (60Hz, 120Hz, v.v.).
  • Tạm dừng khi tab bị ẩn.
  • Hoạt ảnh mượt mà hơn.

Đó chính là điều mà tiện ích mở rộng của chúng ta tự động thực hiện. ✅

⚡ 3. Delta Time (dt)

Không có delta time, tốc độ của bạn tính theo pixel mỗi khung hình.

  • Tại 60 FPS, 5px/frame = 300px/giây.
  • Tại 120 FPS, cùng một mã chạy nhanh gấp đôi. ❌

Với delta time:

Copy
function update(dt) {
  player.x += 200 * dt; // di chuyển 200 pixel mỗi giây
}

Không quan tâm đến FPS, người chơi luôn di chuyển cùng một khoảng cách mỗi giây. 🎯

⚡ 4. Tối Ưu Hóa Thêm

Tiện ích mở rộng cũng cung cấp cho bạn:

  • Bộ nhớ đệm tilemap → vẽ một lần, sử dụng lại.
  • Culling đối tượng ngoài màn hình → bỏ qua những đối tượng không nhìn thấy.
  • Tạm dừng / Tiếp tục → kiểm soát vòng lặp trò chơi một cách thủ công.

🛠 5. Cài Đặt

Chỉ cần bao gồm file sau TCJSgame trong HTML của bạn:

Copy
<script src="tcjsgame-v3.js"></script>
<script src="https://tcjsgame.vercel.app/mat/tcjsgame-perf.js"></script>

Đơn giản vậy thôi! Tiện ích mở rộng tự động cập nhật TCJSgame.

📝 6. Mã Ví Dụ

Copy
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>TCJSgame + Mở Rộng Hiệu Suất</title>
</head>
<body>
  <script src="tcjsgame-v3.js"></script>
  <script src="https://tcjsgame.vercel.app/mat/tcjsgame-perf.js"></script>
  <script>
    const display = new Display();

    // Kích hoạt các tính năng hiệu suất
    enableTCJSPerf(display, {
      useDelta: true,   // sử dụng delta time
      cacheTiles: true, // bộ nhớ đệm tilemaps
      cullMargin: 32    // bỏ qua các đối tượng ngoài màn hình
    });

    display.start(800, 450);

    // thêm một thành phần
    let player = new Component(50, 50, "red", 100, 100, "rect");
    display.add(player);

    // di chuyển mượt mà với delta time
    function update(dt) {
      if (display.keys[39]) player.x += 200 * dt; // di chuyển sang phải
      if (display.keys[37]) player.x -= 200 * dt; // di chuyển sang trái
    }
  </script>
</body>
</html>

⚙️ 7. Tùy Chọn

Khi gọi enableTCJSPerf(display, options):

Tùy chọn Mặc định Chức năng
useDelta false Thêm dt (thời gian kể từ khung hình trước) vào update() để tốc độ nhất quán.
cacheTiles false Bộ nhớ đệm tilemaps trên một canvas ngoài màn hình.
cullMargin 0 Bỏ qua việc vẽ các đối tượng bên ngoài viewport; lề thêm khoảng đệm.

📊 8. Kết Quả

Tính năng TCJSgame Gốc Với Tiện Ích Mở Rộng
Thời gian vòng lặp trò chơi Cố định 20ms Đồng bộ với tần số làm mới màn hình
Hành vi tab nền Tiếp tục chạy Tự động tạm dừng
Tốc độ di chuyển Pixel mỗi khung hình Pixel mỗi giây (với dt)
Hiệu suất tilemap Vẽ lại mỗi khung hình Được bộ nhớ đệm & sử dụng lại
Vẽ ngoài màn hình Luôn được vẽ Hỗ trợ culling

✅ 9. Tương Thích

  • Hoạt động với v1, v2 và v3.
  • Mã cũ vẫn hoạt động mà không cần thay đổi.
  • Nếu bạn muốn, bạn có thể sử dụng dt mới để di chuyển mượt mà hơn.

🧑‍💻 10. Các Bước Tiếp Theo

  • Thử nghiệm tiện ích mở rộng trong trò chơi hiện tại của bạn.
  • So sánh FPS với và không có nó.
  • Chia sẻ kết quả của bạn với cộng đồng TCJSgame!

🎉 Kết Luận

Với chỉ một file bổ sung, các dự án TCJSgame của bạn trở nên mượt mà, nhanh hơn và hiệu quả hơn.
Bây giờ bạn có thể tập trung vào việc xây dựng trò chơi của mình trong khi tiện ích mở rộng xử lý hiệu suất!

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào