วิเคราะห์ซอร์สโค้ด 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 ความคิดเห็น
ความคิดเห็นจาก Hacker News
net_bLerping=0ในคอนโซลเพื่อเล่นเกมโดยไม่ใช้การทำ interpolation