อย่าเพิ่งยอมรับ "ใช่หรือไม่ใช่เพราะฉันตอบ" พิมพ์คำตอบตรงนี้เพราะคุณอาจต้องเผชิญหน้ากับปัญหามากมายเกี่ยวกับ UDP ที่จริงแล้วคุณไม่ต้องเผชิญ
ไม่มีคำตอบอื่นใดที่นี่ระบุวิธีที่ชัดเจนในการพิสูจน์เรื่องนี้
ใช้ข้อเท็จจริงง่ายๆ
- ส่วนหัวของ IP คือ 20 ไบต์ไม่ว่าคุณจะใช้โปรโตคอลใด
- ส่วนหัวของ UDP คือ 4 ไบต์
- ส่วนหัวของ TCP คือ 20 ไบต์
ดังนั้นทุกครั้งที่คุณส่งข้อความ 1 ไบต์ลงบรรทัดที่คุณได้ส่งจริง ๆ 25 หรือ 41 ไบต์ขึ้นอยู่กับโพรโทคอลสมมติว่าส่วนหัวของ IP เป็นสิ่งจำเป็น
แหล่งที่มา:
คำแนะนำของฉัน
ใช้สถานการณ์ของคุณในกรณีที่คุณต้องการการโต้ตอบกับเซิร์ฟเวอร์ของลูกค้าประเมินจำนวนลูกค้าจากนั้นทำการคำนวณทางคณิตศาสตร์ตามข้อมูลที่คุณส่งระหว่าง 2
ตัวอย่าง
ให้บอกว่าฉันส่ง 10 ข้อความที่มี 1 ไบต์ต่อการอัปเดตในเกมของฉันและฉันอัปเดตประมาณ 60 เฟรมต่อวินาทีดังนั้นฉันต้องส่ง 60 * 10 = 600 ไบต์ต่อวินาทีของข้อมูลข้อความจริง + ส่วนหัวที่เกี่ยวข้อง
ตอนนี้ขึ้นอยู่กับเกมที่ฉันสามารถส่งทั้งหมดเป็นข้อความเดียวดังนั้นค่าใช้จ่ายของฉันจากเลเยอร์ TCP เพียง 40 ไบต์ (มีประสิทธิภาพค่าใช้จ่ายมากกว่า UDP 20 ไบต์ต่อวินาที) ไม่มีค่าใช้จ่ายที่มีศักยภาพเป็น 600 ไบต์ ( เพราะฉันอาจต้องส่งกระแสข้อความทั้งหมดอีกครั้ง)
ถ้าอย่างไรก็ตามมันสำคัญอย่างยิ่งที่ทุกข้อความจะถูกส่งด้วยตัวเองทันทีที่พร้อมที่จะส่งฉันมี 600 ข้อความ (เช่น 600 ไบต์) + 40 * 600 = 24k มูลค่าของค่าโสหุ้ย TCP หรือค่า UDP ~ 14k ต่อวินาที + ข้อมูลข้อความ 600 ไบต์
อีกครั้งเราถามคำถามว่าข้อความเหล่านี้มีความสำคัญมากแค่ไหนพวกเขามีความถี่บ่อยแค่ไหนและพวกเขาจะถูกแบทช์ในบางวิธีเพื่อลดค่าใช้จ่ายได้อย่างไร
โดยทั่วไปแล้วคุณจะทำอะไรที่แตกต่างกันมาก แต่โดยไม่รู้ว่าข้อมูลดิบที่ส่งมานั้นยากที่จะพิสูจน์ด้วยวิธีใดถ้า TCP เหมาะสมกับสถานการณ์ของคุณมากกว่า UDP
ดังนั้นมันจะทำงานอย่างไร
ถ้าคุณมีเฟรมต่อวินาทีทั่วไปและตำแหน่งนั้นสำคัญ (เพื่อหลีกเลี่ยงการโกงหรือการตัดสินใจที่ไม่ถูกต้อง) คุณจำเป็นต้องรู้ว่าสตรีมเครือข่ายของคุณนั้นใช้งานได้จริง แต่ผู้เล่น 32 คนแต่ละสตรีมที่ 24k + ข้อความไบต์กลับไปกลับมา s + messages) ... นั่นคือประมาณ 10mb / s บรอดแบนด์สายเฉพาะสำหรับส่วนหัวของแต่ละบุคคลขึ้นอยู่กับการส่งอย่างน้อย 1 ข้อความต่อเฟรมจากลูกค้าแต่ละรายไปยังลูกค้าอื่น ๆ ทั้งหมดผ่านเซิร์ฟเวอร์
เห็นได้ชัดว่าคุณจะไม่เขียนรหัสเซิร์ฟเวอร์และลูกค้าของคุณให้ทำงานอย่างนั้นและขนาดของข้อความน่าจะใหญ่กว่ามากและอาจจะน้อยกว่า 1 ไบต์ต่อเฟรมในสถานการณ์ส่วนใหญ่เล็กน้อยดังนั้นจึงเป็นการยากที่จะพูดโดยไม่ต้องเห็นโลกแห่งความเป็นจริง "นี่คือข้อมูลที่ฉันต้องการส่ง"
กรณีของฉัน
ฉันโทรในกรณีของฉันว่ามันเป็นค่าใช้จ่ายที่สมเหตุสมผล แต่นั่นก็ขึ้นอยู่กับว่าฉันจะสร้างกระแสข้อความของฉันได้อย่างไรดังนั้นฉันจึงไม่มีค่าโสหุ้ยมากเมื่อเทียบกับการออกแบบบางอย่าง
TCP ทำงานได้ดีและฉันมี MMO เซิร์ฟเวอร์และไคลเอนต์เฟรมเวิร์กที่ปรับขนาดได้ แต่ฉันไม่ต้องการสตรีมข้อมูลจำนวนมากที่เคยใส่เฟรมหรือแพ็คเก็ตขนาดเล็กจำนวนมากเพราะฉันสามารถแบตช์การโทรได้
สำหรับคนอื่น ๆ : TCP จะไม่ทำและพวกเขาสามารถใช้ UDP ได้ แต่ต้องยอมรับว่าจะไม่ให้การรับรองเกี่ยวกับสิ่งที่พวกเขาได้รับ (รับประกันการสั่งซื้อ / การมาถึง)
ข้อควรพิจารณาอื่น ๆ
เอ็นจิ้นเกมที่มีรหัสไม่ดีจำนวนมากจัดการทุกอย่างบนเธรดหลักบน cpu ดังนั้น cpu มักจะได้รับเวลาเพียงเล็กน้อยในการจัดการโค้ดเน็ตเวิร์กการใช้งานที่ดีของทั้งการบริการและไคลเอนต์จะเป็นแบบซิงค์ทั้งหมด ดึงข้อความเป็นชุด
มีห้องสมุดเครือข่ายที่ดีอยู่บ้าง แต่อย่างที่เห็นที่นี่มีหลายคนที่คิดว่า UDP นั้น "ดีกว่า" เป็นอย่างดีในความต้องการของคุณก่อนและอาจไม่ใช่กรณีและการค้นหาห้องสมุดที่ไม่มี ปัจจัยในสิ่งที่คุณทำอาจส่งผลให้การตั้งค่า TCP ไม่ดีเมื่อเปรียบเทียบกับตัวแปร UDP ใน lib เดียวกัน (ฉันแค่บอกว่าฉันได้เห็นสิ่งนี้แล้วและการทดสอบโหลดได้พิสูจน์แล้ว)
สร้างบางสิ่งก่อนฐานทางเทคนิคของข้อมูลที่คุณต้องการส่งและทดสอบจากนั้นทำการคำนวณทางคณิตศาสตร์เพื่อเพิ่มขนาดการทดสอบกรณีที่แย่ที่สุดโดยการปรับใช้กับระบบคลาวด์และมีคอมพิวเตอร์ 50 เครื่องเรียกใช้ไคลเอนต์ทดสอบเพื่อดูว่าสามารถจัดการได้หรือไม่ ขีด จำกัด ผู้เล่น 32 คนต่อเกม (หรือ จำกัด อะไรก็ได้ที่คุณมี)