1 คะแนน โดย GN⁺ 2024-11-24 | 1 ความคิดเห็น | แชร์ทาง WhatsApp

โมเดลเครือข่าย

  • โมเดลเครือข่ายของ Quake 3 เป็นส่วนที่สง่างามที่สุดส่วนหนึ่งของเอนจิน โดยเน้นว่าในสภาพแวดล้อมที่รวดเร็ว ข้อมูลที่ไม่ได้รับในการส่งครั้งแรกก็ไม่คุ้มค่าที่จะส่งซ้ำ
  • ใช้ UDP/IP และไม่ใช้การส่งแบบเชื่อถือได้ของ TCP/IP เพราะทำให้เกิดความหน่วง
  • สแตกเครือข่ายถูกขยายด้วยชั้นที่แยกจากกันโดยสิ้นเชิงสองชั้น: การเข้ารหัสด้วยคีย์ที่แชร์ไว้ล่วงหน้า และการบีบอัดด้วยคีย์ Huffman ที่คำนวณไว้ล่วงหน้า
  • ระบบฝั่งเซิร์ฟเวอร์โดดเด่นในการลดขนาดของ UDP datagram ให้เล็กที่สุด ขณะเดียวกันก็ชดเชยข้อจำกัดด้านความเชื่อถือได้ของ UDP

สถาปัตยกรรม

  • ฝั่งไคลเอนต์เรียบง่าย โดยในแต่ละเฟรมจะส่งคำสั่งไปยังเซิร์ฟเวอร์และรับการอัปเดตสถานะของเกมกลับมา
  • เซิร์ฟเวอร์ต้องกระจายสถานะเกมหลักไปยังไคลเอนต์แต่ละราย และต้องคำนึงถึงการสูญหายของแพ็กเก็ต UDP
  • องค์ประกอบหลักมีสามส่วน: สถานะเกมหลัก, การส่งคำสั่งของไคลเอนต์ผ่าน Netchannel, และสแนปช็อตที่เก็บสถานะเกมล่าสุด 32 รายการไว้ในอาร์เรย์แบบวนรอบ

ระบบสแนปช็อต

  • เมื่อเซิร์ฟเวอร์ส่งการอัปเดตไปยังไคลเอนต์ จะคัดลอกสถานะเกมหลักไปยังช่องประวัติถัดไปของไคลเอนต์เสมอ แล้วเปรียบเทียบกับสแนปช็อตอื่น
  • หากไม่มีสแนปช็อตที่ใช้งานได้ จะใช้ "สแนปช็อตจำลอง" เพื่อสร้างการอัปเดตแบบเต็ม
  • เมื่อไคลเอนต์ยืนยันว่าได้รับการอัปเดตก่อนหน้าแล้ว ระบบจะส่งเฉพาะการอัปเดตบางส่วน
  • แม้แพ็กเก็ตจะสูญหาย ก็ยังใช้กระบวนการเดียวกัน โดยส่งทั้งข้อมูลที่ก่อนหน้านี้ยังไม่ได้รับและข้อมูลใหม่รวมกันในข้อความเดียว

ความทนทานต่อหน่วยความจำและ C

  • Quake3 เปรียบเทียบสแนปช็อตโดยไม่มี introspection และตำแหน่งของแต่ละฟิลด์ถูกกำหนดไว้ล่วงหน้าผ่านอาร์เรย์และคำสั่งพรีโปรเซสเซอร์
  • ใช้โครงสร้าง netField_t เพื่อกำหนดตำแหน่งและขนาดของฟิลด์ และใช้สิ่งนี้ในการส่งความแตกต่างผ่านเครือข่าย

การแบ่งล่วงหน้า

  • โมดูล NetChannel แบ่งข้อความออกเป็นชิ้นละ 1400 ไบต์ก่อนส่ง เพื่อป้องกันไม่ให้เราเตอร์ต้องทำ packet fragmentation
  • การทำ fragmentation โดยเราเตอร์มีต้นทุนสูง เพราะเมื่อเข้าสู่เครือข่ายอาจทำให้แพ็กเก็ตถูกบล็อก และเมื่อออกจากเครือข่ายต้องรอให้ทุกชิ้นมาครบ

ข้อความแบบเชื่อถือได้และไม่เชื่อถือได้

  • ระบบสแนปช็อตช่วยชดเชย UDP datagram ที่สูญหายบนเครือข่าย แต่ข้อความและคำสั่งบางอย่างจำเป็นต้องส่งถึงปลายทางอย่างแน่นอน
  • การรับประกันนี้ถูกทำให้เป็นนามธรรมผ่าน NetChannel

1 ความคิดเห็น

 
GN⁺ 2024-11-24
ความคิดเห็นบน Hacker News
  • บทความนี้น่าสนใจมาก และบทความก่อนหน้านี้ก็เช่นกัน แต่ตอนนี้งานน่าเบื่อจนไม่เหลือพลังสำหรับโปรเจกต์งานอดิเรก
  • คำว่า "Isochronous" ได้ยินครั้งแรกตอนที่ FireWire ออกมา และมีการพูดถึงมันเพื่ออธิบายความชอบธรรมของการใช้ UDP ตอนนี้มันเป็นส่วนสำคัญในสเปก USB/Thunderbolt
  • ลิงก์บทความแรกในซีรีส์: https://fabiensanglard.net/quake3/index.php
  • ฟังก์ชันการคาดการณ์และแก้ไขความหน่วงน่าสนใจ และไม่ได้ใช้ operational transform (OT) ที่ซับซ้อน วิธีนี้ง่ายกว่า และสถานะที่แชร์กันต้องการแหล่งความจริงที่เป็นอิสระ ไม่ใช่เอกสารแก้ไขร่วมกัน อีกทั้งพัฒนาได้เร็วกว่าและประสิทธิภาพดีกว่า
  • โค้ดเครือข่ายของไคลเอนต์ Q3A เดิมทำงานได้ดีบน LAN แต่ไวต่อความหน่วงเมื่อเล่นระยะไกล หนึ่งในการเปลี่ยนแปลงที่น่าสนใจของ Quake Live คือโค้ดเครือข่ายที่อัปเดตสำหรับการเล่นระยะไกล และการเชื่อมต่ออินเทอร์เน็ตโดยรวมก็ดีขึ้นตามกาลเวลาด้วย
  • ดูเหมือนว่าเว็บกำลังเจอ HN Hug of Death: <การเชื่อมต่อหมดเวลา>
  • เป็นงานเขียนที่เหมาะกับการอ่านในเช้าวันเสาร์ไปพร้อมกับค่อย ๆ จิบมาตฉะ เป็นความสุขเล็ก ๆ ของชีวิต
  • ถาม: มีแหล่งข้อมูลไหนสำหรับเรียนรู้แนวทางสมัยใหม่เกี่ยวกับโปรโตคอลเกมแบบเรียลไทม์บ้างไหม?
  • น่าจะมีการส่งหมายเลข ID ของ snapshot ไปที่ไคลเอนต์ด้วยเพื่อใช้ยืนยันใช่ไหม?
  • ยังมีโอเพนซอร์สมิดเดิลแวร์ที่กันพลาดได้จริงอยู่ไหม?