คู่มือเกมแลค › ปัญหาที่เกิดกับบางคนเท่านั้น
ข้อมูลการปรากฏตัวที่ทะลักมาหลังเข้าโซนหาย Initial spawn burst lost (unreliable channel, receive buffer, fragmentation)
ID สาเหตุ pt-spawn-burst · ผู้รับผิดชอบหลัก พัฒนาเซิร์ฟเวอร์ (ทีมพัฒนาเกม) · ร่วมกับ พัฒนาไคลเอนต์ (ทีมพัฒนาเกม)
เปิดการ์ดในฉบับหลักที่มีภาพและการทดลอง →
วินาทีที่เข้าโซน เซิร์ฟเวอร์จะส่งข้อมูลการปรากฏตัวของเอนทิตีรอบตัวหลายสิบถึงหลายร้อยตัวมาพร้อมกัน ถ้าส่งผ่านช่องทางแบบ unreliable หรือ receive buffer ล้นในช่วงที่ยังโหลดอยู่จนอ่านซ็อกเก็ตไม่ได้ บางส่วนจะหายไปและไม่ถูกส่งมาอีก
ทำไม ทันทีหลังเข้าโซน ข้อมูลการปรากฏตัวมาถึงพร้อมกันในช่วงสั้น ๆ → ผลคือ ไคลเอนต์ที่กำลังโหลดอ่านซ็อกเก็ตช้าจน receive buffer ของ OS ล้น หรือแพ็กเก็ต UDP ขนาดใหญ่ถูก fragment และหาย fragment เดียวก็หายทั้งแพ็กเก็ต ถ้าเป็นช่องทางแบบ unreliable ก็ไม่ส่งซ้ำให้ด้วย → บนหน้าจอ NPC หายไปบางตัวเฉพาะในไคลเอนต์ฝั่งที่โหลดช้า ถ้าออกจากระยะมองเห็นแล้วกลับมาจะเห็น
- อาการ
- มองไม่เห็น/ตัวผี
- ปัจจัย
- แพ็กเก็ตหาย
- ใครเจอ
- ไคลเอนต์เดียวในเครื่องที่เปิดหลายจอ, เราคนเดียว
- เกิดเมื่อไร
- หลังล็อกอิน/หลังปิดปรับปรุง, ระหว่างเดินทาง/ย้ายแมพ
- ผู้รับผิดชอบ
- ผู้รับผิดชอบหลัก พัฒนาเซิร์ฟเวอร์ (ทีมพัฒนาเกม) · ร่วมกับ พัฒนาไคลเอนต์ (ทีมพัฒนาเกม)
- งานฝั่งทีมพัฒนาเกม
- เซิร์ฟเวอร์: ข้อความแจ้งการปรากฏตัว/ออกไปต้องส่งผ่านช่องทาง reliable ที่รับประกันการส่งซ้ำ, ข้อมูลเริ่มต้นให้แบ่งส่ง ไคลเอนต์: รับข้อมูลในเธรดที่แยกจากการโหลด, เพิ่มขนาด receive buffer
- ตัวเลขที่ควรรู้
- ค่าเริ่มต้นของ receive buffer สำหรับ UDP บน PC ต่างกันตาม OS แต่มักอยู่ที่หลายสิบถึงหลายร้อย KB ถ้าข้อมูลตอนเข้าเมืองที่คนเยอะใหญ่กว่านี้ แค่อ่านซ็อกเก็ตไม่ได้ชั่วครู่เพราะกำลังโหลดก็ล้นแล้ว
- บนกราฟ
- พุ่งทันทีหลังเปิดเซิร์ฟ/ปิดปรับปรุง · ปริมาณข้อมูลที่รับทันทีหลังเข้าโซน, จำนวนข้อความแจ้งการปรากฏตัวที่ตกหล่น
- จุดที่ต้องดู
- เทียบจำนวนข้อความแจ้งการปรากฏตัวที่เซิร์ฟเวอร์ส่งทันทีหลังเข้าโซนกับจำนวนที่ไคลเอนต์ได้รับ และดูว่าส่งผ่านช่องทางไหน (reliable หรือ unreliable) ใน packet capture ฝั่งเซิร์ฟเวอร์ ให้ดูปริมาณที่ส่งไปหาผู้เล่นคนนั้นทันทีหลังเข้าโซน และแพ็กเก็ตที่ถูก fragment (filter ของ Wireshark ip.flags.mf == 1 || ip.frag_offset > 0)
- สัญญาณว่าใช่
- จำนวนที่ได้รับน้อยกว่าที่ส่ง ส่วนที่หายกระจุกในช่วงที่ข้อมูลทะลักมาหลังเข้าโซน และส่งผ่านช่องทางแบบ unreliable หรือแพ็กเก็ตใหญ่ถูก fragment เกิดบ่อยกว่าในไคลเอนต์ฝั่งที่โหลดช้า
- สัญญาณว่าไม่ใช่
- จำนวนที่ส่งกับที่ได้รับเท่ากันแต่ยังมองไม่เห็น: น่าจะเป็นการทิ้งหลังได้รับ (“ทิ้งข้อความแจ้งการปรากฏตัวที่มาถึงระหว่างโหลด”) หรือปัญหาการคำนวณระยะมองเห็น ถ้าหายเป็นระยะโดยไม่เกี่ยวกับช่วงหลังเข้าโซน น่าจะเป็นแพ็กเก็ตหายจากเน็ต
- วิธีตรวจ
- ต้องมี log หรือเมตริกจากเซิร์ฟเวอร์/ไคลเอนต์เกม
แหล่งอ้างอิง
- RFC 8085: UDP Usage Guidelines IETF
แพ็กเก็ตที่ถูก fragment จะหายทั้งแพ็กเก็ตแม้หาย fragment เดียว - UDP vs. TCP Gaffer On Games
UDP ไม่รับประกันการส่งถึงและลำดับ แพ็กเก็ตที่หายต้องตรวจจับเองแล้วส่งซ้ำ - Socket.ReceiveBufferSize Property Microsoft
ขนาดเริ่มต้นของ receive buffer ของซ็อกเก็ตต่างกันตาม OS - Display Filter Reference: Internet Protocol Version 4 Wireshark
กรองแพ็กเก็ต IP ที่ถูก fragment ด้วย ip.flags.mf (More fragments) และ ip.frag_offset (Fragment Offset)
สาเหตุที่ควรดูประกอบ
ชั้นเดียวกัน: ปัญหาที่เกิดกับบางคนเท่านั้น
สาเหตุจากชั้นอื่นที่ทำให้เกิดอาการเดียวกัน (มองไม่เห็น/ตัวผี)
ดูการ์ดในฉบับหลักที่มีภาพและการทดลอง