พื้นฐานเกมมัลติเพลเยอร์ออนไลน์ [ปิด]


9

ฉันกำลังทำงานกับเกมมัลติเพลเยอร์ออนไลน์ ac # แบบเรียลไทม์ จุดมุ่งหมายคือการมีการเชื่อมต่อลูกค้า / เซิร์ฟเวอร์โดยใช้โปรโตคอล UDP จนถึงตอนนี้ฉันใช้ UDP สำหรับการเคลื่อนไหวของผู้เล่นและ TCP สำหรับกิจกรรม (ผู้เล่นยิงผู้เล่นเสียชีวิต) เพราะฉันต้องแน่ใจว่าข้อมูลดังกล่าวจะมาถึงผู้เล่นทุกคนที่เชื่อมต่อกับเซิร์ฟเวอร์ ฉันรู้ว่า UDP ถูกกล่าวว่า 'ไม่น่าเชื่อถือ' และแพ็คเก็ตบางอย่างอาจสูญหายได้ แต่ฉันได้อ่านทุกที่เพื่อไม่ผสม TCP และ UDP เพราะอาจส่งผลต่อการเชื่อมต่อ

คำถามหลักคือฉันจะจัดระเบียบเครือข่ายของฉันได้อย่างไร

UDP ไม่มีการเชื่อมต่อฉันจะบันทึกว่าใครเป็นใครได้อย่างไร ฉันควรบันทึกที่อยู่ ip ของลูกค้าในรายการหรือไม่

ฉันควรใช้ TCP สำหรับเหตุการณ์สำคัญหรือใช้ UDP หรือไม่ ถ้าฉันต้องการใช้ UDP ฉันจะแน่ใจได้อย่างไรว่าข้อมูลจะไม่สูญหาย

โดยการใช้ทั้ง TCP และ UDP ฉันต้องบันทึก IP ของผู้เล่นแต่ละคนในรายการ (สำหรับ UDP) และ TcpClient ซึ่งเชื่อมต่ออยู่ในรายการอื่น (สำหรับ UDP) ฉันจะเปลี่ยนสิ่งนั้นให้มีประสิทธิภาพมากขึ้นได้อย่างไร


@JoshPetrie คำถามนี้ถูกกฎหมาย "คำถามหลักคือฉันจะจัดการเครือข่ายของฉันได้อย่างไร" มันไม่เกี่ยวกับฉันควรจะใช้สิ่งนี้หรือว่า OP ใช้คำแนะนำเดียวและต้องการคำแนะนำเกี่ยวกับการเพิ่มเทคโนโลยีอื่นที่เขาเลือกไว้แล้ว มันกว้างในขณะที่คำตอบไม่ได้อยู่ในเทคโนโลยีที่ควรใช้ แต่ในวิธีการที่ซอฟต์แวร์สามารถจัดโครงสร้างเพื่อหลีกเลี่ยงการ bloating ท่อลดความล่าช้าและเพิ่มความน่าเชื่อถือของเทคโนโลยีพื้นฐาน
โคโยตี้

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

คำตอบ:


6

UDP มีค่าใช้จ่ายน้อยกว่า แต่เสียค่าใช้จ่ายในการสูญเสียแพ็กเก็ตโดยไม่ทราบ (ส่วนหนึ่งของค่าใช้จ่ายที่มี TCP ช่วยให้มั่นใจได้ว่าแพ็กเก็ตที่สูญหายจะถูกส่งอีกครั้ง)

อย่างไรก็ตามปัญหาใหญ่ของการใช้ UDP ก็คือมีเว็บไซต์จำนวนมากที่บล็อกการรับส่งข้อมูล UDP ทั้งหมด (ยกเว้น DNS) เพราะผู้ดูแลระบบจำนวนมากเชื่อว่าเป็นวิธีปฏิบัติด้านความปลอดภัยที่ดี

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

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

คุณสามารถเปิดหลายสตรีม TCP และใช้มันเพื่อจุดประสงค์ที่แตกต่างกันเช่นหนึ่งสำหรับคำสั่งอื่นสำหรับการถ่ายโอนกราฟิกอีกสำหรับการแชทด้วยเสียง ฯลฯ ด้วยวิธีนี้หากคุณถ่ายโอนกราฟิกขนาดใหญ่ที่ใช้เวลา 5-10 วินาทีในการดาวน์โหลดอย่างน้อยการเคลื่อนไหวของคำสั่งของผู้เล่นจะไม่ล่าช้าเพราะมันจะอยู่ในสตรีมอื่น (และคุณสามารถแสดงสไปรต์เริ่มต้นได้จนกว่าสไปรต์ใหม่จะสิ้นสุดการดาวน์โหลดซึ่งสนุกกว่ารออยู่เสมอ)


1
คำถามดั้งเดิมกล่าวถึงรูปแบบไคลเอนต์ - เซิร์ฟเวอร์ดังนั้น "ไซต์" ที่บล็อก UDP ทั้งหมดจึงไม่เกี่ยวข้อง นั่นคือปัญหาของลูกค้าและฉันสงสัยว่าลูกค้าจำนวนมากบล็อก UDP ทั้งหมดจริง ๆ "การใช้ TCP เป็นข้อผิดพลาดที่แย่ที่สุดที่คุณสามารถทำได้เมื่อพัฒนาเกมบนเครือข่าย! เพื่อให้เข้าใจว่าทำไมคุณต้องดูว่า TCP กำลังทำอะไรอยู่เหนือ IP เพื่อให้ทุกอย่างดูง่าย!" ดูgafferongames.com/networking-for-game-programmers/udp-vs-tcp
แน่นอน005

@ แน่นอน005: มีข้อดีข้อเสียคือ - UDP แน่นอนให้ประโยชน์ประสิทธิภาพ แต่ในราคาที่เชื่อถือได้ (ซึ่งเป็นที่ TCP มีประโยชน์) สำหรับการบล็อก UDP คุณถูกต้องจริง ๆ แล้วมันเป็นปัญหาของลูกค้า แต่ในหลาย ๆ องค์กรและสภาพแวดล้อมทางการศึกษาที่ฉันได้พบ UDP (ยกเว้นพอร์ต 53) ถูกบล็อกโดยผู้ดูแลระบบที่คิดว่า UDP เป็นปัญหาด้านความปลอดภัยและ ดังนั้นตัวเลือกสำหรับไคลเอนต์เพื่อย้อนกลับไปยัง TCP อย่างน้อยสามารถหมายความว่าผู้เล่นสามารถสัมผัสกับเกม (โดยเฉพาะถ้าแบนด์วิธเครือข่ายเร็วพอ)
Randolf Richardson

@ แน่นอน005: นอกจากนี้การใช้ส่วนผสมของ UDP และ TCP ก็เป็นที่ยอมรับเช่นกันเนื่องจาก TCP สามารถใช้สำหรับการถ่ายโอนข้อมูลที่มีลำดับความสำคัญต่ำกว่าในขณะที่ UDP สามารถใช้สำหรับด้านการกระทำความเร็วสูง สิ่งที่น่าสนใจที่จะต้องทราบก็คือเมื่อใช้ IPv6 มีตัวเลือกใหม่ให้ใช้งาน (ที่ไม่มีใน IPv4) ซึ่งอาจตอบสนองความต้องการในการเล่นเกมแบบเรียลไทม์โดยไม่ต้องเชื่อมต่อโดยธรรมชาติ แต่ฉันคิดว่า สามารถใช้งานได้โดยเกมโดยไม่ต้องพึ่งพา IPv4 (นี่เป็นเรื่องที่โชคร้ายดังนั้นเราจึงใช้ IPv4 อย่างดีที่สุดเท่าที่ทำได้ในตอนนี้)
Randolf Richardson

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