คู่มือเกมแลค › L1 โปรเซสเกมฝั่งไคลเอนต์
client-side prediction ไม่ตรงกับเซิร์ฟเวอร์ Prediction mismatch / reconciliation
ID สาเหตุ cg-predict · ผู้รับผิดชอบหลัก พัฒนาไคลเอนต์ (ทีมพัฒนาเกม) · ร่วมกับ พัฒนาเซิร์ฟเวอร์ (ทีมพัฒนาเกม)
เปิดการ์ดในฉบับหลักที่มีภาพและการทดลอง →
ไคลเอนต์ของเราแสดงการเคลื่อนที่ไปก่อน แต่ถ้าเซิร์ฟเวอร์คำนวณออกมาต่างกัน ตัวละครของเราจะโดนดึงกลับ
ทำไม ไคลเอนต์ขยับไปก่อนที่เซิร์ฟเวอร์จะยืนยัน (prediction) → ผลคือ เซิร์ฟเวอร์คำนวณการชน, ความเร็วการเคลื่อนที่ หรือบัฟต่างออกไป หรือไม่ได้รับคำสั่ง → บนหน้าจอ พอผลยืนยันมาถึง ตัวละครของเราโดนดึงถอยหลัง
- อาการ
- ดีดกลับ
- ปัจจัย
- แพ็กเก็ตหาย, ความหน่วง
- ใครเจอ
- เราคนเดียว
- เกิดเมื่อไร
- ระหว่างเดินทาง/ย้ายแมพ, สุ่มเป็นครั้งคราว
- ผู้รับผิดชอบ
- ผู้รับผิดชอบหลัก พัฒนาไคลเอนต์ (ทีมพัฒนาเกม) · ร่วมกับ พัฒนาเซิร์ฟเวอร์ (ทีมพัฒนาเกม)
- งานฝั่งทีมพัฒนาเกม
- ไคลเอนต์: ใช้โค้ดการเคลื่อนที่ชุดเดียวกับเซิร์ฟเวอร์, ส่งอินพุตซ้ำ, แก้ตำแหน่งอย่างนุ่มนวล เซิร์ฟเวอร์: ใช้โค้ดการเคลื่อนที่ชุดเดียวกับไคลเอนต์, กรองอินพุตที่มาซ้ำด้วยหมายเลขอินพุตแล้วประมวลผลครั้งเดียว
- ตัวเลขที่ควรรู้
- ระยะที่โดนดึงคือ “เวลาที่คลาดกัน × ความเร็วการเคลื่อนที่” แค่คำสั่งหายไปไม่กี่อันก็ 1–3 เมตร
- บนกราฟ
- พุ่งแบบสุ่มเป็นครั้งคราว · จำนวนครั้งที่เซิร์ฟเวอร์แก้ตำแหน่ง (prediction ผิด)
- จุดที่ต้องดู
- บันทึกจำนวนครั้งและระยะที่เซิร์ฟเวอร์ส่งมาแก้ตำแหน่ง Unreal ดูการแก้ด้วย ClientAdjustPosition ของเซิร์ฟเวอร์ ส่วน Unity Netcode for Entities นับจำนวนครั้งที่ย้อนกลับไปคำนวณใหม่เพราะ prediction ผิด
- สัญญาณว่าใช่
- การแก้ตำแหน่งกระจุกตรงเวลาที่มีคนแจ้งอาการดีดกลับ และระยะแก้ตำแหน่งใหญ่ซ้ำ ๆ กับบัฟ, ภูมิประเทศ หรือสกิลเคลื่อนที่บางอย่าง
- สัญญาณว่าไม่ใช่
- การแก้ตำแหน่งกระจุกเฉพาะตอนแพ็กเก็ตหายมาก: น่าจะเป็นแพ็กเก็ตอินพุตหาย (ฝั่งเน็ต) ถ้าไม่มีการแก้ตำแหน่ง แต่เห็นแค่ตัวละครอื่นโดนดึง น่าจะเป็น “extrapolation มากเกินไป (dead reckoning)”
- วิธีตรวจ
- ต้องมี log หรือเมตริกจากเซิร์ฟเวอร์/ไคลเอนต์เกม
แหล่งอ้างอิง
- Introduction to prediction (Netcode for Entities 6.5) Unity
ไคลเอนต์และเซิร์ฟเวอร์ใช้โค้ดจำลองชุดเดียวกันในการทำ prediction ถ้าต่างจากสถานะบนเซิร์ฟเวอร์ (prediction ผิด) จะย้อนกลับไปคำนวณใหม่และเห็นการแก้ตำแหน่ง - Use the command stream to handle user inputs (Netcode for Entities 6.5) Unity
เพื่อรับมือแพ็กเก็ตหาย จะส่งอินพุตของไม่กี่ทิกก่อนหน้าซ้ำไปพร้อมอินพุตล่าสุด - Understanding Networked Movement in the Character Movement Component for Unreal Engine Epic Games
ไคลเอนต์ขยับก่อนแล้วเซิร์ฟเวอร์จำลองการเคลื่อนที่เดียวกันซ้ำ ถ้าตำแหน่งต่างกันจะแก้ด้วย ClientAdjustPosition แล้วนำการเคลื่อนที่ที่บันทึกไว้มาใช้ใหม่
สาเหตุที่ควรดูประกอบ
ชั้นเดียวกัน: L1 โปรเซสเกมฝั่งไคลเอนต์
สาเหตุจากชั้นอื่นที่ทำให้เกิดอาการเดียวกัน (ดีดกลับ)
ดูการ์ดในฉบับหลักที่มีภาพและการทดลอง