วันศุกร์ที่ 5 กุมภาพันธ์ พ.ศ. 2559

Delta-time and framerate independence

Framerate independent games คือ เกมที่ทำงานด้วยความเร็วที่เท่ากัน โดยไม่ยึดติดกับอัตราเร็วของเฟรม  เช่น เกมที่สร้างอาจจะมีความเร็ว 30 fps (Frames Per Second) เมื่อทำงานบนเครื่องคอมพิวเตอร์ที่ช้า และอาจมีความเร็ว 60 fps เมื่อทำงานบนเครื่องคอมพิวเตอร์ที่เร็วกว่า เป็นต้น framerate independent games จะประมวลผลให้ความเร็วของเกมเท่ากันเมื่อทำงานบนคอมพิวเตอร์ทั้งสองเครื่อง ความเร็วของวัตถุต่าง ๆ ในเกม จะเคลื่อนที่ด้วยความเร็วที่เท่ากัน หากไม่ใช้หลักการนี้ เมื่อเกมทำงานบนเครื่องที่มีความเร็วต่ำกว่า จะเหมือนกับการแสดงภาพแบบช้า (slow-motion effect) การสร้าง framerate independent games มีความสำคัญมากต่อผู้เล่น ที่จะทำให้เล่นเกมด้วยความสนุกและเล่นได้ทุกคน โดยไม่ต้องกังวลว่าจะเล่นบนคอมพิวเตอร์แบบไหนได้บ้าง เกมจะปรับเปลี่ยนความเร็วไปตามความเร็วของเครื่องคอมพิวเตอร์ที่ใช้งาน

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 ว่าถูกต้องหรือไม่

ไม่มีความคิดเห็น:

แสดงความคิดเห็น