วันอาทิตย์ที่ 23 มีนาคม พ.ศ. 2557

Time.deltaTime เอาไว้ทำอะไร?

เจาะลึกความหมายและที่มาของค่า Time.deltaTime และวิธีการใช้งานเบื้องต้น
เพื่อใช้แก้ไขปัญหาเฟรมเรต (fps) ไม่คงที่ในแต่ละเครื่อง






delta = ค่าความแตกต่าง  time  = เวลา

Time.deltaTime คือ
เวลาที่ใช้ในการเรนเดอร์ในแต่ละเฟรม โดยการเปรียบเทียบเวลาจากการเรียกฟังชั่น Update ของเฟรมก่อนหน้ากับเฟรมปัจจุบัน


Time.deltaTime ถูกสร้างขึ้นมาเพื่อใช้ในการแก้ปัญหา fps (Frame rate Per Second) ไม่คงที่ เพราะ fps มีผลต่อความถี่ในการอ่านคำสั่งที่อยู่ในฟังชั่น Update() ยิ่งคอมแรง เกมไม่หนักเครื่องแค่ไหนก็จะยิ่งมี fps สูง
ถ้าเราสั่งให้วัตถุขยับไปข้างหน้า 0.05 หน่วย ใน Update()
  • ในเครื่องที่เล่นด้วย 20 fps วัตถุจะขยับไปแค่ 1 หน่วย
  • ในเครื่องที่เล่นด้วย 100 fps วัตถุจะขยับไปถึง 5 หน่วย
จากปัญหาข้างต้น Time.deltaTime จึงถูกคิดค้นขึ้นมาตามหลักทฤษฎีฟิสิกส์สัมพันธภาพของไอน์สไตน์(#โม้ๆๆ...)

ค่าของ Time.deltaTime จะเปลี่ยนไปตาม fps ทำให้ deltaTime ในแต่ละเฟรมนั้นอาจจะไม่เท่ากันเนื่องจาก fps มักจะไม่คงที่ ขึ้นอยู่กับปริมาณของการคำณวนและการวาดกราฟฟิกในแต่ละเฟรม และความเร็วของคอมว่าแรงแค่ไหน
deltaTime = 1/fps หรือคือ deltaTime*fps = 1    สมมุติว่ามี fps = 20 ค่า deltaTime จะเท่ากับ 1/20 = 0.05


-----------------------  How to Use?  ----------------------------

1.ใช้นับเวลา
ตั้งตัวแปร float สำหรับจับเวลาให้มีค่าเริ่มต้นเป็น 0
สั่ง float += Time.deltaTime ใน Update()
ทีนี้ค่าในตัวแปรจะเป็นเวลาที่เราจับ

2.นำมาใช้กับ Translate() Rotate() AddForce() เพื่อให้การเคลื่อนที่สมำ่เสมอ
  • ถ้าเราใช้คำสั่งเหล่านี้ตามปกติโดยไม่ใช้ Time.deltaTime จะเกิดปัญหาที่ว่าการเคลื่อนที่จะไม่คงที่  
  • ทำไมล่ะ? เพราะว่า fps ของเเต่ละเวลามันไม่เท่ากัน 
  • วิธีแก้ปัญหาที่นิยมใช้กันคือ เอา Time.deltaTime มาคูณ จะเป็น Translate(Vector3.forward*1*Time.deltaTime); //1 เมตรต่อวินาที
  • ถ้า 2 ช่วงที่ fps ไม่เท่ากัน
  • ตอนแรก 30 fps ค่า deltaTime = 1/20= 0.05 ผ่านไปหนึ่งวินาทีขยับ 0.05*20 = 1 เมตร
  • ต่อจากนั้น 15 fps ค่า deltaTime = 1/10= 0.10 ผ่านไปหนึ่งวินาทีขยับ 0.10*10 = 1 เมตร เท่าเดิมเย้ \@/
------------------------------E--N--D-------------------------

http://docs.unity3d.com/Documentation/ScriptReference/Time-deltaTime.html