สถาปัตยกรรมเกมเพียร์ทูเพียร์ที่ดีที่สุด


10

พิจารณาการตั้งค่าที่ไคลเอนต์เกม:

  1. มีทรัพยากรคอมพิวเตอร์ขนาดเล็ก (อุปกรณ์มือถือสมาร์ทโฟน)
  2. เชื่อมต่อกับเราเตอร์ทั่วไป (LAN, ฮอตสปอตและอื่น ๆ )

ผู้ใช้ต้องการเล่นเกมแบบผู้เล่นหลายคนโดยไม่มีเซิร์ฟเวอร์ภายนอก

ทางออกหนึ่งคือการโฮสต์เซิร์ฟเวอร์ที่เชื่อถือได้ในโทรศัพท์เครื่องหนึ่งซึ่งในกรณีนี้จะเป็นลูกค้าเช่นกัน เมื่อพิจารณาถึงจุดที่ 1 โซลูชันนี้ไม่เป็นที่ยอมรับเนื่องจากทรัพยากรการประมวลผลของโทรศัพท์ไม่เพียงพอ

ดังนั้นฉันต้องการออกแบบสถาปัตยกรรมแบบเพียร์ทูเพียร์ที่จะกระจายการจำลองเกมในหมู่ลูกค้า เนื่องจากจุดที่ 2 ระบบไม่จำเป็นต้องมีความซับซ้อนเนื่องจากการปรับให้เหมาะสม เวลาแฝงจะต่ำมาก ลูกค้าแต่ละรายสามารถเป็นแหล่งข้อมูลที่เชื่อถือได้เกี่ยวกับตัวเขาและสภาพแวดล้อมในทันที (ตัวอย่างเช่นหัวข้อย่อย)

อะไรจะเป็นวิธีที่ดีที่สุดในการออกแบบสถาปัตยกรรมเช่นนี้? มีตัวอย่างที่รู้จักของโปรโตคอล LAN แบบ peer-to-peer ดังกล่าวหรือไม่?

หมายเหตุ:

ปัญหาบางอย่างได้รับการแก้ไขที่นี่แต่แนวคิดที่ระบุไว้มีระดับสูงเกินไปสำหรับฉัน

ความปลอดภัย

ฉันรู้ว่าไม่มีเซิร์ฟเวอร์ที่มีสิทธิ์หนึ่งเดียวเป็นปัญหาด้านความปลอดภัย แต่มันไม่เกี่ยวข้องในกรณีนี้เนื่องจากฉันยินดีที่จะเชื่อถือลูกค้า

แก้ไข:

ฉันลืมที่จะพูดถึง: มันจะเป็นเกมที่ค่อนข้างเร็ว (นักกีฬา)

นอกจากนี้ฉันได้อ่านเกี่ยวกับสถาปัตยกรรมเครือข่ายที่Gaffer on Gamesแล้ว

คำตอบ:


10

ดูบทความนี้เกี่ยวกับสถาปัตยกรรมเครือข่ายของ Age of Empires II

พวกเขาสามารถสร้างเกมที่มีผู้เล่นหลายคนได้อย่างยอดเยี่ยมบน Pentium 90 พร้อม RAM ขนาด 16 MB และการเชื่อมต่อโมเด็ม 28.8 kB / s พวกเขาทำสิ่งนี้โดยให้ผู้เล่นแต่ละคนทำการจำลองของตัวเอง แต่ประสานคำสั่งของพวกเขา

พวกเขามีลูกเล่นที่ฉลาดในนั้นฉันขอแนะนำ


5

ฉันทำสิ่งนี้เพื่อเกมแข่งรถ PSP เชิงพาณิชย์ซึ่งทำงานได้ทั้งบนเครือข่ายเฉพาะกิจและผ่านฮอตสปอตไร้สาย (หรือไปยังเซิร์ฟเวอร์แบบคงที่บนอินเทอร์เน็ตหากต้องการ)

เนื่องจากจุดที่ 2 ระบบไม่จำเป็นต้องมีความซับซ้อนเกี่ยวกับการปรับให้เหมาะสม

จากประสบการณ์ของฉันมันไม่เป็นความจริง อุปกรณ์ไร้สาย (โดยเฉพาะอุปกรณ์พกพาขนาดเล็ก) ไม่เหมือนกับคอมพิวเตอร์ที่มีการเชื่อมต่อเครือข่ายแบบมีสาย - สมาร์ทโฟนและเครื่องเล่นเกมไร้สายมักจะมีอินเตอร์เฟสเครือข่ายที่ช้าสำหรับจุดประสงค์ของเกม

อย่าเข้าใจฉันผิด - ปริมาณงานของพวกเขามักจะดี (นั่นคือปริมาณข้อมูลต่อวินาทียอดเยี่ยมสำหรับการสตรีมภาพยนตร์หรืออื่น ๆ ) แต่เวลาแฝงในการส่งแพ็คเก็ตนั้นอาจแย่มากและอาจเป็นเช่นนั้น ตัวแปรสูงที่เป็นเรื่องยากที่จะประเมินว่าแต่ละแพ็กเก็ตจะใช้เวลานานแค่ไหนในการส่งมอบ รูปแบบนี้ยิ่งแย่ลงเนื่องจากอุปกรณ์ไร้สายถูกรวมเข้าด้วยกันในพื้นที่ทั่วไปแห่งหนึ่งเนื่องจากสัญญาณของพวกเขาเริ่มรบกวนซึ่งกันและกัน ด้วยเหตุนี้เวลาของฉันค่อนข้างมากที่ใช้ในการลดจำนวนของแพ็กเก็ตที่จำเป็นในการส่งดังนั้นเราจะมีการชนกันของแพ็กเก็ตน้อยลง (โปรดทราบว่านี่เป็นปัญหาที่ค่อนข้างน้อยในกรณีที่เกี่ยวข้องกับฮอตสปอตเครือข่ายที่ใช้พลังงานมากกว่าการให้อุปกรณ์พูดคุยกันโดยตรงผ่านเครือข่ายเฉพาะกิจ)

ตัวอย่างของการเพิ่มประสิทธิภาพประเภทนี้เกมแข่งรถของเราเกิดขึ้นในโลกที่มีสัญญาณไฟจราจร หลายพันคน และเราจำเป็นต้องตรวจสอบให้แน่ใจว่าสัญญาณของพวกเขาอยู่ในระหว่างผู้เล่นทุกคนในเซสชั่นเครือข่าย แทนที่จะพยายามส่งแพ็กเก็ตโดยบอกให้ทุกคนทราบว่าไฟอยู่ในสถานะใดเราได้กำหนดตารางเวลาแบบคงที่สำหรับสัญญาณไฟจราจรทั้งหมดจากนั้นตรวจสอบให้แน่ใจว่าลูกค้าทุกคนตกลงกันใน "เวลาเล่นเกม" ในปัจจุบัน เนื่องจากพวกเขาทุกคนรู้เวลาเล่นเกมและสถานะของสัญญาณไฟจราจรทั้งหมดสามารถกำหนดได้จากเวลาเล่นเกมเราจึงซิงโครไนซ์ข้อมูลสถานะทั้งหมดนั้นโดยไม่ส่งข้อมูลพิเศษใด ๆ การเปลี่ยนแปลงครั้งนี้สร้างความแตกต่างอย่างมากสำหรับประสิทธิภาพเครือข่ายของเรา

สิ่งที่กล่าวว่าการสร้างนาฬิกาซิงค์ที่เชื่อถือได้ระหว่างอุปกรณ์ไร้สายหลาย ๆ อัน (ด้วยเวลา ping ที่แตกต่างกันอย่างมากเนื่องจากการสูญเสียแพ็คเก็ต) เป็นความท้าทายที่ยิ่งใหญ่ ยินดีที่จะพูดคุยเกี่ยวกับเรื่องนี้ถ้าคุณมีความสนใจ

ลูกค้าแต่ละรายสามารถเป็นแหล่งข้อมูลที่เชื่อถือได้เกี่ยวกับตัวเขาและสภาพแวดล้อมในทันที (ตัวอย่างเช่นหัวข้อย่อย)

นี่คือสิ่งที่เราทำและมันทำงานได้ดีสำหรับเราในสถานการณ์ของเรา (รถยนต์) แน่นอนว่าส่วนที่มีปัญหาคือเมื่อวัตถุหยุดเข้าใกล้ผู้เล่น 'a' มากกว่าผู้เล่น 'b' และความเป็นเจ้าของของมันจึงโอนจากผู้เล่นคนหนึ่งไปยังผู้เล่นคนอื่น

นี่เป็นการเจรจาต่อรองที่ซับซ้อนอย่างน่าประหลาดใจระหว่างผู้เล่นโดยที่เกม 'a' เสนอให้กับเกม 'b': "ฉันคิดว่าวัตถุนี้ใกล้คุณมากขึ้นคุณควรควบคุมมัน" จากนั้นเกม 'b' อาจยอมรับหรืออาจปฏิเสธตามมุมมองของตัวเองเกี่ยวกับสถานการณ์ ความแตกต่างในสถานะของเกมที่รับรู้ระหว่าง 'a' และ 'b' และการเปลี่ยนแปลงเวลาระหว่างเมื่อมีการส่งและรับคำร้องขอและการตอบสนองทำให้การเจรจาเล็ก ๆ น้อย ๆ น่ารังเกียจเป็นพิเศษเพื่อให้ได้รับความน่าเชื่อถือ "ฮ็อตมันฝรั่ง" ที่มีการเป็นเจ้าของวัตถุที่กระเด้งไปมาอย่างต่อเนื่องระหว่างผู้เล่นหลายคน และแม้ว่ามันจะทำงานได้อย่างถูกต้องเมื่อดูจากจุดชมวิวของเกม 'c' มี '

สัญชาตญาณของฉันคือวิธีการ "ความเป็นเจ้าของวัตถุ" แบบนี้น่าจะยุ่งยากเกินไปสำหรับวัตถุขนาดเล็กที่มีอายุสั้นเช่นกระสุน เราใช้มันสำหรับรถยนต์การจราจรและนักแข่งรถ AI ซึ่งมีแนวโน้มที่จะมีชีวิตอยู่ในแบบจำลองเป็นเวลานาน ดูเหมือนว่าวิธีการที่มีประสิทธิภาพมากขึ้นถ้าคุณเต็มใจที่จะเชื่อใจลูกค้าจะต้องมีเกมของผู้เล่นแต่ละคนเป็นเจ้าของตำแหน่งและโปรเจคของพวกเขาและประกาศเมื่อผู้เล่นคนนั้นโดนกระสุนปืนของผู้อื่น (เช่นเดียวกับ "เกม A" ฉันต้องรับผิดชอบในการพูดว่าผู้เล่น A และขีปนาวุธของผู้เล่น A อยู่ที่ไหน แต่ผู้เล่น B รับผิดชอบในการพูดว่าฉันกดผู้เล่น B หรือไม่) ด้วยการคิดบัญชีที่ดีคุณควรจะมีพฤติกรรมที่สมเหตุสมผลออกจากระบบเช่นนี้


1

ฉันขอแนะนำให้คุณใช้ขั้นตอนการล็อกเพียร์เพื่อเพียร์สถาปัตยกรรม

คุณเริ่มต้นด้วยการนับเฟรมเกมของคุณหลังจากที่เกมเริ่ม ไคลเอนต์หนึ่งสร้างเฟรมที่ 1 จากนั้นส่งข้อความพร้อมไปยังไคลเอนต์อื่นและรอรับข้อความพร้อมจากไคลเอนต์อื่น

ตอนนี้ลูกค้าทุกคนสามารถไปเฟรมที่ 2 แสดงเฟรมส่งและรับคำสั่งอัปเดตโลกอัปเดตฟิสิกส์และ ... หลังจากนั้นส่งข้อความพร้อมกัน

โซลูชันนี้ดีมากสำหรับเกม LAN และลูกค้าของคุณทั้งหมดจะซิงค์

ด้วยระบบเครือข่ายประเภทนี้คุณสามารถมั่นใจได้ว่าลูกค้าของคุณทุกคนซิงค์กันดังนั้นคุณสามารถทดสอบวิธีที่ดีที่สุดที่เหมาะสมกับความต้องการของคุณ

วิธีแรกคือส่งอินพุตไปยังผู้อื่นเท่านั้นและลูกค้าแต่ละรายจำลองการทำงาน, การยิง, การตรวจจับการชนและอื่น ๆ วิธีที่ 2 คือลูกค้าแต่ละคนส่งข้อมูลเกี่ยวกับตัวละครของเขาไปยังผู้อื่นเช่นตำแหน่งการหมุนรัฐเฟรมภาพเคลื่อนไหวและอื่น ๆ คำนวณสิ่งของและส่งผ่านเครือข่าย แต่วิธีแรกปลอดภัยกว่า


1
คำตอบนี้น่าจะเกี่ยวกับเกมวนรอบ ฉันคิดว่า OP กำลังถามเกี่ยวกับระบบกระจายโหลด โดยเฉพาะผู้ที่จำลองสิ่งที่และวิธีการที่ลูกค้าสื่อสาร คุณช่วยอธิบายรายละเอียดเพิ่มเติมได้ไหม? ฉันสนใจปัญหานี้เช่นกัน
Wackidev

@Wackidev กับเครือข่ายประเภทนี้คุณสามารถมั่นใจได้ว่าลูกค้าทั้งหมดของคุณมีการซิงค์เพื่อให้คุณสามารถทดสอบวิธีที่ดีที่สุดที่เหมาะสมกับความต้องการของคุณ วิธีแรกคือส่งอินพุตไปยังผู้อื่นเท่านั้นและลูกค้าแต่ละรายจำลองการทำงาน, การยิง, การตรวจจับการชนและอื่น ๆ วิธีที่ 2 คือลูกค้าแต่ละคนส่งข้อมูลเกี่ยวกับตัวละครของเขาไปยังผู้อื่นเช่นตำแหน่งการหมุนรัฐเฟรมภาพเคลื่อนไหวและอื่น ๆ คำนวณสิ่งของและส่งผ่านเครือข่าย แต่วิธีแรกปลอดภัยกว่า
kochol

ดังนั้นโปรดตอบคำถามของคุณ ตอนนี้ฉันไม่คิดว่ามันจะตอบคำถาม นอกจากนี้โปรดลบความคิดเห็นที่ซ้ำกันครั้งแรก ขอบคุณ สำหรับแนวคิดนั้นตัวเลือกแรกที่คุณระบุไว้ไม่จำเป็นต้องใช้การจำลองแบบเพื่อกำหนดหรือไม่
Wackidev
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.