คู่มือเกมแลค › การออกแบบการซิงก์
อัตราส่งสแนปช็อตต่ำ Low snapshot / update rate
ID สาเหตุ sy-low-send-rate · ผู้รับผิดชอบหลัก พัฒนาเซิร์ฟเวอร์ (ทีมพัฒนาเกม) · ร่วมกับ พัฒนาไคลเอนต์ (ทีมพัฒนาเกม)
เปิดการ์ดในฉบับหลักที่มีภาพและการทดลอง →
ถ้าเซิร์ฟเวอร์ส่งอัปเดตตำแหน่ง (สแนปช็อต) แค่ไม่กี่ครั้งใน 1 วินาที ต้องตั้ง interpolation buffer ให้ยาวตามไปด้วย จึงเห็นตัวละครอื่นเป็นภาพในอดีตที่ไกลขึ้น
ทำไม ส่งอัปเดตตำแหน่งแค่ 5–10 ครั้งใน 1 วินาทีเพื่อประหยัดปริมาณการส่ง → ผลคือ ถ้าจะวาดให้ลื่น ต้องตั้งบัฟเฟอร์เป็น 2 เท่าของช่วงห่างแพ็กเก็ต (200–400 ms) ถ้าตั้งสั้น พลาดแพ็กเก็ตเดียวตัวละครก็หยุดนิ่ง → บนหน้าจอ เห็นอีกฝ่ายเปลี่ยนทิศช้าและไม่ตรงกับการตัดสินผล ถ้าบัฟเฟอร์สั้นจะกระตุก และวาร์ปเมื่อแพ็กเก็ตหาย
อาการ กระตุก , วาร์ป , กดไม่ติด/โรลแบ็ค
ปัจจัย ความหน่วง, แพ็กเก็ตหาย
ใครเจอ ทั้งเซิร์ฟเวอร์
เกิดเมื่อไร ตลอดเวลา
ผู้รับผิดชอบ ผู้รับผิดชอบหลัก พัฒนาเซิร์ฟเวอร์ (ทีมพัฒนาเกม) · ร่วมกับ พัฒนาไคลเอนต์ (ทีมพัฒนาเกม)
งานฝั่งทีมพัฒนาเกม เซิร์ฟเวอร์: เป้าหมายที่อยู่ใกล้หรือกำลังต่อสู้ให้ส่งบ่อย ที่อยู่ไกลให้ส่งห่าง, ส่งเฉพาะส่วนที่เปลี่ยน (delta compression) เพื่อลดขนาดต่อครั้งแล้วเพิ่มความถี่ ไคลเอนต์: ปรับความยาว interpolation buffer ตามช่วงห่างแพ็กเก็ตอัตโนมัติ
ตัวเลขที่ควรรู้ ถ้า 10 ครั้งใน 1 วินาที ช่วงห่างแพ็กเก็ตคือ 100 ms บัฟเฟอร์ 200 ms บวกดีเลย์ทางเดียว 75 ms ของปิง 150 ms จะเห็นอีกฝ่ายย้อนหลังไปประมาณ 0.3 วินาที
บนกราฟ สูงตลอดตั้งแต่แรก · ช่วงห่างการมาถึงของแพ็กเก็ตแยกตามไคลเอนต์, ความยาว interpolation buffer
จุดที่ต้องดู ใน packet capture ฝั่งเซิร์ฟเวอร์ กรองเฉพาะ flow ที่ไปหาผู้เล่นคนหนึ่ง แล้วดูจำนวนแพ็กเก็ตต่อวินาทีและช่วงห่างด้วย I/O Graphs ของ Wireshark ถ้ามี log ฝั่งเกม ให้ดูช่วงห่างการอัปเดตแยกตามเอนทิตีควบคู่กับระยะเผื่อของ interpolation buffer บนไคลเอนต์ (เวลาที่เหลือจนสแนปช็อตถัดไปมาถึง) สัญญาณว่าใช่ อัปเดตตำแหน่งห่างตลอดที่ 5–10 ครั้งต่อวินาที (ช่วงห่าง 100–200 ms) และตั้ง interpolation buffer ไว้เกิน 200 ms หรือระยะเผื่อของบัฟเฟอร์เหลือ 0 บ่อย สัญญาณว่าไม่ใช่ ส่งอัปเดตถี่แล้วแต่ช่วงห่างการมาถึงแกว่ง: น่าจะเป็นจิตเตอร์หรือแพ็กเก็ตหาย ถ้าตอนคนแน่นได้รับอัปเดตห่างเฉพาะเอนทิตีที่อยู่ไกล น่าจะเป็น “งบการส่ง/ลำดับความสำคัญต่อการเชื่อมต่อ” วิธีตรวจ ใช้เครื่องมือฝั่งอินฟรา (ไม่ต้องใช้โค้ดเกม)
แหล่งอ้างอิง Latency Compensating Methods in Client/Server In-game Protocol Design and Optimization (Yahn W. Bernier, GDC 2001) Valve อัปเดต 10 ครั้งต่อวินาทีกับ interpolation 200 ms ทนการหายได้หนึ่งครั้ง ค่าเริ่มต้นของ Half-Life คือ 20 ครั้งต่อวินาที และ interpolation 100 ms Snapshot Interpolation Gaffer On Games ถ้า 10 แพ็กเก็ตต่อวินาที ต้องใช้ดีเลย์ 350 ms จึงจะทนการหายติดกันสองแพ็กเก็ตได้ ถ้า 30 แพ็กเก็ตต่อวินาที จะลดเหลือ 150 ms State Synchronization Gaffer On Games สะสมค่าลำดับความสำคัญเพื่อส่งเอนทิตีที่สำคัญบ่อยขึ้น และวนส่งที่เหลือภายในขีดจำกัดแบนด์วิดท์ 8.8. The “I/O Graphs” Window Wireshark วาดกราฟจำนวนแพ็กเก็ตและไบต์ที่ตรงกับ display filter แยกตามช่วงเวลา
สาเหตุที่ควรดูประกอบ
ชั้นเดียวกัน: การออกแบบการซิงก์
สาเหตุจากชั้นอื่นที่ทำให้เกิดอาการเดียวกัน (กระตุก)
ดูการ์ดในฉบับหลักที่มีภาพและการทดลอง