ฉันจะสร้างเกมผู้เล่นหลายคน p2p ได้อย่างไร ฉันต้องการเกมที่มีผู้เล่นหลายคนโดยไม่ใช้เซิร์ฟเวอร์ แต่แล้วลูกค้าทั้งหมดรู้จักกันได้อย่างไร
ทำไมโปรโตคอล p2p จึงมีชื่อเสียงมากในการถ่ายโอนไฟล์ แต่ไม่ใช่ในเกมที่มีผู้เล่นหลายคน?
ฉันจะสร้างเกมผู้เล่นหลายคน p2p ได้อย่างไร ฉันต้องการเกมที่มีผู้เล่นหลายคนโดยไม่ใช้เซิร์ฟเวอร์ แต่แล้วลูกค้าทั้งหมดรู้จักกันได้อย่างไร
ทำไมโปรโตคอล p2p จึงมีชื่อเสียงมากในการถ่ายโอนไฟล์ แต่ไม่ใช่ในเกมที่มีผู้เล่นหลายคน?
คำตอบ:
เกมเพียร์ทูเพียร์โดยทั่วไปยังคงมีโฮสต์เกม มันเป็นโฮสต์ของเกมที่โพสต์เกมไปยังรายชื่อเกมหลักและยอมรับการเชื่อมต่อใหม่ เมื่อใดก็ตามที่โฮสต์เกมยอมรับลูกค้าใหม่ให้กับเกมมันจะแจ้งลูกค้าที่มีอยู่ทั้งหมดเกี่ยวกับลูกค้าใหม่เพื่อให้พวกเขาสามารถมั่นใจได้ว่าพวกเขาเชื่อมต่อกับลูกค้าใหม่
วิธีที่ง่ายที่สุดในการนำ p2p มาใช้คือกับล็อบบี้ ลูกค้าทั้งหมดเชื่อมต่อกับโฮสต์ในล็อบบี้ (หรือห้องสนทนา) เมื่อโฮสต์พร้อมผู้เล่นกดเริ่มและพวกเขาทั้งหมดเข้าสู่เกมในเวลาเดียวกัน (ใช้กันทั่วไปในเกมวางแผน) วิธีการที่ซับซ้อนกว่านี้คือการใช้ "ดรอปดาวน์" ที่ผู้เล่นสามารถเข้าร่วมและออกจากกลางเกมได้อย่างไรก็ตามนี่เป็นสิ่งที่ซับซ้อนกว่ามากในการนำไปใช้ในเกม p2p และต้องการคุณสมบัติที่เรียกว่าการย้ายโฮสต์
มีเกมจำนวนมากที่ใช้ระบบเครือข่ายแบบ peer-to-peer รวมถึงกลยุทธ์ส่วนใหญ่กีฬาและเกมขับรถ เกม Xbox360 และ PS3 ทุกเกมใช้เครือข่าย p2p สถาปัตยกรรมไคลเอนต์เซิร์ฟเวอร์ส่วนใหญ่จะใช้ในเกมยิงคนแรกหรือเกม MMO
โดยทั่วไปไคลเอนต์ - เซิร์ฟเวอร์จะใช้งานได้ง่ายกว่าเนื่องจากมีเพียง 1 เครื่องเท่านั้นที่ไม่ทราบสถานะของเกมทั้งหมดโดยทั่วไปแล้วไคลเอนต์มักจะใช้โหมดเรนเดอร์โดยมีการคาดการณ์บางอย่างเพื่อทำให้สิ่งต่าง ๆ ดูราบรื่น
เมื่อคุณสร้างเอ็นจิ้น p2p ไคลเอนต์ทั้งหมดจำเป็นต้องมีสถานะเต็มของโลกของเกมและพวกเขาทั้งหมดจะต้องอยู่ในซิงค์
สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับ P2P และลูกค้าเซิร์ฟเวอร์สถาปัตยกรรมผมแนะนำให้คุณอ่านบทความต่อไปนี้: อะไรทุกโปรแกรมเมอร์ต้องการทราบเกี่ยวกับเครือข่ายเกม
และถ้าคุณยังใหม่ต่อระบบเครือข่ายโดยชำระเงินทั่วไปบทความที่ยอดเยี่ยมอื่น ๆ ในเว็บไซต์นั้น Glenn เป็นอัจฉริยะเครือข่าย
มีหลายเหตุผลที่ p2p ไม่เป็นที่นิยมในเกมส่วนใหญ่เกิดจากความล่าช้า ทุกคนช้าเหมือนผู้เล่นที่ช้าที่สุด เราไม่ได้พูดถึงแบนด์วิดธ์ที่นี่ แต่เวลา ping
p2p สามารถถ่ายโอนข้อมูลได้มากมาย แต่ด้วย ping ที่ค่อนข้างสูงเกมจำเป็นต้องส่งข้อมูลจำนวนน้อยมากโดยใช้เวลา ping น้อยที่สุด
มีแง่มุมที่น่าสนใจเกี่ยวกับระบบ 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% ดังนั้นคุณควรบอกผู้เล่นให้เปิดพอร์ตอยู่ดี
ตัวอย่างที่ดีของการเล่นเกม 'peer-to-peer' ที่แท้จริงจะเป็นเกมกลยุทธ์แบบเรียลไทม์เช่น Starcraft
ในเกมที่มีหลายร้อยหน่วย / projectiles ที่เคลื่อนไหวมันไม่เหมาะสมที่จะส่งตำแหน่ง / สถานะผ่านเครือข่ายไปยังผู้เล่นคนอื่น ๆ ซ้ำ ๆ ดังนั้นทางแก้ปัญหาหนึ่งที่นี่ก็คือให้ผู้เล่นทุกคนทำการจำลองแบบเดียวกัน
เมื่อผู้เล่นคนใดคนหนึ่งทำการกระทำคำสั่ง / คำสั่ง ('ย้าย zergling ไปที่ X, Y') สามารถส่งไปยังผู้เล่นอื่นทั้งหมดเพื่อดำเนินการโดยอินสแตนซ์ทั้งหมดของการจำลองในเสี้ยววินาที
ในสถานการณ์เช่นนี้หากผู้เล่นยกเลิกการเชื่อมต่อเกมสามารถดำเนินการต่อได้ - โดยไม่จำเป็นต้องมีเซิร์ฟเวอร์ / โฮสต์ที่ใช้งานเกมผู้เล่นที่เหลือสามารถดำเนินการต่อได้
อย่างไรก็ตามการทำให้เกมไม่ตรงกันคุณต้องใช้การประทับเวลาแบบคงที่สำหรับการอัปเดตลอจิกเกมและต้องระมัดระวังในการใช้และการสร้างเครื่องกำเนิดเลขสุ่มเพื่อให้แน่ใจว่าการจำลองจะไม่แตกต่างกัน!
มันจะค่อนข้างไม่ตรงไปตรงมาที่จะอ้างว่ามันไม่ใช่เกมที่มีชื่อเสียงเมื่อเกม Real Time Strategy (ซีรี่ส์ Star Craft, Command and Conquer Series) และเกม FPS จำนวนมาก (Call of Duty: Modern Warfare 2) ใช้งาน
ที่กล่าวถึงวิธีเรียนรู้เกี่ยวกับเกมนั้นขึ้นอยู่กับบริการจับคู่ / ล็อบบี้ที่คุณใช้หรือสร้าง แต่แม้เมื่อหนึ่งเรียนรู้เกี่ยวกับเกมยังคงมีอาจมีหนึ่งหรือมากกว่าเพื่อนที่มีความเท่าเทียมกันมากกว่าคนอื่น ๆ พิจารณากรณีของไคลเอนต์ 3 คนที่ต้องการเล่นหนึ่งหลัง nat เปิด 2 หลัง nats เข้มงวด (ปิด) เพียร์ที่เปิดกว้างสามารถรับการเชื่อมต่อจากอีกสองอัน แต่ทั้งสองอย่างเข้มงวดไม่สามารถเชื่อมต่อโดยตรงกับแต่ละอื่น ๆ พวกเขาจะต้องเปิด nat เพื่อถ่ายทอดแพ็คเก็ต หากเพื่อนเปิด nat ลดลงจากเกมแล้วถ่ายทอดอีกอย่างใดอย่างหนึ่งจะต้องมีการค้นพบหรือเกมจะหยุดชะงัก
คุณอาจต้องการตรวจสอบ Badumna (www.badumna.com) ซึ่งอ้างว่าเป็นโซลูชันเครือข่ายแบบ peer-to-peer สำหรับเกมออนไลน์ ดูเหมือนว่าจะทำการซิงโครไนซ์สถานะเกมในลักษณะกระจายและตามเว็บไซต์ของพวกเขามีเวอร์ชัน Flash มา
คุณอาจต้องการเรียกใช้กับผู้เล่นหนึ่งคน (เราจะเรียกเขาว่า "โฮสต์") เป็นเซิร์ฟเวอร์ที่ไม่มีสิทธิ์ คุณจะมีผู้เล่นคนอื่น ๆ สื่อสารสิ่งที่พวกเขากำลังทำอยู่กับโฮสต์ของเราและโฮสต์จะส่งข้อความไปยังผู้เล่นคนอื่น ๆ
คุณอาจต้องการส่งรายการคอมพิวเตอร์ที่เชื่อมต่อกับโฮสติ้งเพลเยอร์เพื่อที่ว่าถ้าพวกเขาจะทิ้งโฮสต์ใหม่สามารถเลือกได้และเริ่มสื่อสารกับผู้เล่นที่เหลือ
เอกสารสำหรับsmartfoxserverอาจช่วยคุณและ / หรือคุณอาจต้องการใช้มันสำหรับเกมของคุณเช่นกัน คุณเพียงแค่ฝังมันลงในเกมไคลเอนต์ของคุณแทนที่จะมีไคลเอ็นต์และโปรแกรมเซิร์ฟเวอร์แยกต่างหาก
ฉันสนใจเรื่องนี้เล็กน้อย คุณกำลังพูดว่ามีปัญหามากมายในการสร้างเกม p2p แทนที่จะเป็นเซิร์ฟเวอร์ไคลเอนต์แบบดั้งเดิม แต่ฉันค่อนข้างแน่ใจว่า p2p นั้นเหมือนไคลเอนต์เซิร์ฟเวอร์ แต่เพียร์ทุกคนมีโอกาสที่จะกลายเป็นเซิร์ฟเวอร์ เกี่ยวกับ LAG หากคุณเพิ่มเครื่องอีกหนึ่งเครื่องเนื่องจากเซิร์ฟเวอร์มีความเป็นไปได้มากกว่าที่ลูกค้าจำนวนมากจะเพิ่มเติมจากเซิร์ฟเวอร์ แต่การใช้ p2p ไม่มีเครื่องเพิ่มเติมในล็อบบี้คุณสามารถจัดการการทดสอบเวลาแฝง เกี่ยวกับการสร้างปริมาณการใช้งานเนื่องจากฉันได้เรียนรู้แล้วคุณต้องขอให้ลูกค้าส่งสัญญาณให้น้อยกว่าฉันหมายความว่าลูกค้าต้องคิดว่าลูกค้ารายอื่นเต็มใจที่จะหมายถึง
หากคุณกำลังสร้าง mmorpg ที่ดูค่อนข้างเรียบง่ายและมีความต้องการระบบต่ำฉันขอแนะนำให้สร้างโปรแกรมภายในที่สร้าง "ความถี่" ตามเนื้อหาของโฟลเดอร์ของเกมและไฟล์ที่ประกอบไปด้วย สิ่งนี้จะทำให้ผู้คนที่เล่น "ความถี่" เดียวกันบนช่องเดียวกัน ไคลเอนต์ Modded จัดการหรือปกติจะถูกแยกออก สิ่งนี้จะใช้ได้กับแฮ็กหรือแฮ็กแบบดั้งเดิม แต่ฉันแน่ใจว่านี่จะครอบคลุมขี้โกง "โง่" ทั้งหมด รวมกับวิธีการตรวจสอบข้อผิดพลาดที่คนคนหนึ่งพูดถึงหมายความว่าไม่จำเป็นต้องมีการดูแลเล็กน้อย เท่าที่พอร์ตใช้งานให้ครอบคลุมพอร์ต 52225 ด้วยกระบวนการแบ็คกราวน์ที่ทำให้มันเชื่อมต่อกับเราเตอร์โดยไม่มีพอร์ตทริกเกอร์