ฉันจะสร้างเกมแบบผู้เล่นหลายคนแบบ peer-to-peer ได้อย่างไร [ปิด]


36

ฉันจะสร้างเกมผู้เล่นหลายคน p2p ได้อย่างไร ฉันต้องการเกมที่มีผู้เล่นหลายคนโดยไม่ใช้เซิร์ฟเวอร์ แต่แล้วลูกค้าทั้งหมดรู้จักกันได้อย่างไร

ทำไมโปรโตคอล p2p จึงมีชื่อเสียงมากในการถ่ายโอนไฟล์ แต่ไม่ใช่ในเกมที่มีผู้เล่นหลายคน?


สิ่งที่น่าสนใจมากในเกม p2p คือการจัดการเพื่อสร้าง netcode ที่เหมาะสมกับ MMO เพื่อเปิดใช้งานด้านสังคมที่ดีกว่า: เซิร์ฟเวอร์จะต้องใช้สำหรับเมืองและปาร์ตี้ที่มีผู้เล่นมากกว่า 5 คน ฉันไม่รู้ว่าอะไรเป็นไปได้และอะไรที่ไม่ได้ แต่ในปัจจุบันนั่นเป็นสิ่งเดียวที่น่าสนใจยิ่งกว่าของกราฟิก photorealistic ...
jokoon

แต่ p2p ค่อนข้างได้รับความนิยมในเกมแบบผู้เล่นหลายคน! ใครบอกว่าไม่ใช่ แม้แต่ MMO ขนาดใหญ่บางคนก็ใช้ p2p
Adam Harte

คำตอบ:


33

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

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

มีเกมจำนวนมากที่ใช้ระบบเครือข่ายแบบ peer-to-peer รวมถึงกลยุทธ์ส่วนใหญ่กีฬาและเกมขับรถ เกม Xbox360 และ PS3 ทุกเกมใช้เครือข่าย p2p สถาปัตยกรรมไคลเอนต์เซิร์ฟเวอร์ส่วนใหญ่จะใช้ในเกมยิงคนแรกหรือเกม MMO

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

เมื่อคุณสร้างเอ็นจิ้น p2p ไคลเอนต์ทั้งหมดจำเป็นต้องมีสถานะเต็มของโลกของเกมและพวกเขาทั้งหมดจะต้องอยู่ในซิงค์

สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับ P2P และลูกค้าเซิร์ฟเวอร์สถาปัตยกรรมผมแนะนำให้คุณอ่านบทความต่อไปนี้: อะไรทุกโปรแกรมเมอร์ต้องการทราบเกี่ยวกับเครือข่ายเกม

และถ้าคุณยังใหม่ต่อระบบเครือข่ายโดยชำระเงินทั่วไปบทความที่ยอดเยี่ยมอื่น ๆ ในเว็บไซต์นั้น Glenn เป็นอัจฉริยะเครือข่าย


13

มีหลายเหตุผลที่ p2p ไม่เป็นที่นิยมในเกมส่วนใหญ่เกิดจากความล่าช้า ทุกคนช้าเหมือนผู้เล่นที่ช้าที่สุด เราไม่ได้พูดถึงแบนด์วิดธ์ที่นี่ แต่เวลา ping

p2p สามารถถ่ายโอนข้อมูลได้มากมาย แต่ด้วย ping ที่ค่อนข้างสูงเกมจำเป็นต้องส่งข้อมูลจำนวนน้อยมากโดยใช้เวลา ping น้อยที่สุด


13

มีแง่มุมที่น่าสนใจเกี่ยวกับระบบ peer-to-peer และเกมแอ็คชั่น ฉันพยายามโพสต์พวกเขาเป็นความคิดเห็นในบล็อกของ Glenn Fiedler แต่เห็นได้ชัดว่าเขาไม่ชอบที่จะพิสูจน์ว่าผิดและดึงบทความทั้งหมดแทน มันอยู่ใน Internet Archive ในกรณีที่คุณต้องการอ่าน

เขาไม่ปล่อยให้ความคิดเห็นออนไลน์เลยดังนั้นฉันจะพูดที่นี่:

ข้อเสนอแนะ Peer-to-Peer จากโพสต์แรกเป็นจุดเริ่มต้นที่น่าสนใจแม้ว่ามันจะไร้เดียงสาบ้างในบางครั้ง: ความเป็นไปได้แรกคือการรวมระบบกับไคลเอนต์ / เซิร์ฟเวอร์มาตรฐานที่มีการคาดการณ์ตามที่ระบุไว้ในโพสต์ของคุณ เกี่ยวกับระบบเครือข่ายเกม ping P2P ที่ต่ำกว่าจะลดความล่าช้าในการทำนายอย่างมากระหว่างผู้เล่นโดยขึ้นอยู่กับตำแหน่งของพวกเขา: เอฟเฟกต์อาจไม่สามารถมองเห็นได้สำหรับนักเล่นเกมชาวอเมริกันส่วนใหญ่ แต่ที่นี่ในยุโรป pings 200+ เป็นเรื่องปกติสำหรับเซิร์ฟเวอร์ส่วนใหญ่ การคาดการณ์ล่าช้ากว่าเซิร์ฟเวอร์ในยุโรป

วิธี P2P จริงโดยไม่ต้องใช้เซิร์ฟเวอร์นั้นซับซ้อนกว่าเล็กน้อย: ข้อกังวลหลักกับเครือข่ายการกระจายอำนาจคือการทำให้แน่ใจว่ามีความมั่นคงโดยเฉพาะอย่างยิ่งหากการจำลองอาจได้รับผลกระทบจากผีเสื้อเนื่องจากการกำหนดเวลาคำสั่งที่แตกต่างกันเล็กน้อย สิ่งนี้เป็นไปได้ด้วยการเชื่อมโยงสถานะของแต่ละวัตถุ (ผู้เล่น NPCs, ... ) อย่างน้อยเป็นระยะ มันไม่จำเป็นแม้แต่ที่จะทำเพื่อวัตถุทั้งหมดในครั้งเดียวและลูกค้าแต่ละรายสามารถครอบครองวัตถุบางอย่างได้ การสร้างเครือข่ายวัตถุที่เพียงพอในเวลาที่กำหนดควรลดความแตกต่างที่เกิดขึ้นระหว่างการซิงโครไนซ์ของวัตถุแต่ละชิ้นมากพอที่จะไม่เกี่ยวข้องแม้จะเป็นช่วงเวลาการซิงค์ของวินาทีหรือมากกว่า

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

[ ... ]

คุณสามารถค้นหาด้ายฉันอ้างอิงที่http://www.devmaster.net/forums/showthread.php?t=14640

ฉันคิดว่ามีคนพูดถึงปัญหาไฟร์วอลล์แบบ peer-to-peer ที่มีในหนึ่งในกระทู้จากบทความ ทางออกที่เป็นไปได้คือ NAT-Punchthrough:
- ภาพรวม NAT Punchthrough
- การสื่อสารแบบ Peer-to-Peer ข้ามเครือข่ายนักแปลที่อยู่

ไม่มีอัตราความสำเร็จ 100% ดังนั้นคุณควรบอกผู้เล่นให้เปิดพอร์ตอยู่ดี


+1 สำหรับคนเดียวที่จะตอบคำถามขอบคุณสำหรับสิ่งนั้น คำถามหนึ่ง: คุณพูดถึงความแตกต่างของเอฟเฟ็กต์ผีเสื้อในสภาวะที่ไม่สามารถควบคุมได้ เราควรทำอย่างไรเมื่อเราค้นพบว่ารัฐมีความแตกต่างระหว่างเครื่องจักร? ยกตัวอย่าง Starcraft จะเกิดอะไรขึ้นถ้าคอมพิวเตอร์ของฉันเชื่อว่ายูนิตหนึ่งเสียชีวิต แต่คอมพิวเตอร์ของฝ่ายตรงข้ามของฉันเชื่อว่าอีกหน่วยหนึ่งเสียชีวิต เราจะตัดสินใจได้อย่างไรว่าใครควรใช้คำใด
BlueRaja - Danny Pflughoeft

@ BlueLaja Starcraft ไม่ใช่ตัวอย่างที่ดีสำหรับเรื่องนี้เพราะมันเป็นเครื่องยนต์ที่กำหนดได้ 100% คุณจะต้องส่งคำสั่งของผู้เล่นอย่างเชื่อถือได้ด้วยการประทับเวลาและคอมพิวเตอร์ที่ใช้โปรแกรมเดียวกันนั้นจะยอมรับสถานะปัจจุบันเสมอ วิธีที่ดีในการลดความแตกต่างคือการประทับเวลาการอัพเดททุกสถานะด้วย gametime (ฟิสิกส์ - เฟรมหรือติ๊ก) และการแคชเฟรมเหล่านี้บางส่วนบนเครื่องรับ (เกม FPS ส่วนใหญ่ในตัวอย่างนี้คือ CS: S และ TF2) นอกจากนี้อย่าใช้ตัวเลขทศนิยมสำหรับสิ่งสำคัญเนื่องจากการใช้งานอาจแตกต่างกัน
Tamschi

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

เนื่องจากโพสต์บล็อกนั้นหายไปจากแคชของ Google นี่คือที่เก็บถาวรทางอินเทอร์เน็ต: web.archive.org/web/20091120214817/http://gafferongames.com/…
fernozzle

9

ตัวอย่างที่ดีของการเล่นเกม 'peer-to-peer' ที่แท้จริงจะเป็นเกมกลยุทธ์แบบเรียลไทม์เช่น Starcraft

ในเกมที่มีหลายร้อยหน่วย / projectiles ที่เคลื่อนไหวมันไม่เหมาะสมที่จะส่งตำแหน่ง / สถานะผ่านเครือข่ายไปยังผู้เล่นคนอื่น ๆ ซ้ำ ๆ ดังนั้นทางแก้ปัญหาหนึ่งที่นี่ก็คือให้ผู้เล่นทุกคนทำการจำลองแบบเดียวกัน

เมื่อผู้เล่นคนใดคนหนึ่งทำการกระทำคำสั่ง / คำสั่ง ('ย้าย zergling ไปที่ X, Y') สามารถส่งไปยังผู้เล่นอื่นทั้งหมดเพื่อดำเนินการโดยอินสแตนซ์ทั้งหมดของการจำลองในเสี้ยววินาที

ในสถานการณ์เช่นนี้หากผู้เล่นยกเลิกการเชื่อมต่อเกมสามารถดำเนินการต่อได้ - โดยไม่จำเป็นต้องมีเซิร์ฟเวอร์ / โฮสต์ที่ใช้งานเกมผู้เล่นที่เหลือสามารถดำเนินการต่อได้

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


5

มันจะค่อนข้างไม่ตรงไปตรงมาที่จะอ้างว่ามันไม่ใช่เกมที่มีชื่อเสียงเมื่อเกม Real Time Strategy (ซีรี่ส์ Star Craft, Command and Conquer Series) และเกม FPS จำนวนมาก (Call of Duty: Modern Warfare 2) ใช้งาน

ที่กล่าวถึงวิธีเรียนรู้เกี่ยวกับเกมนั้นขึ้นอยู่กับบริการจับคู่ / ล็อบบี้ที่คุณใช้หรือสร้าง แต่แม้เมื่อหนึ่งเรียนรู้เกี่ยวกับเกมยังคงมีอาจมีหนึ่งหรือมากกว่าเพื่อนที่มีความเท่าเทียมกันมากกว่าคนอื่น ๆ พิจารณากรณีของไคลเอนต์ 3 คนที่ต้องการเล่นหนึ่งหลัง nat เปิด 2 หลัง nats เข้มงวด (ปิด) เพียร์ที่เปิดกว้างสามารถรับการเชื่อมต่อจากอีกสองอัน แต่ทั้งสองอย่างเข้มงวดไม่สามารถเชื่อมต่อโดยตรงกับแต่ละอื่น ๆ พวกเขาจะต้องเปิด nat เพื่อถ่ายทอดแพ็คเก็ต หากเพื่อนเปิด nat ลดลงจากเกมแล้วถ่ายทอดอีกอย่างใดอย่างหนึ่งจะต้องมีการค้นพบหรือเกมจะหยุดชะงัก


2

คุณอาจต้องการตรวจสอบ Badumna (www.badumna.com) ซึ่งอ้างว่าเป็นโซลูชันเครือข่ายแบบ peer-to-peer สำหรับเกมออนไลน์ ดูเหมือนว่าจะทำการซิงโครไนซ์สถานะเกมในลักษณะกระจายและตามเว็บไซต์ของพวกเขามีเวอร์ชัน Flash มา


1

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

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

เอกสารสำหรับsmartfoxserverอาจช่วยคุณและ / หรือคุณอาจต้องการใช้มันสำหรับเกมของคุณเช่นกัน คุณเพียงแค่ฝังมันลงในเกมไคลเอนต์ของคุณแทนที่จะมีไคลเอ็นต์และโปรแกรมเซิร์ฟเวอร์แยกต่างหาก


1
ดูเหมือนว่าการตั้งค่า p2p น้อยลงและเซิร์ฟเวอร์ / ไคลเอนต์ทันควัน
deft_code

@caspin นี่เป็นเกมส่วนใหญ่หากไม่ใช่เกม p2p ทุกตัวที่รันอยู่ ผู้เล่นคนหนึ่งถูกกำหนดให้เป็นเจ้าภาพและส่วนที่เหลือเชื่อมต่อกับเขา
AttackHobo

2
@Hobo: นั่นไม่ใช่ p2p นั่นคือไคลเอนต์ / เซิร์ฟเวอร์ไม่ว่าคุณจะเรียกมันว่าอย่างไร
o0 '

1

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


gta4 บน xbox 360 เป็น p2p ดังนั้นจึงเป็นไปได้และแทบไม่มีความล่าช้าใด ๆ

-1

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

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