한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

คู่มือเกมแลค › 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 วินาที) คือเพดานการไล่ตาม ถ้าเฟรมหนึ่งยาวกว่านี้ เวลาส่วนที่เกินจะถูกทิ้ง นาฬิกาเกมจึงช้ากว่าความจริงไปเท่านั้น

แหล่งอ้างอิง

  1. Set fixed timestep to optimize physics simulation frequency Unity
    ค่าเริ่มต้นของ Fixed Timestep คือ 0.02 วินาที (50 ครั้งใน 1 วินาที) ถ้าเฟรมยาว ต้องรัน physics step หลายครั้งในเฟรมเดียว ภาระจึงเพิ่มขึ้น
  2. Handling variation in time Unity
    ค่าเริ่มต้นของ Maximum Allowed Timestep คือ 1/3 วินาที (0.3333333) ต่อให้หยุดไป 1 วินาที เวลาในเกมก็เดินไปแค่ 0.333 วินาที เป็นเพดานที่กันวงจรที่ step สำหรับไล่ตามทำให้ช้าลงไปอีก
  3. Profiler markers reference Unity
    FixedBehaviourUpdate: ช่วงที่ MonoBehaviour.FixedUpdate ทำงาน, marker ของฟิสิกส์ถูกเรียกในขั้น FixedUpdate

สาเหตุที่ควรดูประกอบ

ชั้นเดียวกัน: L1 โปรเซสเกมฝั่งไคลเอนต์

สาเหตุจากชั้นอื่นที่ทำให้เกิดอาการเดียวกัน (กระตุก)

ดูการ์ดในฉบับหลักที่มีภาพและการทดลอง