คู่มือเกมแลค › L1 โปรเซสเกมฝั่งไคลเอนต์
ไม่มี interpolation buffer หรือสั้นเกินไป Missing/short interpolation buffer
ID สาเหตุ cg-no-buffer · ผู้รับผิดชอบหลัก พัฒนาไคลเอนต์ (ทีมพัฒนาเกม) · ร่วมกับ พัฒนาเซิร์ฟเวอร์ (ทีมพัฒนาเกม)
เปิดการ์ดในฉบับหลักที่มีภาพและการทดลอง →
ถ้าวาดทันทีที่ได้รับแพ็กเก็ตจากเซิร์ฟเวอร์ จิตเตอร์ (ช่วงเวลาที่แพ็กเก็ตมาถึงไม่สม่ำเสมอ) จะแสดงออกมาบนจอตรง ๆ
ทำไม วาดตำแหน่งที่ได้รับทันที หรือบัฟเฟอร์สั้นกว่าจิตเตอร์ → ผลคือ หยุดนานเท่าที่แพ็กเก็ตมาช้า และกระโดดไปเท่าที่แพ็กเก็ตมาพร้อมกันหลายอัน → บนหน้าจอ ตัวละครอื่นขยับแบบหยุดแวบเป็นระยะ
- อาการ
- กระตุก
- ปัจจัย
- จิตเตอร์
- ใครเจอ
- เราคนเดียว
- เกิดเมื่อไร
- ตลอดเวลา
- ผู้รับผิดชอบ
- ผู้รับผิดชอบหลัก พัฒนาไคลเอนต์ (ทีมพัฒนาเกม) · ร่วมกับ พัฒนาเซิร์ฟเวอร์ (ทีมพัฒนาเกม)
- งานฝั่งทีมพัฒนาเกม
- ไคลเอนต์: มี interpolation buffer, ปรับความยาวบัฟเฟอร์อัตโนมัติตามสภาพเน็ต เซิร์ฟเวอร์: ใช้ lag compensation (ตัดสินผลด้วยการย้อนเวลา) เพื่อให้ตัดสินได้ถูกต้องแม้ผู้เล่นจะยิงโดยดูภาพในอดีตย้อนหลังไปเท่าความยาวบัฟเฟอร์
- ตัวเลขที่ควรรู้
- ปกติจะตั้งบัฟเฟอร์ไว้ราว 2 เท่าของช่วงห่างที่เซิร์ฟเวอร์ส่งแพ็กเก็ต (ถ้ารับ 20 ครั้งใน 1 วินาทีก็คือ 100 ms)
- บนกราฟ
- สูงตลอดตั้งแต่แรก · ช่วงห่างการมาถึงของแพ็กเก็ต, จำนวนครั้งที่ interpolation buffer ว่าง
- จุดที่ต้องดู
- บันทึกการกระจายของช่วงห่างการมาถึงของแพ็กเก็ตจากเซิร์ฟเวอร์ที่ไคลเอนต์ และจำนวนเฟรมที่หยุดหรือเปลี่ยนไปใช้ extrapolation เพราะไม่มีสแนปช็อตถัดไปให้ interpolate
- สัญญาณว่าใช่
- ความไม่สม่ำเสมอของช่วงห่างการมาถึงเกินความยาว interpolation buffer บ่อย ๆ และทุกครั้งที่เกิน บัฟเฟอร์จะว่างจนตัวละครอื่นหยุดแวบ เพิ่มบัฟเฟอร์แล้วลดลง
- สัญญาณว่าไม่ใช่
- บัฟเฟอร์พอแล้วแต่ยังหยุดแวบ: ตรวจว่าช่วงห่างที่เซิร์ฟเวอร์ส่งออกมาเองไม่สม่ำเสมอหรือไม่ (ทิกล่าช้า)
- วิธีตรวจ
- ต้องมี log หรือเมตริกจากเซิร์ฟเวอร์/ไคลเอนต์เกม
- รายละเอียดเพิ่มเติม
- ยิ่งเพิ่มบัฟเฟอร์ภาพก็ยิ่งลื่น แต่ก็จะเห็นอีกฝ่ายเป็นภาพในอดีตนานขึ้นเท่ากัน การตัดสินการโจมตีจึงใช้ lag compensation ควบคู่ไปด้วย โดยเซิร์ฟเวอร์ย้อนเวลากลับไปตรวจที่ “อดีตที่ผู้เล่นคนนั้นเห็น”
แหล่งอ้างอิง
- Interpolation and extrapolation (Netcode for Entities 6.5) Unity
buffered interpolation ที่จงใจวาดช้าลงเพื่อรอแพ็กเก็ตที่มาช้า บัฟเฟอร์ยิ่งใหญ่ยิ่งแม่นยำ แต่ดีเลย์ก็เพิ่มขึ้นตาม - Struct ClientTickRate (Netcode for Entities 6.5) Unity
ค่าเริ่มต้นของ interpolation buffer คือ InterpolationTimeNetTicks = 2 (เท่ากับการส่งของเซิร์ฟเวอร์ 2 ครั้ง) - Physics (Netcode for Entities 6.5) Unity
lag compensation: เซิร์ฟเวอร์หาสถานะการชน (collision world) ที่ไคลเอนต์เห็นในทิกนั้น แล้วตัดสินว่าโดนหรือไม่
สาเหตุที่ควรดูประกอบ
ชั้นเดียวกัน: L1 โปรเซสเกมฝั่งไคลเอนต์
สาเหตุจากชั้นอื่นที่ทำให้เกิดอาการเดียวกัน (กระตุก)
ดูการ์ดในฉบับหลักที่มีภาพและการทดลอง