คู่มือเกมแลค › L1 โปรเซสเกมฝั่งไคลเอนต์
เวลาแบบ float สูญเสียความแม่นยำ Float time precision loss on long sessions
ID สาเหตุ cg-float-time · ผู้รับผิดชอบหลัก พัฒนาไคลเอนต์ (ทีมพัฒนาเกม)
เปิดการ์ดในฉบับหลักที่มีภาพและการทดลอง →
ถ้าเก็บเวลาในเกมเป็นทศนิยมความแม่นยำต่ำ (float) ยิ่งเปิดเกมไว้นาน ความละเอียดของเวลา (ผลต่างของเวลาที่เล็กที่สุดที่แยกได้) ก็ยิ่งลดลง การเคลื่อนไหวและเอฟเฟกต์จึงสั่น
ทำไม สะสมเวลาที่ผ่านไปตั้งแต่เปิดเกมเป็น float หรือส่งค่านั้นให้ shader ตรง ๆ → ผลคือ ยิ่งเปิดไว้นาน ผลต่างที่เล็กที่สุดที่ float แสดงได้ก็ยิ่งใหญ่ขึ้น → บนหน้าจอ เฉพาะไคลเอนต์ที่เปิดทิ้งไว้หลายวัน ตัวละคร, แอนิเมชัน และเอฟเฟกต์ที่เคลื่อนไหลสั่นระริก แต่เปิดเกมใหม่แล้วปกติ
- อาการ
- กระตุก
- ปัจจัย
- จิตเตอร์
- ใครเจอ
- เราคนเดียว
- เกิดเมื่อไร
- ยิ่งเปิดไว้นานยิ่งเป็น
- ผู้รับผิดชอบ
- ผู้รับผิดชอบหลัก พัฒนาไคลเอนต์ (ทีมพัฒนาเกม)
- งานฝั่งทีมพัฒนาเกม
- เก็บเวลาที่ผ่านไปเป็น double (64 บิต) หรือจำนวนเต็ม, วนค่าเวลาที่ส่งให้ shader กลับเป็นรอบ, ทดสอบอัตโนมัติแบบรันยาวหลายวัน
- ตัวเลขที่ควรรู้
- float 32 บิตมีเลขนัยสำคัญราว 7 หลัก ถ้าเปิดไว้หนึ่งวัน (ราว 86,400 วินาที) ความละเอียดของเวลาจะเหลือราว 8 ms หรือราวครึ่งเฟรมที่ 60 FPS (16.7 ms) และถ้าเปิดไว้หนึ่งสัปดาห์จะราว 60 ms ซึ่งมากกว่าหนึ่งเฟรม
- บนกราฟ
- ค่อย ๆ สูงขึ้น · การแจ้งอาการสั่นแยกตามระยะเวลาที่เปิดเกมไว้
- จุดที่ต้องดู
- ขอระยะเวลาที่เปิดไคลเอนต์ไว้มาพร้อมการแจ้งอาการสั่น แล้วเทียบก่อนและหลังรีสตาร์ต ฝั่งพัฒนาทดสอบโดยตั้งค่าเวลาเริ่มเกมเป็นค่าที่ผ่านไปแล้วหลายวัน
- สัญญาณว่าใช่
- สั่นเฉพาะไคลเอนต์ที่เปิดไว้หลายวัน รีสตาร์ตแล้วหาย และยิ่งเปิดไว้นานยิ่งหนัก
- สัญญาณว่าไม่ใช่
- สั่นตั้งแต่เพิ่งเปิด: น่าจะเป็น “ไม่มี interpolation buffer หรือสั้นเกินไป” หรือ “ความละเอียดของตัวจับเวลา”
- วิธีตรวจ
- ตรวจที่สภาพแวดล้อมฝั่งผู้เล่น
- รายละเอียดเพิ่มเติม
- เจอบ่อยเป็นพิเศษในเกม MMO มือถือที่ผู้เล่นเปิดออโต้ทิ้งไว้หลายวันโดยไม่ปิด Time.time ของ Unity ก็เป็น float เช่นกัน Unity จึงมี Time.timeAsDouble ที่เป็น double แยกไว้และแนะนำให้ใช้ตัวนี้
แหล่งอ้างอิง
- Time.timeAsDouble Unity
Time.time เวอร์ชัน double ยิ่งเปิดนานยิ่งแม่นยำกว่า float จึงแนะนำให้ใช้ตัวนี้ในกรณีส่วนใหญ่ - Floating-point numeric types (C# reference) Microsoft
ความแม่นยำของ float ราว 6–9 หลัก, double ราว 15–17 หลัก
สาเหตุที่ควรดูประกอบ
ชั้นเดียวกัน: L1 โปรเซสเกมฝั่งไคลเอนต์
สาเหตุจากชั้นอื่นที่ทำให้เกิดอาการเดียวกัน (กระตุก)
ดูการ์ดในฉบับหลักที่มีภาพและการทดลอง