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

วิเคราะห์ซอร์สโค้ด Serious Engine 1

ภาพรวม

  • Serious Sam ถูกออกแบบมาให้เป็นเกมแบบมัลติเพลเยอร์
  • แคมเปญเล่นคนเดียวก็ทำงานในลักษณะเดียวกับมัลติเพลเยอร์
  • Serious Engine รองรับการเล่นคนเดียว มัลติเพลเยอร์ การบันทึกเดโม และการเล่นเดโมกลับ

Determinism ของ floating-point

  • เพื่อให้เกมซิงก์กันได้ การทำงานแบบกำหนดผลลัพธ์ได้ของการคำนวณ floating-point เป็นเรื่องสำคัญ
  • เกมวางจำหน่ายบน Windows เท่านั้น จึงหลีกเลี่ยงปัญหาการซิงก์ที่เกิดจากความต่างของคอมไพเลอร์ได้
  • ใช้ precision guard เพื่อแก้ปัญหาที่เกิดจากความต่างของความแม่นยำของ FPU

Tick vs Frame

  • tick rate ของตรรกะเกมแยกออกจาก frame rate ของการเรนเดอร์
  • ตรรกะเกมถูกตรึงไว้ที่ 20 ticks ต่อวินาที
  • ใช้ interpolation เพื่อให้การเคลื่อนไหวและแอนิเมชันลื่นไหล

มัลติเพลเยอร์ผ่านเครือข่าย

  • โมเดลเครือข่ายของ Serious Engine เป็นแบบ client-server
  • เซิร์ฟเวอร์รับข้อความจากไคลเอนต์มาประมวลผล และส่งข้อมูลที่เกี่ยวข้องไปยังไคลเอนต์ทั้งหมด
  • ใช้โปรโตคอล UDP ในการส่งแพ็กเก็ต

ชั้นของแพ็กเก็ต

  • แพ็กเก็ต UDP อาจมาถึงไม่ตามลำดับหรืออาจไม่มาถึงเลย
  • Serious Engine สร้างโปรโตคอลของตัวเองทับบน UDP เพื่อรับประกันความน่าเชื่อถือและลำดับของแพ็กเก็ต
  • แพ็กเก็ตที่ต้องเชื่อถือได้จะได้รับการยืนยันผ่านแพ็กเก็ต ACK

วงจรชีวิตของการเชื่อมต่อ

  • ใช้ broadcast packet เพื่อสร้างการเชื่อมต่อเสมือนระหว่างไคลเอนต์กับเซิร์ฟเวอร์
  • เซิร์ฟเวอร์จะจัดสรรตัวระบุเฉพาะให้ไคลเอนต์ และใช้สิ่งนี้ในการ route แพ็กเก็ต

การเล่นแบบออฟไลน์

  • การเล่นคนเดียวและการเล่นเดโมกลับเป็นกรณีพิเศษของมัลติเพลเยอร์
  • เซิร์ฟเวอร์และไคลเอนต์สื่อสารกันภายในโปรเซสเดียวกัน

ชั้นของข้อความ

  • CNetworkMessage คือ abstraction ของข้อความที่สามารถอ่านและเขียนได้เหมือนสตรีม
  • ข้อความสามารถถูกบีบอัดได้ โดยใช้การบีบอัด LZRW1 เป็นค่าเริ่มต้น
  • ใช้ delta encoding เพื่อลดปริมาณข้อมูลที่ต้องส่งให้น้อยที่สุด

ความปลอดภัยของข้อความ

  • ข้อความไม่ได้ถูกเข้ารหัส
  • ข้อความแชตถูกส่งเป็น plain text

ความเห็นของ GN⁺

  • มีประโยชน์ต่อนักพัฒนาเกม: โครงสร้างเครือข่ายและกลไกการซิงก์ของ Serious Engine สามารถใช้เป็นข้อมูลอ้างอิงที่มีประโยชน์ในการพัฒนาเกมมัลติเพลเยอร์
  • ความสำคัญของการทำงานแบบกำหนดผลลัพธ์ได้: วิธีรับประกันว่าการคำนวณ floating-point จะทำงานแบบกำหนดผลลัพธ์ได้ เป็นองค์ประกอบสำคัญในการแก้ปัญหาการซิงก์ของเกม
  • การออกแบบโปรโตคอลเครือข่าย: การสร้างโปรโตคอลของตัวเองบน UDP เพื่อรับประกันความน่าเชื่อถือและลำดับ เป็นตัวอย่างที่ดีของการเขียนโปรแกรมเครือข่าย
  • ประเด็นด้านความปลอดภัย: การไม่มีการเข้ารหัสข้อความเป็นจุดที่ควรนำไปพิจารณาในด้านความปลอดภัยของการพัฒนาเกมยุคปัจจุบัน
  • ความท้าทายทางเทคนิค: ช่วยให้เข้าใจความท้าทายทางเทคนิคของการสร้างเกมมัลติเพลเยอร์ความเร็วสูงในสภาพแวดล้อมเครือข่ายช่วงต้นยุค 2000

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

 
GN⁺ 2024-06-14
ความคิดเห็นจาก Hacker News
  • เป็นนักพัฒนาที่ลงมือทำโค้ดเครือข่ายของ Serious Sam โดยเขียน MVP แบบเรียบง่ายขึ้นมาโดยได้แรงบันดาลใจจากระบบคาดการณ์ของ QuakeWorld
  • Serious Sam ทำงานได้ดีเสมอในงาน LAN party และรันได้เสถียรแม้ตอนที่เกมอื่นมีปัญหา
  • เคยทำมัลติเพลเยอร์ของ Vigilante 8 เวอร์ชันพอร์ตลง GB Color ด้วยเกมเพลย์แบบ deterministic โดยส่งข้อมูลครั้งละ 1 ไบต์ผ่านสายลิงก์ของ GBC
  • Croteam เป็นทีมพัฒนาเกมที่มีพรสวรรค์มาก โดยสร้างซีรีส์ Talos Principle และเอนจินเกม Vulkan แบบปรับแต่งเอง
  • มีคนถามว่าแนวคิดนี้คล้ายกับ "1500 archers on a 28.8" ของ Age of Empires หรือไม่
  • ชี้ให้เห็นปรากฏการณ์ที่ซอฟต์แวร์ช้าลงและไร้ประสิทธิภาพมากขึ้นเมื่อทรัพยากรทางเทคนิคเพิ่มขึ้น และเรียกมันว่า "ผลของการออกแบบซอฟต์แวร์แบบ Benjamin Button"
  • สถาปัตยกรรมของ Factorio ส่งเฉพาะเหตุการณ์อินพุต และพึ่งพาคอร์การจำลองที่ซิงก์กัน
  • นึกถึงตอนที่เคยเล่น Serious Sam เดโมจาก PC Gamer ซึ่งตอนนี้ถูกมองว่าเป็นเกมคลาสสิกแล้ว
  • อธิบายฟังก์ชัน interpolation ของ Serious Engine โดยสามารถพิมพ์ net_bLerping=0 ในคอนโซลเพื่อเล่นเกมโดยไม่ใช้การทำ interpolation