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

คู่มือเกมแลค › 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 หรือเมตริกจากเซิร์ฟเวอร์/ไคลเอนต์เกม

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

  1. Introduction to prediction (Netcode for Entities 6.5) Unity
    ไคลเอนต์และเซิร์ฟเวอร์ใช้โค้ดจำลองชุดเดียวกันในการทำ prediction ถ้าต่างจากสถานะบนเซิร์ฟเวอร์ (prediction ผิด) จะย้อนกลับไปคำนวณใหม่และเห็นการแก้ตำแหน่ง
  2. Use the command stream to handle user inputs (Netcode for Entities 6.5) Unity
    เพื่อรับมือแพ็กเก็ตหาย จะส่งอินพุตของไม่กี่ทิกก่อนหน้าซ้ำไปพร้อมอินพุตล่าสุด
  3. Understanding Networked Movement in the Character Movement Component for Unreal Engine Epic Games
    ไคลเอนต์ขยับก่อนแล้วเซิร์ฟเวอร์จำลองการเคลื่อนที่เดียวกันซ้ำ ถ้าตำแหน่งต่างกันจะแก้ด้วย ClientAdjustPosition แล้วนำการเคลื่อนที่ที่บันทึกไว้มาใช้ใหม่

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

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

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

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