หลักการออกแบบเกมสำหรับผู้เล่นหลายคนแบบเรียลไทม์สำหรับ Node.js


12

ฉันได้อ่านวาล์วบทความเกี่ยวกับเครือข่ายผู้เล่นหลายที่ได้รับการดัดแปลงมาจาก Yahn เนียกระดาษ 2001 เรียกว่าแฝงชดเชยวิธีการในไคลเอ็นต์ / เซิร์ฟเวอร์ในเกมการออกแบบโปรโตคอลและการเพิ่มประสิทธิภาพ ฉันกำลังสร้างเกมผู้เล่นหลายคนเรียลไทม์โดยใช้เซิร์ฟเวอร์ node.js ที่เชื่อมต่อกับลูกค้าผ่าน socket.io และฉันมีคำถามสองสามข้อเกี่ยวกับหลักการที่อธิบายไว้ด้านล่าง:

การแก้ไขเอนทิตี

[การแก้ไข] ป้องกันการเคลื่อนไหวที่กระวนกระวายใจซึ่งสิ่งนี้มักจะนำไปสู่โดยการอัพเดทเซิร์ฟเวอร์บัฟเฟอร์จากนั้นเล่นกลับด้วยช่องว่างที่สอดแทรกอย่างราบรื่นระหว่าง นอกจากนี้ยังสามารถป้องกันข้อบกพร่องที่เกิดจากการสูญเสียต

การทำนายฝั่งไคลเอ็นต์

การทำนายคือแนวคิดของลูกค้าที่ทำนายผลกระทบของการกระทำของผู้เล่นท้องถิ่นโดยไม่ต้องรอให้เซิร์ฟเวอร์ยืนยัน สถานะที่คาดการณ์ของเอนทิตีถูกทดสอบกับคำสั่งเซิร์ฟเวอร์เมื่อมาถึงจนกว่าจะตรวจจับคู่หรือจับคู่ผิด

การชดเชยความล่าช้า

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

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

  • ฉันสามารถสื่อสารระหว่างเซิร์ฟเวอร์กับเว็บเบราว์เซอร์และกลับกันโดยใช้ UDP และ Node.js ได้หรือไม่

  • เนื่องจากกระดาษมีอายุเกินหนึ่งทศวรรษหลักการเหล่านี้ยังคงใช้งานอยู่หรือมีเทคโนโลยีอื่นปรากฏขึ้นมา?

ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชมมาก


1
คุณไม่จำเป็นต้องใช้ UDP สำหรับเกมที่มีผู้เล่นหลายคนตรงกันข้ามกับความเชื่อที่ได้รับความนิยม เรียนรู้จากสิ่งที่ดีที่สุด; WoW ใช้ TCP และฉันเชื่อว่าเกมที่มีผู้เล่นหลายคนด้วย AAA หลายคนทำได้ ผู้คนเพียงทำตามคำแนะนำจากนั้นพวกเขาก็ใช้เวลาอีก 5 เดือนในการติดตั้ง TCP ที่แย่และช้า!
jcora

1
(เว้นแต่ของหลักสูตร, คุณแน่ใจว่าคุณมีความรู้และทรัพยากรในการพัฒนาโปรโตคอลที่ดี ontop ของ UDP ที่สามารถใช้ข้อดีของมัน.)
jcora

1
ไม่มีเกม AAA FPS ที่ใช้ TCP มันช้าเกินไปสำหรับเกมที่ต้องอัพเดทแบบเรียลไทม์ แต่เนื่องจากเขาไม่ได้เขียนเกมแอคชั่นเขาควรจะหนีไปกับ TCP
Brendan Lesniak

@Yannbane ไม่ทราบว่า WoW ใช้ TCP หรือไม่ ดูเหมือนว่า MMO จำนวนมากทำจากสิ่งที่ฉันสามารถหาได้ ทำให้ฉันมีความมั่นใจมากขึ้นในการเขียนเกมแบบผู้เล่นหลายคนด้วย HTML5 ขอบคุณ!
dreta

คำตอบ:


6
  • หลักการลดผลกระทบของความล่าช้านั้นเหมือนกันโดยไม่คำนึงถึงโปรโตคอลการขนส่ง การสูญเสียแพ็คเก็ตเป็นอีกหัวข้อหนึ่ง - สำหรับแพ็คเก็ตหลายประเภทที่สูญเสียบางอย่างไม่สำคัญเพราะการอัปเดตครั้งต่อไปอาจมาถึงแล้ว - UPD มีข้อดีอยู่ที่นี่ แต่เมื่อคุณต้องการทำให้แน่ใจว่ามีการส่งแพ็คเก็ต รหัสตอบรับที่ต้องทำด้วย UDP
  • Node.js รองรับ UDP แต่เว็บเบราว์เซอร์ไม่ (ไม่มีปลั๊กอิน) วิธีเรียลไทม์ที่ดีที่สุดสำหรับการสื่อสารระหว่างสองคือ Web Sockets ซึ่งโดยทั่วไปจะเป็น TCP แต่สำหรับการสื่อสารคุณอาจต้องการใช้ Socket.IO ซึ่งเป็นทางเลือกสำหรับเบราว์เซอร์ที่ไม่รองรับเว็บซ็อกเก็ต
  • หลักการยังคงเหมือนเดิม

1
ฉันเดาว่าสิ่งนี้ล้าสมัยแล้ว - WebRTC ควรเป็นวิธีการใช้การสื่อสารแบบ UDP ใช่ไหม
Nikolay Tsenkov

4

คุณควรตรวจสอบบทความเกี่ยวกับเกม Realtime Multiplayer ใน HTML5 ที่โพสต์บนเว็บไซต์ buildnewgames.com โดย Sven Bergstrom เขาพูดถึงสิ่งเดียวกันและเขาใช้ Node.JS ฉันมีสิ่งที่คล้ายกันไปด้วยตัวเอง ตอนนี้ฉันกำลังค้นคว้าเพิ่มเติมเกี่ยวกับการคาดการณ์และการแก้ไขฝั่งไคลเอ็นต์และตัวฉันเองก่อนที่จะพยายามจัดการกับสิ่งที่เหลืออยู่

ฉันเชื่อว่ามันเป็นไปได้ที่จะทำเช่นนี้กับ Socket.IO และ Node แต่เทคโนโลยียังใหม่อยู่ดังนั้นจะมีเอกสารขนาดเล็กและไม่มีแนวทางในการนำไปปฏิบัติ ฉันขอแนะนำให้ทำในสิ่งที่ฉันกำลังทำและศึกษาวิชาในรายละเอียดที่ยอดเยี่ยมในแง่นามธรรมระดับสูงแล้วลองใช้ด้วยตนเอง


1

ฉันเชื่อว่าเทคโนโลยีเหมือนกันมาก นอกจากนี้แนวคิดไม่ได้ขึ้นอยู่กับภาษาที่คุณใช้หรือว่าคุณทำ UDP หรือ TCP ฉันเขียนคำอธิบายโดยละเอียดเกี่ยวกับเรื่องทั้งหมดที่นี่http://www.gabrielgambetta.com/fpm1.htmlรวมถึงไดอะแกรมสวย ๆ :)

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