คู่มือเกมแลค › L1 โปรเซสเกมฝั่งไคลเอนต์
fixed timestep ไล่ตามไม่ทันจนบานปลาย Fixed-timestep catch-up / spiral of death
ID สาเหตุ cg-fixed-step · ผู้รับผิดชอบหลัก พัฒนาไคลเอนต์ (ทีมพัฒนาเกม)
เปิดการ์ดในฉบับหลักที่มีภาพและการทดลอง →
หลังหยุดไปครั้งหนึ่ง เกมเร่งคำนวณส่วนที่ตามหลังรวดเดียว แล้วการคำนวณนั้นเองก็ทำให้ตามหลังอีก
ทำไม เกมรันการจำลองด้วยช่วงเวลาคงที่ แล้วเกิดหยุดไปครั้งหนึ่ง → ผลคือ คำนวณ step ที่ตามหลังทั้งหมดรวดเดียวในเฟรมเดียว → บนหน้าจอ เฟรมยาวเกิดต่อกันเป็นพรวนจนภาพกระตุก หรือชนเพดานแล้วโลกในเกมช้าลง
- อาการ
- กระตุก, กรอเร็ว, สโลว์โมชั่น
- ปัจจัย
- การหยุดชะงัก
- ใครเจอ
- เราคนเดียว
- เกิดเมื่อไร
- สุ่มเป็นครั้งคราว, ตอนคนแห่มารวมกัน
- ผู้รับผิดชอบ
- ผู้รับผิดชอบหลัก พัฒนาไคลเอนต์ (ทีมพัฒนาเกม)
- งานฝั่งทีมพัฒนาเกม
- จำกัดการไล่ตามต่อเฟรม, จัดการเวลาที่เหลือด้วย interpolation
- บนกราฟ
- พุ่งแบบสุ่มเป็นครั้งคราว · เฟรมไทม์, จำนวน fixed step ต่อเฟรม
- จุดที่ต้องดู
- ดูใน profiler ของ development build ว่าในหนึ่งเฟรม fixed step ทำงานกี่ครั้ง (Unity คือจำนวน marker ของขั้น FixedUpdate เช่น FixedBehaviourUpdate) คู่กับเฟรมไทม์
- สัญญาณว่าใช่
- หลังเฟรมยาวหนึ่งเฟรม มีเฟรมยาวที่รัน step หลายครั้งตามมาเป็นพรวน และเมื่อชนเพดาน (Maximum Allowed Timestep ของ Unity) เวลาในเกมจะเดินช้ากว่าความจริง
- สัญญาณว่าไม่ใช่
- เฟรมยาวเกิดครั้งเดียวแล้วจบ: น่าจะเป็น “เฟรมไทม์พุ่ง” หรือ “GC ฝั่งไคลเอนต์”
- วิธีตรวจ
- ต้องมี log หรือเมตริกจากเซิร์ฟเวอร์/ไคลเอนต์เกม
- รายละเอียดเพิ่มเติม
- การคำนวณฟิสิกส์ของ Unity (FixedUpdate) คือตัวอย่างที่ชัดของ fixed step (ค่าเริ่มต้น 0.02 วินาที หรือ 50 ครั้งใน 1 วินาที) Maximum Allowed Timestep ในการตั้งค่า Time (เวลาสูงสุดที่ไล่ตามได้ในหนึ่งเฟรม ค่าเริ่มต้นราว 0.33 วินาที) คือเพดานการไล่ตาม ถ้าเฟรมหนึ่งยาวกว่านี้ เวลาส่วนที่เกินจะถูกทิ้ง นาฬิกาเกมจึงช้ากว่าความจริงไปเท่านั้น
แหล่งอ้างอิง
- Set fixed timestep to optimize physics simulation frequency Unity
ค่าเริ่มต้นของ Fixed Timestep คือ 0.02 วินาที (50 ครั้งใน 1 วินาที) ถ้าเฟรมยาว ต้องรัน physics step หลายครั้งในเฟรมเดียว ภาระจึงเพิ่มขึ้น - Handling variation in time Unity
ค่าเริ่มต้นของ Maximum Allowed Timestep คือ 1/3 วินาที (0.3333333) ต่อให้หยุดไป 1 วินาที เวลาในเกมก็เดินไปแค่ 0.333 วินาที เป็นเพดานที่กันวงจรที่ step สำหรับไล่ตามทำให้ช้าลงไปอีก - Profiler markers reference Unity
FixedBehaviourUpdate: ช่วงที่ MonoBehaviour.FixedUpdate ทำงาน, marker ของฟิสิกส์ถูกเรียกในขั้น FixedUpdate
สาเหตุที่ควรดูประกอบ
ชั้นเดียวกัน: L1 โปรเซสเกมฝั่งไคลเอนต์
สาเหตุจากชั้นอื่นที่ทำให้เกิดอาการเดียวกัน (กระตุก)
ดูการ์ดในฉบับหลักที่มีภาพและการทดลอง