นอกเหนือจากบทความที่เชื่อมโยงกับคำตอบอื่น ๆ ฉันสามารถบอกเล่าประสบการณ์ของโครงการ Arianneได้เล็กน้อย
ทำอย่างไรให้ซิงโครไนซ์กัน?
เรามีโครงสร้างการสร้าง„ Marauroa ” รอบ ๆ แนวคิดของการกระทำและการรับรู้: การดำเนินการจะถูกส่งจากลูกค้าไปยังเซิร์ฟเวอร์ที่มีการป้อนข้อมูลของผู้ใช้เช่น (เดินไปทางซ้ายโจมตีมอนสเตอร์ # 47 พูดว่า 'hello') และการรับรู้จะถูกส่งจากเซิร์ฟเวอร์ไปยังลูกค้าบอกพวกเขาเกี่ยวกับสถานะของโลกรอบตัวพวกเขา การรับรู้เหล่านั้นจะถูกส่งทุกเทิร์น ขึ้นอยู่กับเกมที่เราใช้เวลาเปิด 30ms ถึง 300ms
เรามีการรับรู้สองประเภท: การรับรู้เต็มรูปแบบจะถูกส่งเข้าสู่ระบบและเมื่อผู้เล่นเข้าสู่พื้นที่ใหม่ (โซน) หลังจากนั้นการรับรู้ที่แตกต่างจะถูกส่งไปรวมถึงเฉพาะคุณลักษณะที่ได้รับการแก้ไข (เช่นตำแหน่ง) ของวัตถุที่ถูกดัดแปลงและแน่นอนว่าวัตถุใหม่และวัตถุที่ถูกลบ
วิธีแก้ไขปัญหาความล่าช้า
เราเชื่อมั่นอย่างยิ่งใน“ เซิร์ฟเวอร์ที่ถูกต้องเสมอ” ลูกค้าทำการคาดการณ์บางอย่างเช่นการเดินอย่างราบรื่นการตรวจสอบการชนและอื่น ๆ แต่ถ้าลูกค้าและเซิร์ฟเวอร์ไม่เห็นด้วยกับสิ่งใดเซิร์ฟเวอร์จะเป็นผู้ชนะ โครงการย่อยสเตนดาห์ล (RPG 2 มิติ) ใช้เวลาเปิด 300ms โดยค่าเริ่มต้น (พร้อมกับฝั่งไคลเอ็นต์ที่ทำเสร็จแล้วจำนวนมาก) สิ่งนี้ทำให้สเตนดาห์ลทนทานต่อความล่าช้าได้มาก
หมายเหตุ: เกมอื่น ๆ บางเกมเชื่อใจลูกค้าว่าจะมีการขยายเพิ่มเพื่อลดผลกระทบจากความล่าช้าของเครือข่าย ใน WoW นั้นมักถูกโจมตีจากหนึ่งในสนามรบที่ชื่อว่า“ Warsong Gulch” มีสองวิธีที่ผู้เล่นที่มีธงสามารถเลือกได้: เปิดตรงกลางผ่านอุโมงค์และอีกวิธีหนึ่งในการมองขึ้นไปบนเนินเขา ดังนั้นผู้เล่นโกงจะวิ่งไปที่อุโมงค์แล้วทำให้เกิดความล่าช้าสำหรับตัวเขาเอง เซิร์ฟเวอร์และไคลเอนต์อื่น ๆ จะยังคงเห็นเขาทำงานต่อไป แต่หลังจากนั้นไม่นานไคลเอนต์นี้สามารถบอกเซิร์ฟเวอร์ว่ามันเดินไปที่เนินเขา WoW จะตรวจสอบว่าระยะห่างระหว่างพิกัดที่ส่งล่าสุดกับพิกัดปัจจุบันนั้นอยู่ในช่วงเวลาหรือไม่และยอมรับว่า
การใช้ UDP กับ TCP
ในรุ่นก่อนหน้าเราใช้ UDP เพื่อลดค่าใช้จ่ายของ TCP เราจัดการแพ็คเก็ตที่หายไปด้วยตัวเอง สิ่งนี้ทำงานได้อย่างสมบูรณ์ในช่วงแรกของโครงการ แต่เมื่อเซิร์ฟเวอร์ถูกย้ายจากการเชื่อมต่อ DSL ที่บ้านไปยังศูนย์ข้อมูลจริงเมื่อหลายปีก่อนเรามีปัญหาใหญ่ UDP คือ (หรืออย่างน้อยก็เมื่อ 5 ปีก่อน) ที่ต้องการพลัง CPU ของฮาร์ดแวร์ไฟร์วอลล์อย่างมาก: กฎจะต้องนำไปใช้กับทุก ๆ UDP แพ็คเก็ต สำหรับ TCP อย่างไรก็ตาม ruleset จะใช้กับ 3 แพ็กเก็ตแรกเท่านั้น หลังจากนั้นจะทำการเชื่อมต่อ แพ็กเก็ตต่อไปนี้ทั้งหมดจะข้ามชุดกฎปกติเนื่องจากอยู่ในตารางติดตามการเชื่อมต่อหรือเนื่องจากไม่มีสถานะ SYN
วิธีการป้องกันการสื่อสารและลูกค้าจากวิศวกรรมย้อนกลับ?
Arianne เป็นโอเพ่นซอร์สอย่างสมบูรณ์ซึ่งรวมถึงไคลเอนต์เซิร์ฟเวอร์กราฟิกเพลง และแน่นอนว่ามีเอกสารโปรโตคอลของเราและแม้แต่ตัววิเคราะห์ที่ใช้สำหรับการดีบัก
ง่ายต่อการป้องกันการสื่อสารจากการดมกลิ่นที่ไม่ได้รับอนุญาตจากบุคคลที่สามโดยใช้ SSL
อย่างไรก็ตามเป็นไปไม่ได้ที่จะปกป้องมันจากวิศวกรรมย้อนกลับ แน่นอนว่าคุณสามารถทำให้งงและใช้เทคนิคการดีบัก แต่ในที่สุดคุณไม่สามารถป้องกันวิศวกรรมย้อนกลับของซอฟต์แวร์ที่คุณมอบให้แก่ผู้ใช้ มีการนำเสนอที่น่าสนใจอย่างมากเกี่ยวกับวิธีที่ Skype ถูกออกแบบวิศวกรรมย้อนกลับแม้นักพัฒนาจะใช้ความพยายามอย่างมากในการต่อต้านการดีบั๊กเทคนิค: http://recon.cx/en/f/vskype-part1.pdf
หมายเหตุ: มีบางประเทศที่วิศวกรรมย้อนกลับผิดกฎหมายหรืออนุญาตให้ใส่ย่อหน้าลงในใบอนุญาตหรือ ToS ไม่อนุญาตให้ใช้วิศวกรรมย้อนกลับ แต่มีประเทศอื่น ๆ (เช่นที่ฉันอาศัยอยู่) ซึ่งอนุญาตให้วิศวกรรมย้อนกลับอย่างชัดเจนในบริบทของการพัฒนารูปแบบการจัดเก็บข้อมูลที่เข้ากันได้หรือโปรโตคอลการส่งสัญญาณย่อหน้าในใบอนุญาตหรือ ToS พยายามที่จะไม่อนุญาต (ทุกสิ่งในส่วนนี้เท่าที่ฉันรู้ฉันไม่ใช่นักกฎหมาย)
สิ่งใดที่ควรคำนวณภายในเครื่องและสิ่งใดบนเซิร์ฟเวอร์
เราคำนวณทุกสิ่งที่เกี่ยวข้องกับตรรกะของเกมบนเซิร์ฟเวอร์ ลูกค้าจะทำนายเหตุการณ์บางอย่างเพื่อให้เกมเล่นได้อย่างราบรื่น แต่ในที่สุดเซิร์ฟเวอร์ก็ถูกต้องเสมอ
เหตุการณ์ที่คาดการณ์ไว้เป็นตัวอย่างของการหยุดเคลื่อนไหวเมื่อชนถูกชน Stendhal ใช้กริดเพื่อจัดวางองค์ประกอบ และจากมุมมองของเซิร์ฟเวอร์มุมซ้ายด้านบนของทุกเอนทิตีจะอยู่ที่หนึ่งตาราง แต่ลูกค้าจะย้ายพวกเขาไปรอบ ๆ อย่างราบรื่นระหว่างกระเบื้อง มันจะวาดเอฟเฟกต์หลอก 3 มิติด้วย ดังนั้นเอนทิตีที่มีฐาน 1x1 อาจสูงกว่าในไคลเอนต์
วิธีการสมดุลปัญหาโหลด?
พยายามทำให้สิ่งนี้ง่ายที่สุดเท่าที่จะทำได้เพื่อลดความยุ่งยากในการบำรุงรักษา
โหลดบาลานซ์ของเนื้อหาสแตติกเป็นที่รู้จักกันดีในพื้นที่ของเซิร์ฟเวอร์ http คลัสเตอร์และเครือข่ายการกระจายเนื้อหา
แนวคิดที่ค่อนข้างง่ายสำหรับการปรับสมดุลโหลดของบริการเกมคือการแบ่งเซิร์ฟเวอร์ข้ามภูมิภาค / โซน ดังนั้นโซน AC อยู่บนเซิร์ฟเวอร์หนึ่งและโซน DF อยู่บนอีกเซิร์ฟเวอร์หนึ่ง นี่เป็นเรื่องง่ายโดยเฉพาะอย่างยิ่งถ้าคุณไม่สามารถดูจากโซนในหนึ่งชุดไปยังโซนในชุดอื่น คุณต้องทำการตรวจสอบบางอย่างเพื่อให้ไคลเอนต์สามารถเชื่อมต่อกับเซิร์ฟเวอร์โซนที่รับผิดชอบโซนที่เล่นอยู่
วิธีที่ง่ายที่สุดในการถ่ายโอนผู้เล่นจากเซิร์ฟเวอร์หนึ่งไปยังอีกเซิร์ฟเวอร์หนึ่งคือเขียนไปยังฐานข้อมูลบอกให้ไคลเอนต์เชื่อมต่อกับเซิร์ฟเวอร์โซนอื่นและตัดการเชื่อมต่อจากเซิร์ฟเวอร์ปัจจุบัน ลูกค้าจะเชื่อมต่อกับเซิร์ฟเวอร์โซนใหม่ซึ่งจะโหลดจากฐานข้อมูล (เนื่องจากคุณต้องการโหลดจาก / store ไปยังรหัสฐานข้อมูลการสื่อสารโดยตรงระหว่างเซิร์ฟเวอร์สำหรับการส่งมอบสามารถนำมาใช้ในภายหลัง)
ต้องการบริการระดับโลกเพิ่มเติมบางอย่างผ่าน: ในการเข้าสู่ระบบลูกค้าจะต้องได้รับแจ้งให้เชื่อมต่อกับเซิร์ฟเวอร์โซนที่ถูกต้อง และคุณอาจต้องการระบบแชททั่วโลก
ฉันได้ลงรายละเอียดในหัวข้อนี้ที่วิธีการสร้างสมดุลใน MMO เป็นอย่างไร