The dt system expression
หลักสำคัญของการสร้าง framerate independence คือการใช้ตัวแปร dt ซึ่งย่อมาจาก Delta-time ซึ่งเป็นการเปลี่ยนแปลงในปริมาณที่น้อยมาก ในเสี้ยววินาที ยกตัวอย่างเช่น ที่ความเร็ว 100 fps ค่า dt จะเป็น 0.01 (หนึ่งร้อยวินาที) และที่ความเร็ว 10 fps ค่า dt จะเป็น 0.1 (10 วินาที) ในทางปฏิบัติ ค่า dt นั้นจะเปลี่ยนไปตามช่วงเวลาที่มีการทำงานของเกม ดังนั้น ตลอดช่วงเวลาของเกม ค่า dt นั้นจะเปลี่ยนแปลงไปอยู่เสมอ
ข้อสังเกต ถ้าหากเราเพิ่มค่า dt ให้กับตัวแปรทุกรอบสัญญาณนาฬิกา คือการเพิ่มทีละ 1 ทุกวินาที เพราะว่าช่วงเวลาของสัญญาณนาฬิกาจะอยู่ในช่วง 1 วินาที สามารถศึกษาตัวอย่างของการใช้ค่า dt ได้จากไฟล์เกมต่อไปนี้ คลิกเพื่อดาวน์โหลด
How to use dt
โดยทั่วไป การเคลื่อนไหวจะขึ้นอยู่กับอัตราของ framerate การเคลื่อนที่ในทุกรอบของสัญญาณนาฬิกา (1 รอบต่อ 1 เฟรม)
วัตถุจะเคลื่อนที่ไปทางขวา 1 pixel ถ้ากำหนดให้ 30 fps หมายความว่า เคลื่อนที่ 30 pixel ต่อวินาที และถ้ากำหนดให้ 60 fps หมายความว่า เคลื่อนที่ 60 pixel ต่อวินาที จะเห็นว่า ความเร็วของวัตถุมีความแตกต่างกันใน 1 วินาที ความเร็วที่ต่างกันนี้ขึ้นอยู่กับอัตราเร็วของเฟรมที่กำหนด
การเคลื่อนที่แบบอิสระโดยไม่ขึ้นกับ framerate วัตถุจะเคลื่อนที่ไปทางขวา 60 pixel ต่อวินาที ในทุกอัตราเร็วของเฟรม ในการกำหนดค่า dt เป็น 1 จะถูกเพิ่มขึ้น 1 ในทุกวินาที
ถ้ากำหนด 60 * dt คือการเพิ่มขึ้น 60 ในทุกวินาที ดังนั้น ไม่ว่าจะกำหนดความเร็วของเฟรมเป็น 30 fps หรือ 60 fps วัตถุก็จะเคลื่อนที่ไปทางขวาด้วยความเร็ว 60 pixel ต่อวินาทีเท่าเดิม
ในการสั่งให้วัตถุเคลื่อนที่ด้วยความเร็วคงที่ จำเป็นต้องใช้ dt ในการกำหนดค่าความเร็วในการเคลื่อนที่ เพื่อให้วัตถุเคลื่อนที่ได้อย่างอิสระ โดยไม่ขึ้นกับอัตราเร็วของเฟรม สมมุติว่าเราสั่งให้วัตถุเคลื่อนที่ไปด้านหน้า ควรใช้คำสั่ง 60 * dt ในการเคลื่อนที่วัตถุไป 60 pixel ต่อวินาที ในมุมและทิศทางเดิม
การทำงานของค่า dt จะถูกฝังตัวอยู่ในทุกพฤติกรรมของ construct 2 ดังนั้น ผู้พัฒนาเกมสามารถเรียกใช้งานได้ โดยไม่ต้องกำหนดค่าใด ๆ เพิ่มเติม สามารถเรียกใช้งานได้ทันที ยกเว้นเพียงแค่พฤติกรรมแบบ Physics โดยปกตินั้น จะไม่สามารถเรียกใช้งาน dt ได้ทันที ด้วยเหตุที่ว่า ค่า dt จะเกิดจากการสุ่มค่าที่มีการเปลี่ยนแปลงเล็กน้อย เมื่อสั่งเกมทำงานในลักษณะของการแสดงพฤติกรรมแบบ Physics ในแต่ละครั้งจะให้ผลการทำงานที่แตกต่างกันออกไป จึงนิยมใช้การเคลื่อนที่แบบยึดติดกับอัตราเร็วของเฟรม เพื่อให้การทำงานได้ผลเช่นเดียวกันทุกครั้ง แต่หากต้องการใช้งานค่า dt สามารถทำได้โดย การกำหนดค่า Set stepping mode จาก fixed เป็น Framerate independent
ถึงแม้ว่าจะใช้อัตราเร็วของเฟรมแบบอิสระ แต่ก็ยังคงยึดอัตราของเวลา โดยประมาณ คือ 30 มิลลิวินาที เพราะถ้าหากปล่อยอัตราของเวลาให้สูงเกินไป จะทำให้การเคลื่อนที่แบบ physics มีความคลาดเคลื่อนไปจากความจริงมากเกินไป อาจทำให้เกิดความไม่แน่นอนในการจำลองทาง physics
Timescaling
คุณสมบัติที่น่าสนใจอีกอย่างหนึ่งของ construct 2 คือ timescaling คุณสมบัตินี้จะทำให้ผู้สร้างเกมสามารถเปลี่ยนอัตราของเวลาภายในเกมได้ เรียกว่า time scale การกำหนดค่าของ time scale หากกำหนดเป็น 1 จะเป็นค่าความเร็วพื้นฐาน ถ้ากำหนดเป็น 0.5 ความเร็วจะลดลงครึ่งหนึ่ง และถ้ากำหนดเป็น 2 ความเร็วจะเพิ่มขึ้นเป็นสองเท่า ถ้ากำหนดเป็น 0.1 เวลาก็จะช้าลง 10 เท่า แต่ก็ยังมีความต่อเนื่อง ซึ่งสามารถนำไปใช้กับการสร้างภาพช้า slow-motion ได้เป็นอย่างดี
การทำงานของ timescaling จะเปลี่ยนแปลงค่าจากตัวแปร dt ดังนั้น ถ้าผู้สร้างเกมไม่ได้ใช้ค่า dt ในการคำนวณการเคลื่อนที่ จะส่งผลให้ไม่สามารถใช้คุณสมบัติของ time scale ได้ แต่ถ้าเราใช้ time scaling จะส่งผลให้เปิดใช้งานตัวแปร dt ในการเคลื่อนที่ทั้งหมด
Pausing
การหยุดเกม ผู้สร้างเกมสามารถจะกำหนดค่า time scale เป็น 0 ซึ่งเป็นวิธีการที่ง่ายมาก และกำหนดให้มีค่าเป็น 1 เพื่อให้เกมกลับมาเล่นต่อไป อีกทั้งยังสามารถกำหนดกลุ่มของเหตุการณ์ที่จะให้หยุดและดำเนินการต่อไปได้ เช่น การยิงกระสุนในเกม และวิธีการกำหนด time scale เป็น 0 ยังเป็นการทดสอบการทำงานของตัวแปร dt ถ้ากำหนดได้ถูกต้อง วัตถุในเกมจะต้องหยุดนิ่งทั้งหมด แต่ถ้าหากยังมีวัตถุบางชิ้นเคลื่อนไหว ต้องตรวจสอบการใช้ตัวแปร dt ว่าถูกต้องหรือไม่
ไม่มีความคิดเห็น:
แสดงความคิดเห็น