ลูปเกมควรเป็นไปตามขั้นตอนเวลาคงที่หรือแปรผันหรือไม่? เป็นหนึ่งที่เหนือกว่าเสมอหรือตัวเลือกที่เหมาะสมแตกต่างกันไปตามเกม?
ขั้นตอนเวลาผันแปร
การอัปเดตทางฟิสิกส์จะถูกส่งผ่านอาร์กิวเมนต์ "เวลาที่ผ่านไปนับตั้งแต่การอัปเดตครั้งล่าสุด" และขึ้นอยู่กับอัตราเฟรม position += distancePerSecond * timeElapsed
ซึ่งอาจหมายถึงทำคำนวณเป็น
จุดเด่น : ราบรื่นและง่ายต่อการเขียนโค้ดจุด
ด้อย : ไม่สามารถกำหนดค่าได้คาดเดาไม่ได้ในขั้นตอนเล็กหรือใหญ่
ตัวอย่างdeWiTTERS :
while( game_is_running ) {
prev_frame_tick = curr_frame_tick;
curr_frame_tick = GetTickCount();
update( curr_frame_tick - prev_frame_tick );
render();
}
ขั้นตอนเวลาคงที่
การอัปเดตอาจไม่ยอมรับ "เวลาที่ผ่านไป" เนื่องจากจะถือว่าการอัปเดตแต่ละรายการเป็นช่วงเวลาที่แน่นอน การคำนวณอาจทำได้position += distancePerUpdate
ดังนี้ ตัวอย่างมีการแก้ไขระหว่างการเรนเดอร์
จุดเด่น : สามารถคาดการณ์ได้กำหนดขึ้น (ซิงค์เครือข่ายง่ายกว่า) รหัสการคำนวณที่ชัดเจนจุด
ด้อย : ไม่ซิงค์กับการตรวจสอบ v-sync (ทำให้เกิดภาพกราฟิกที่กระวนกระวายใจเว้นแต่ว่าคุณจะแก้ไข) อัตราเฟรมสูงสุดที่ จำกัด สมมติขั้นตอนเวลาที่ผันแปร (เช่นPygletหรือFlixel )
ตัวอย่าง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 );
}
ทรัพยากรบางอย่าง
- Gaffer ในเกม: แก้ไขการประทับเวลาของคุณ!
- บทความวนรอบของเกมของ deWitter
- FPS ของ Quake 3 มีผลต่อการกระโดดของฟิสิกส์หรือไม่ - เหตุผลที่ชัดเจนคือDoom 3ถูกล็อคเฟรมไว้ที่ 60fps?
- Flixel ต้องการการประทับเวลาที่เปลี่ยนแปลงได้ (ฉันคิดว่านี่ถูกกำหนดโดย Flash) ในขณะที่Flashpunkอนุญาตให้ใช้ทั้งสองประเภท
- คู่มือของ Box2D § จำลองโลกแห่ง Box2Dแนะนำว่าใช้ขั้นตอนเวลาคงที่