อะไรคือวิธีที่ดีที่สุดในการทำให้เป็นอันดับและยกเลิกการบอกกล่าวข้อความเครือข่ายสำหรับเกมที่มีผู้เล่นหลายคนใน C / C ++


11

เรากำลังใช้ JSON ในขณะนี้และต้องการย้ายไปยังรูปแบบไบนารีสำหรับข้อความบางประเภทระหว่างไคลเอนต์และเซิร์ฟเวอร์

ฉันควรจะอ่าน structs ลงในซ็อกเก็ตหรือไม่? ใช้บัฟเฟอร์โปรติคอล / เจริญเติบโตอย่างรวดเร็ว?

ฉันควรแสดงอาร์เรย์ของข้อมูลอย่างไร

อินเตอร์เฟสควรมีลักษณะอย่างไรสำหรับการบรรจุ / เปิดออกข้อมูล

คำตอบ:


12

สมมติว่า ...

  1. คุณกำลังพูดถึงการแปลงเป็นบัฟเฟอร์ไบต์
  2. คุณกำลังใช้ UDP และประสิทธิภาพเป็นข้อกังวล

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

ฉันควรจะอ่าน structs ลงในซ็อกเก็ตหรือไม่? ใช้บัฟเฟอร์โปรติคอล / เจริญเติบโตอย่างรวดเร็ว?

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

ฉันควรแสดงอาร์เรย์ของข้อมูลอย่างไร

  • เป็นอาร์เรย์ของข้อมูล เมื่อได้รับการอ่านบัฟเฟอร์ต่อไปจนถึงจุดสิ้นสุดของข้อมูลเพื่อหลีกเลี่ยงการส่งจำนวนองค์ประกอบของอาร์เรย์

อินเตอร์เฟสควรมีลักษณะอย่างไรสำหรับการบรรจุ / เปิดออกข้อมูล

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

สิ่งสุดท้ายที่ขนาดแพ็คเก็ตเป็นข้อกังวลโดยเฉพาะอย่างยิ่งสำหรับ snapshot: size = packetSize x เอนทิตี x connectedPlayers ดังนั้นคุณอาจมี 60 x 10 x 16 = 9,600 ไบต์ต่อแพ็คเก็ตจากนั้นส่ง 20 ครั้งต่อวินาที: = 192,000 bps = 187 KBps เห็นได้ชัดว่านี่เป็นความเร็วสูงที่อัปโหลด ดังนั้นความจำเป็นในการลดปัจจัยแต่ละอย่างที่ทำให้ขนาดแพ็คเก็ตน้อยที่สุดเท่าที่จะทำได้

บทความนี้ช่วยฉันได้มาก: ระบบเครือข่ายผู้เล่นหลายคนของวาล์ว


อีกบทความที่ฉันค้นพบในขณะที่อ่านการทำให้เป็นอันดับวัตถุและคำถามเกี่ยวกับเครือข่ายที่นี่เมื่อไม่กี่สัปดาห์ที่ผ่านมาก็คือบทความนี้ซึ่งอธิบายว่าเอ็นจิน Unreal ทำงานอย่างไร จุดเปรียบเทียบที่ดีสำหรับแหล่ง Valve
Martin Foot

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

อีกหนึ่งเคล็ดลับ: อย่าลืมปฏิบัติต่อความรักนี่อาจเป็นเรื่องที่น่าวิตกมากหากคุณไม่รู้ว่ามีสิ่งนั้นอยู่

จุดดี @Kylotan ยอมรับว่าในบางกรณีข้อมูลเพิ่มเติมนี้ไม่สามารถหลีกเลี่ยงได้ แต่ถ้าฉันพบตัวเองเพิ่มอาร์เรย์หลายที่จะแพ็คเก็ตเดียวที่ฉันจะพิจารณาส่งแพ็คเก็ตหลายแทน
indeed005

1

ปัญหานี้ได้รับการแก้ไขโดย Google และ Facebook:

  1. Protocol Buffersของ Google - Google เป็นผู้ใช้ C ++ รายใหญ่:

    Protocol Buffers เป็นวิธีการเข้ารหัสข้อมูลที่มีโครงสร้างในรูปแบบที่มีประสิทธิภาพและขยายได้ Google ใช้โปรโตคอลบัฟเฟอร์สำหรับโปรโตคอล RPC และรูปแบบไฟล์เกือบทั้งหมด

  2. Apache Thrift (เดิมคือ Facebook):

    Thrift เป็นกรอบซอฟต์แวร์สำหรับการพัฒนาบริการข้ามภาษา มันรวมซอฟแวร์สแต็คกับเครื่องมือสร้างรหัสเพื่อสร้างบริการที่ทำงานอย่างมีประสิทธิภาพและต่อเนื่องระหว่าง C ++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C #, Cocoa, JavaScript, Node.js, Smalltalk และ OCaml


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

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

Google ไม่ต้องการประสิทธิภาพตามเวลาจริง Google ต้องการความน่าเชื่อถือและการอัปเดตซึ่งทั้งสองอย่างนี้ให้บริการโดย Protocol Buffers ความซับซ้อนของการสร้างเวอร์ชันทางเลือกทั้งหมดและการสร้างรหัสสำเร็จรูปจะเพิ่มค่าใช้จ่ายและเมื่อคุณส่งและรับการอัปเดต 1,000 ครั้งในช่วงเวลา 50-100msec จะเพิ่มขึ้น โปรไฟล์โปรโตคอลบัฟเฟอร์หลายรุ่นที่เก่ากว่ากับรหัสซีเรียลไลเซอร์เฉพาะข้อมูลที่อยู่ในมือ @ แน่นอน005มีส่วนสำคัญของมัน
Patrick Hughes

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