Một vòng lặp trò chơi nên dựa trên các bước thời gian cố định hoặc thay đổi? Là một luôn luôn vượt trội, hoặc sự lựa chọn đúng thay đổi theo trò chơi?
Bước thời gian biến
Các cập nhật vật lý được thông qua một đối số "thời gian trôi qua kể từ lần cập nhật cuối" và do đó phụ thuộc vào tốc độ khung hình. Điều này có thể có nghĩa là làm tính toán như position += distancePerSecond * timeElapsed
.
Ưu điểm : trơn tru, dễ mã hóa
Nhược điểm : không xác định, không dự đoán được ở các bước rất nhỏ hoặc lớn
ví dụ deWiTTERS :
while( game_is_running ) {
prev_frame_tick = curr_frame_tick;
curr_frame_tick = GetTickCount();
update( curr_frame_tick - prev_frame_tick );
render();
}
Bước thời gian cố định
Các bản cập nhật thậm chí có thể không chấp nhận "thời gian đã trôi qua", vì chúng cho rằng mỗi bản cập nhật là trong một khoảng thời gian cố định. Tính toán có thể được thực hiện như position += distancePerUpdate
. Ví dụ bao gồm một phép nội suy trong khi kết xuất.
Ưu điểm : có thể dự đoán, xác định (đồng bộ mạng dễ dàng hơn?), Mã tính toán rõ ràng hơn
Nhược điểm : không được đồng bộ hóa để giám sát v-sync (gây ra đồ họa lộn xộn trừ khi bạn nội suy), tốc độ khung hình tối đa (trừ khi bạn nội suy), khó hoạt động trong các khung mà giả sử các bước thời gian thay đổi (như Pyglet hoặc Flixel )
ví dụ deWiTTERS :
while( game_is_running ) {
while( GetTickCount() > next_game_tick ) {
update();
next_game_tick += SKIP_TICKS;
}
interpolation = float( GetTickCount() + SKIP_TICKS - next_game_tick )
/ float( SKIP_TICKS );
render( interpolation );
}
Một số tài nguyên
- Gaffer trên các trò chơi: Khắc phục dấu thời gian của bạn!
- bài viết vòng lặp trò chơi của deWitter
- FPS của Quake 3 ảnh hưởng đến vật lý nhảy. Thay vào đó, lý do Doom 3 bị khóa khung hình tới 60fps?
- Flixel yêu cầu một dấu thời gian thay đổi (tôi nghĩ rằng điều này được xác định bởi Flash) trong khi Flashpunk cho phép cả hai loại.
- Hướng dẫn sử dụng của Box2D § Mô phỏng Thế giới của Box2D cho thấy nó sử dụng các bước thời gian không đổi.