Update Vs. FixedUpdate

ace-update-stamp

สวัสดีครับ วันนี้ผมจะขอเอาความรู้ดีๆที่อยู่ใกล้ๆตัวเพื่อนๆมาฝากกันซักหน่อยนะครับ นั่นก็คือความรู้เกี่ยวกับเรื่องของการ Update และ FixedUpdate ครับ

เพื่อนๆทุกคนน่าจะเคยใช้ฟังชั่นก์ Update กันมาอยู่แล้วนะครับ และหลายๆคนก็น่าจะเคยใช้ FixedUpdate มาเช่นเดียวกัน แต่น่าจะมีหลายๆคนที่ไม่รู้ว่า 2 ฟังชั่นก์นี้แตกต่างกันอย่างไรนะครับ วันนี้ผมก็เลยจะเอาข้อแตกต่าง รวมถึงการนำสองฟังชั่นก์นี้ไปใช้ ว่าฟังชั่นก์ไหนสำหรับงานประเภทไหน เพื่อให้การเขียนเกมของเราถูกต้องครับมาเริ่มกันเลยครับ

Update

เป็นฟังชั่นก์ที่จะทำงานทุกๆเฟรมครับ ในการเขียนเกมด้วย Unity เนี่ย ภาพเกมของเราจะถูก Render มาทีละเฟรม โดยยิ่งจำนวนเฟรมต่อวินาทีมากเท่าไหร่ ก็จะยิ่งทำให้เกมเราดู Smooth หรือเนียนตามมากขึ้นเท่านั้นครับ โดยเกมในยุคปัจจุบันจะนิยมทำให้ FPS หรือ จำนวนเฟรมต่อวินาที ให้ได้ใกล้เคียงกับค่า 60 มากที่สุดครับ ซึ่งค่านี้ถ้าหากเกมของเรามีจังหวะที่มี Object เยอะๆ หรือช่วงที่มี Particle เยอะๆ ค่านี้ก็จะลดลง การทำงานในฟังชั่นก์ Update ก็จะน้อยลงตามไปด้วย นั่นหมายความว่า หากเราใส่คำสั่งแสดงผลไว้ในฟังชั่นก์นี้ ความเร็วในการทำงานในแต่ละเครื่องก็จะไม่เท่ากันครับ ขึ้นอยู่กับ Hardware ของผู้เล่นคนนั้นๆครับ

FixedUpdate

ฟังชั่นก์นี้จะทำงานคล้าย Update แต่จะแตกต่างกันที่ FixedUpdate จะทำงานเป็นช่วงเวลา หมายความว่า ไม่ว่าเครื่องจะทำงานเร็วหรือช้ายังไง เครื่องก็จะพยายามรักษาการอัพเดตใน FixedUpdate ไว้ตามเวลาที่กำหนด โดยปกติแล้วค่าจะถูกตั้งไว้ที่ 0.02 วินาที

มาลองดูตัวอย่างสคริปกันครับ

01

จากภาพผมมี GameObject ที่ใส่สคริปไว้แล้วนะครับมาดูสคริปภายในกันครับ

02

ผมมีฟังชั่นอยู่สองฟังชั่นก์ สั่งให้ Debug ค่า Time.deltaTime หรือระยะเวลาจากเฟรมที่แล้วถึงเฟรมปัจจุบันทุกๆเฟรม

มาดูผลลัพธ์กันครับ

03

ข้อสังเกตแรกเลยคือ Update ทำงานถี่กว่า FixedUpdate เมื่อเราตั้งเป็นค่าเริ่มต้นครับ และถ้าเราสังเกตดู จะเห็นว่า FixedUpdate ถูกเรียกให้ทำงานทุกๆ 0.02 วินาที ในขณะที่ Update จะทำงานไม่แน่นอน โดยจะทำงานให้เร็วที่สุดนั่นเอง

จากข้อสังเกตข้างต้นจึงทำให้พอจะสรุปได้ว่า เราควรจะใช้ FixedUpdate ในกรณีที่เราต้องการให้ GameObject หรืออะไรก็ตามเคลื่อนที่ตามเวลาจริง โดยไม่อ้างอิงกับเฟรมของเครื่อง ซึ่งส่วนใหญ่แล้ว เราจะเอาการคำนวณเกี่ยวกับฟิสิกส์มาใส่ในฟังชั่นก์นี้ครับ ส่วน Updated เราสามารถเอาไว้ใส่การจับค่าการกด Keyboard การเล่นอนิเมชั่นที่ไม่จำเป็นจะต้องตรงตามเวลาจริงเป๊ะๆ พวกนี้เป็นต้นครับ

เป็นไงบ้างครับสำหรับทิปในวันนี้ หวังว่าไม่อยากเกินไปนะครับ แล้วพบกันใหม่โอกาสหน้าครับ