โปรโตคอล TCP นั้นดีพอสำหรับเกมแบบผู้เล่นหลายคนตามเวลาจริงหรือไม่?


57

ย้อนกลับไปในวันนี้การเชื่อมต่อ TCP ผ่านการเรียกเลขหมาย / ISDN / บรอดแบนด์ความเร็วสูงทำให้เกมขาด ๆ หาย ๆ เนื่องจากแพ็กเก็ตที่ถูกทิ้งเพียงครั้งเดียวส่งผลให้มีการซิงค์ซ้ำ นั่นหมายถึงนักพัฒนาเกมจำนวนมากต้องใช้เลเยอร์ความน่าเชื่อถือของตนเองที่ด้านบนของ UDP หรือพวกเขาใช้ UDP สำหรับข้อความที่อาจจะหล่นหรือได้รับตามลำดับและใช้การเชื่อมต่อ TCP แบบขนานสำหรับข้อมูลที่ต้องเชื่อถือได้

เมื่อพิจารณาจากผู้ใช้โดยเฉลี่ยมีการเชื่อมต่อเครือข่ายที่เร็วขึ้นตอนนี้เกมเรียลไทม์เช่น FPS สามารถให้ประสิทธิภาพที่ดีกว่าการเชื่อมต่อ TCP หรือไม่?


คำตอบ:


36

ฉันจะบอกว่าไม่มี ข้อมูลพิเศษของวัตถุในเกมจะต้องเร็วที่สุดเท่าที่จะเป็นไปได้และสำหรับการใช้ UDP นั้นจะดีกว่าเพราะความน่าเชื่อถือไม่ใช่ 100% ที่สำคัญ แม้ในการเชื่อมต่อที่ทันสมัย ​​UDP ยังช้าพอที่คุณจะต้องพิจารณาเป็นพิเศษสำหรับการแก้ไขและเช่นนั้น แม้ในแง่ของปริมาณข้อมูลที่ถ่ายโอน TCP จะเพิ่มโอเวอร์เฮดที่สำคัญให้กับสิ่งนี้

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


7
ฌอนใช้เงินค่อนข้างมาก ถ้าโดยบังเอิญคุณกำลังพัฒนาเกมใน C # /. NET (คุณรู้ว่าคุณต้องการ!) ฉันได้พบห้องสมุดเครือข่าย Lidgren ( code.google.com/p/lidgren-library-network ) เป็นเครือข่ายที่ดีทางเลือกที่ดี. มันยังให้ส่งข้อความสั่งซื้อที่เชื่อถือได้ผ่าน UDP หากคุณต้องการมัน
Mike Strobel

2
มันไม่ฉลาดเลยที่จะผสมทั้ง TCP และ UDP เป็นผลมาจากวิธีที่ TCP ทำการควบคุมการไหลของข้อมูล (ที่มา: isoc.org/INET97/proceedings/F3/F3_1.HTM )
Jason Kozak

4
โปรดทราบว่าในบางกรณีผู้ใช้ของคุณจะนั่งอยู่ด้านหลัง ISPs ที่บล็อกการรับส่งข้อมูล UDP มีการตั้งค่าเราเตอร์ที่ป้องกันการรับส่งข้อมูล UDP หรืออย่างอื่นอยู่ในสถานการณ์ที่ใช้ UDP น้อยกว่าอุดมคติ ในกรณีดังกล่าวหากเกมของคุณสามารถรองรับได้ความสามารถในการถอยกลับไปสู่การสื่อสาร TCP นั้นค่อนข้างมีประโยชน์
Charles Ellis

อีกจุดที่ + สำหรับ UD คือธรรมชาติของแพ็คเก็ตที่เน้นคุณต้องเลียนแบบนี้ใน TCP หากจำเป็น (boilderplatecode) เศร้าโปรโตคอลที่ทันสมัยมากขึ้นจะไม่ได้รับการสนับสนุนโดย Windows (นี้ครับ)
Quonux

11

เนื่องจาก Flash ไม่รองรับ UDP โดยการดูเกม Flash แบบผู้เล่นหลายคนคุณจะได้รับความคิดที่ดีว่า TCP / IP นั้นเป็นไปได้อย่างไร โดยทั่วไปคุณสามารถสร้างเกมเรียลไทม์ได้ตราบใดที่เกมไม่ต้องพึ่งพาเวลาตอบสนองที่รวดเร็ว ตัวอย่างสองตัวอย่าง:

http://www.xgenstudios.com/play/stickarena

http://everybodyedits.com/

หากคุณมีตัวเลือกในการใช้ UDP คุณควรจริง ๆ แต่ด้วย Flash คุณเศร้าที่ไม่ได้รับตัวเลือกนั้น


8

มันขึ้นอยู่กับ.

เกมอย่าง World of Warcraft ใช้ TCP สำหรับการสื่อสารเนื่องจากคุณหลีกเลี่ยงปัญหามากมายโดยใช้งาน อาจมีการ ping สูงกว่าเป็นผล แต่สำหรับหลาย ๆ เกมมันเป็นที่ยอมรับ คุณต้องทำการแก้ไขเชิงพื้นที่แม้ว่าคุณจะใช้ UDP เป็นโปรโตคอลของคุณ


1
มันไม่ใช่แค่ปิง มีเหตุผลว่าทำไมไม่มีการชนกันของผู้เล่นใน WoW มันยากเกินไปที่จะทำดี WoW สามารถใช้ TCP ได้เพราะตำแหน่งที่คุณอยู่นั้นไม่ค่อยสำคัญเท่าไหร่ การกำหนดเป้าหมายและการโจมตีไม่ได้ขึ้นอยู่กับตำแหน่งที่แท้จริงของสัตว์ประหลาดหรือผู้เล่นศัตรู หากคุณสนใจสิ่งเหล่านี้ TCP จะส่งผลกระทบต่อประสบการณ์การเล่น
Nuoji

6

หากสถาปัตยกรรมไคลเอนต์ / เซิร์ฟเวอร์ของคุณสะอาดเลเยอร์การขนส่ง (เกือบ) จะไม่สำคัญ

TCP มีข้อบกพร่องบางประการ แต่สิ่งเหล่านี้สามารถแก้ไขได้ง่าย

ดังนั้นใช่ TCP และสมองเป็นสิ่งที่คุณต้องการ

ด้วยการตั้งค่าเครือข่ายทั่วไป (พร็อกซีไฟร์วอลล์ ฯลฯ ) วันนี้ UDP ค่อนข้างไร้ประโยชน์สำหรับเกมทั้งหมด (อ่าน: LAN)


7
หากคุณลงคะแนนโปรดแสดงความคิดเห็นว่าทำไม เราใช้ TCP และไม่เคยมีปัญหาเดียวกับมัน
Andreas

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

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

มีสาเหตุหลายประการที่คุณควรใช้ UDP แทน TCP หากเวลาแฝงเป็นเรื่องที่กังวล หากคุณไม่สนใจเวลาในการตอบสนองและ / หรือคุณสามารถคาดการณ์ด้านไคลเอนต์ได้เพียงพอ TCP ก็เพียงพอแล้ว ในกรณีของเกมเรียลไทม์ ลืม TCP
Nuoji

6

มันได้รับการยอมรับที่ดีที่สุดที่ใช้ TCP แทน UDP - ถ้าคุณปิดอัลกอริทึม Nagle ของ

เมื่อคุณปิด Nagle คุณจะมีความเร็ว UDP เป็นส่วนใหญ่และจะสามารถสร้างเกมตอบโต้ได้อย่างสมบูรณ์ แน่นอนฉันได้สร้างเกมดังกล่าวโดยใช้ TCP ใน Flash:

http://2dspacemmo.wildbunny.co.uk

หวังว่าจะช่วย!


แอปที่ไม่สามารถใช้งานได้ที่ลิงค์ของคุณ
วิศวกร

ลิงค์หมุนสมบูรณ์ครับ ฉันได้รับการทดสอบเซิร์ฟเวอร์ Apache
Gustavo Maciel

4

สำหรับเกม FPS เราใช้ UDP เสมอ โดยเฉพาะอย่างยิ่งถ้าคุณกำลังทำปืน twitch ที่ pings สำคัญ


4

มันขึ้นอยู่กับประเภทของเกม

บางเกมเช่น RTS เล่นได้ดีกว่า TCP และมักใช้ TCP ตลอดเวลา

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

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


โปรดทราบว่าการใช้งานของคุณจะต้องจัดการกับแง่มุมของการทิ้งแพ็กเก็ตล่าช้าเนื่องจาก UDP จะถือว่าเป็นเดตาแกรมที่ได้รับ
Guvante

3

อย่าเพิ่งยอมรับ "ใช่หรือไม่ใช่เพราะฉันตอบ" พิมพ์คำตอบตรงนี้เพราะคุณอาจต้องเผชิญหน้ากับปัญหามากมายเกี่ยวกับ 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 คนต่อเกม (หรือ จำกัด อะไรก็ได้ที่คุณมี)


2

ฉันไม่คิดว่าเป็นเช่นนั้น ... เกมที่การถ่ายโอนข้อมูลบ่อยมาก (เมื่อเลื่อนเมาส์หรือกดลง) ควรใช้ UDP มันจะช้าแม้บน LAN หากใช้ TCP

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