คู่มือเกมแลค › การออกแบบการซิงก์
ช่วงเวลาตัดสินสั้นจนปิงกินหมด Timing window too short for latency + reaction
ID สาเหตุ sy-short-window · ผู้รับผิดชอบหลัก พัฒนาเซิร์ฟเวอร์ (ทีมพัฒนาเกม) · ร่วมกับ พัฒนาไคลเอนต์ (ทีมพัฒนาเกม), อินฟราเซิร์ฟเวอร์ (ทีมอินฟรา)
เปิดการ์ดในฉบับหลักที่มีภาพและการทดลอง →
ถ้าเวลาที่ต้องตอบสนอง เช่น การหลบ, การแพร์รี และการกัน สั้นเกินไป ปิงจะกินเวลานั้นไปจนเกิดการโจมตีที่หลบไม่ได้
ทำไม ช่วงเวลาตัดสินที่สั้น เช่น สัญญาณเตือนท่าโจมตีของบอส 0.5 วินาที หรือช่วงเวลาตัดสินการแพร์รี 0.2 วินาที → ผลคือ เห็นสัญญาณเตือนช้า (ดีเลย์ขาลง + interpolation) และอินพุตของเราก็ไปถึงช้า (ดีเลย์ขาขึ้น + เวลารอทิก) → บนหน้าจอ หลบพ้นแน่ ๆ แต่ยังโดน, แพร์รีไม่ออก
- อาการ
- กดไม่ติด/โรลแบ็ค, อินพุตดีเลย์
- ปัจจัย
- ความหน่วง
- ใครเจอ
- เราคนเดียว, เฉพาะบางฟีเจอร์
- เกิดเมื่อไร
- ตอนทำแอ็กชันบางอย่าง
- ผู้รับผิดชอบ
- ผู้รับผิดชอบหลัก พัฒนาเซิร์ฟเวอร์ (ทีมพัฒนาเกม) · ร่วมกับ พัฒนาไคลเอนต์ (ทีมพัฒนาเกม), อินฟราเซิร์ฟเวอร์ (ทีมอินฟรา)
- งานฝั่งทีมพัฒนาเกม
- เซิร์ฟเวอร์: นัดเวลาสัญญาณเตือนการโจมตีตามเวลาเซิร์ฟเวอร์แล้วส่งล่วงหน้า, ขยายช่วงเวลาตัดสินออกไปเท่ากับปิง (lag compensation) ไคลเอนต์: เล่นสัญญาณเตือนที่ได้รับให้ตรงกับเวลาเซิร์ฟเวอร์ที่นัดไว้
- งานฝั่งทีมอินฟรา
- วางเซิร์ฟเวอร์ใกล้พื้นที่ที่มีผู้เล่นมาก (เซิร์ฟเวอร์ประจำภูมิภาค) เพื่อลดปิงโดยตรง
- ตัวเลขที่ควรรู้
- ถ้าปิง 150 ms และ interpolation 100 ms กว่าสัญญาณเตือนจะขึ้นบนจอเราใช้ประมาณ 0.18 วินาที และกว่าอินพุตของเราจะถึงเซิร์ฟเวอร์ใช้ประมาณ 0.1 วินาที บวกเวลาตอบสนองของคน 0.25 วินาทีเข้าไป สัญญาณเตือน 0.5 วินาทีจึงแทบหลบไม่ทัน
- บนกราฟ
- สูงเฉพาะบางกลุ่ม · อัตราการหลบ/แพร์รีพลาด (แยกตามช่วงปิง)
- จุดที่ต้องดู
- บันทึกเวลาเริ่มและจบของช่วงเวลาตัดสิน, เวลาที่อินพุตของผู้เล่นมาถึงเซิร์ฟเวอร์ และ RTT ของผู้เล่นคนนั้นลงใน log ของเซิร์ฟเวอร์ แล้วแบ่งดูอัตราพลาดตามช่วงปิง (เช่น ทีละ 50 ms)
- สัญญาณว่าใช่
- ยิ่งช่วงปิงสูง อัตราพลาดยิ่งสูงชัดเจน และอินพุตที่พลาดมาถึงหลังช่วงเวลาตัดสินจบไปไม่นาน (ไม่เกิน RTT รวมเวลา interpolation)
- สัญญาณว่าไม่ใช่
- อัตราพลาดใกล้เคียงกันทุกช่วงปิง: น่าจะเป็นความยากของแพตเทิร์น ถ้าอินพุตมาถึงภายในช่วงเวลาตัดสินแล้วยังนับเป็นพลาด ให้ดูโค้ดตัดสินผลหรือการตรวจสอบของเซิร์ฟเวอร์
- วิธีตรวจ
- ต้องมี log หรือเมตริกจากเซิร์ฟเวอร์/ไคลเอนต์เกม
แหล่งอ้างอิง
- Factors influencing the latency of simple reaction time (Frontiers in Human Neuroscience, 2015) Frontiers
เวลาตอบสนองอย่างง่าย (simple reaction time) เฉลี่ยประมาณ 231 ms (213 ms เมื่อหักดีเลย์ของอุปกรณ์), งานวิจัยขนาดใหญ่ระยะหลังได้ 233–400 ms - Latency and Player Actions in Online Games (Communications of the ACM, 2006) ACM
การกระทำที่ต้องแม่นยำและมีเส้นตายสั้นยิ่งไวต่อดีเลย์ (ขีดจำกัดอยู่ที่ประมาณ 100 ms สำหรับมุมมองบุคคลที่ 1, ประมาณ 500 ms สำหรับบุคคลที่ 3 และประมาณ 1,000 ms สำหรับมุมมองแบบพระเจ้า (omnipresent)) - NetworkTime and ticks (Netcode for GameObjects 2.5) Unity
วิธีนัดเวลาอีเวนต์ตามเวลาเซิร์ฟเวอร์ (ServerTime) เพื่อให้ทุกไคลเอนต์เล่นในจังหวะเดียวกัน
สาเหตุที่ควรดูประกอบ
ชั้นเดียวกัน: การออกแบบการซิงก์
สาเหตุจากชั้นอื่นที่ทำให้เกิดอาการเดียวกัน (กดไม่ติด/โรลแบ็ค)
ดูการ์ดในฉบับหลักที่มีภาพและการทดลอง