ฉันจะเข้าใกล้สิ่งนี้จากการสนทนาระดับสูงจากนั้นพยายามหาคำถามของคุณ เพื่อประโยชน์ในการเปิดเผยข้อมูลฉันไม่ได้มีประสบการณ์ส่วนตัวในการใช้ socket.io แต่มีการสัมผัสกับพื้นที่ปัญหามากมายเกี่ยวกับ MMORPG
การออกแบบสถาปัตยกรรมเครือข่ายของเครื่องยนต์ MMORPGs และ / หรือการเลือกโครงการกลางหรือโอเพ่นซอร์สเพื่อให้การทำงานเป็นหนึ่งในการตัดสินใจที่ท้าทายมากขึ้นซึ่งได้รับอิทธิพลจากการออกแบบเกมงบประมาณและความเชี่ยวชาญด้านเทคนิคของทีม ตัวเลือกสุดท้ายจะมีผลต่อการตัดสินใจทางสถาปัตยกรรมอื่น ๆ (และบางครั้งก็ออกแบบการตัดสินใจด้วย)
ในฐานะนักพัฒนา MMORPG เราวางแผนเพื่อความสำเร็จที่ยิ่งใหญ่ (หรือที่รู้จักกันในชื่อความสำเร็จอย่างหายนะ) ซึ่งมีจำนวนมากที่เปิดสัญญาณไฟเตือนและไซเรน หนึ่งในจำนวนมากที่น่ากลัวที่อัพอัลกอริธึมคือ N-squared (N ^ 2 ต่อจากนี้) ในคำถามของคุณสิ่งแรกที่กระโดดออกมาหาฉันคือมันฟังดูเหมือนการออกแบบที่เรียกว่าเอนทิตีเพื่อเผยแพร่ข้อมูลไปยัง หน่วยงานที่เชื่อมต่ออื่น ๆ ทั้งหมด นี่คือตัวอย่างคลาสสิกของปัญหา N ^ 2
โดยทั่วไปแล้ว MMOs จะจัดการกับปัญหา N ^ 2 โดยการโจมตีปัญหาด้วยวิธีต่างๆ ระบบการรับรู้ (สถานการณ์เชิงพื้นที่ ฯลฯ ) ที่หน่วยงานตระหนักถึงเซตย่อยบางส่วนของหน่วยงานอื่น ๆ ทั้งหมดการแบ่งผู้เล่นออกเป็น "เศษ" ที่แตกต่างกันการแบ่งผู้เล่นใน "โซน" และ / หรืออินสแตนซ์ ผู้เล่นจากการรวมตัวกัน (พายุเทเลพอร์ตของ Asheron Call) ฯลฯ
MMORPG ส่วนใหญ่และเอ็นจิ้น FPS จำนวนมากมีสถาปัตยกรรมเครือข่ายที่ซับซ้อนพอสมควรซึ่งสนับสนุนคุณสมบัติที่หลากหลาย ได้แก่ :
- เส้นทางการสื่อสารที่เชื่อถือได้และไม่น่าเชื่อถือ (TCP การใช้งานที่กำหนดเองของแพ็คเก็ต UDP และ UDP ที่เชื่อถือได้)
- การสร้างแบนด์วิดท์ (การจัดลำดับความสำคัญอายุการใช้งาน ฯลฯ )
- การจำลองแบบอัตโนมัติของข้อมูลภาคสนาม / viarable และการเรียกใช้ฟังก์ชั่น
- ชุดข้อมูลอะตอม (เช่นข้อมูลที่สื่อสารด้วยกัน)
- การอัปเดตแบบไม่ต่อเนื่อง (เช่นที่การเปลี่ยนทุกครั้งสำคัญ)
- การแก้ไขความล่าช้า
- เทคนิคที่หลากหลายเพื่อให้ลูกค้ารู้สึกตอบสนอง
ฉันพบว่าเอกสารระบบเครือข่าย Unrealและเอกสารระบบเครือข่ายValveให้ข้อมูลเบื้องต้นที่ดีสำหรับปัญหาที่หลากหลาย
ดังนั้นตอนนี้ให้เข้าใกล้คำถาม
เป็นความคิดที่ดีกว่าหรือไม่ที่จะ 'รวบรวม' สิ่งเหล่านี้และออกอากาศพวกเขาพูดครั้งเดียวใน 1/10 ของวินาที?
มันยากที่จะให้คำตอบที่ง่ายหรือไม่ตอบที่นี่ ... เพราะขึ้นอยู่กับขนาด (จำนวนเอนทิตีที่สังเกต) ความถี่ของการอัปเดตและขนาดของการอัปเดต ตัวอย่างเช่นการรวบรวมพวกเขาทั้งหมดอาจผิดพลาดอย่างน่ากลัวหากขนาดของการอัปเดตอาจทำให้บัฟเฟอร์เสียหาย
โดยทั่วไปแล้วไคลเอนต์สำหรับเกม MMORPGs และ FPS นั้นจะได้รับการออกแบบเพื่อให้เห็นภาพสิ่งที่ "ดู" ถูกต้องแม้ว่าพวกเขาจะไม่ได้รับการอัพเดตสำหรับเฟรมอัปเดตมากกว่าที่เป็น "ปกติ" ก็ตาม เมื่อใช้การสื่อสารที่ไม่น่าเชื่อถือ (UDP) คุณสามารถคาดหวังว่าจะสูญเสียการอัปเดตจำนวนหนึ่งไปสู่โมฆะลูกค้าสามารถทำสิ่งนี้ได้โดยส่งการอัปเดตบ่อยกว่าที่ใช้กับการขนส่งที่เชื่อถือได้
จากการตรวจสอบคร่าวๆของเอกสาร socket.io ดูเหมือนว่ามันรองรับเส้นทางการสื่อสารทั้งที่เชื่อถือได้และไม่น่าเชื่อถือ (ระเหยในคำศัพท์)
ฉันจะเข้าหาสิ่งนี้ก่อนโดยการแก้ปัญหาการอัพเดตความถี่ที่จำเป็นต้องมี ...
หากผู้เล่นเคลื่อนที่เป็นเส้นตรงในอัตราคงที่ความถี่การอัพเดทที่ต่ำกว่านั้นเป็นสิ่งที่ดีเพราะผู้สังเกตการณ์สามารถทำนายด้วยความแม่นยำสูงซึ่งผู้เล่นจะอยู่ที่จุดใดก็ได้ในเวลา เมื่อผู้เล่นหมุนเป็นวงแคบหรือทำการเปลี่ยนทิศทางอย่างรวดเร็วจำเป็นต้องทำการอัพเดทบ่อยครั้งมากขึ้น ในทางกลับกันเมื่อผู้เล่นไม่เคลื่อนไหวเลยไม่มีเหตุผลที่จะส่งการอัพเดทการเคลื่อนไหวเลย
ไม่ว่าอะไรก็ตามอาจไม่จำเป็น (โดยทั่วไป) ในการส่งการอัพเดตทุกเฟรมจากไคลเอนต์ไปยังเซิร์ฟเวอร์ เซิร์ฟเวอร์อาจเลือกที่จะส่งข้อความในแต่ละเฟรมที่มีหรือชะลอพวกเขา (ดูแบนด์วิดธ์การสร้างการจัดลำดับความสำคัญและอายุการใช้งานการปรับปรุง)
การอัปเดตประเภทอื่นมีลักษณะแตกต่างกัน ... ตัวอย่างเช่นให้พิจารณาฟิลด์ "สุขภาพ" ที่ได้รับการแก้ไขเมื่อผู้เล่นหรือสิ่งมีชีวิตเสียหาย วิธีหนึ่งที่จะใช้สิ่งนี้คือการถ่ายทอดการเปลี่ยนแปลงแต่ละอย่างทันทีเมื่อมันเกิดขึ้น แต่สิ่งนี้นำไปสู่การสูญเสียการประมวลผลและแบนด์วิดท์หากค่าถูกเปลี่ยนหลายครั้งในเฟรมหรือเฟรมที่ต่อเนื่องกัน เฉพาะล่าสุดจะถูกส่งไปยังลูกค้าที่สังเกตเมื่อพวกเขามีแบนด์วิดธ์ที่มีอยู่)
ลูกค้าควรส่งข้อความที่แตกต่างกันจำนวนมาก (ได้รับประสบการณ์คลิกที่รายการ) ทันทีที่เกิดขึ้นหรือแทนที่จะรวบรวมเพียงข้อความเดียว?
อีกครั้งไม่มีคำตอบใช่หรือไม่ง่ายกำลังจะไปที่นี่ ขึ้นอยู่กับสิ่งที่คุณหมายถึงโดยการรวบรวม ... ทั้งสองอาจถูกภายใต้สถานการณ์ที่แตกต่างกันและยังขึ้นอยู่กับการใช้งานของเลเยอร์เครือข่าย
การรวบรวมข้อความสำหรับเอนทิตีเฉพาะที่จะส่งเป็นข้อความเดียวสามารถ (ขึ้นอยู่กับการนำไปใช้) ลดแบนด์วิดท์สำหรับการส่งข้อความ (ลดต้นทุนของคุณ) ในทางกลับกัน (ขึ้นอยู่กับการนำไปใช้เช่นการแมปฟิลด์ / ค่า ข้อกำหนดเมื่อเปรียบเทียบกับประเภทข้อความที่ระบุง่ายกว่า
ตรวจสอบเอกสาร socket.io มันจะปรากฏให้ฉันว่าค่าใช้จ่ายข้อความอยู่บนปลายสูงของสเปกตรัมซึ่งจะชอบรวบรวมการปรับปรุงเพื่อส่งเป็นข้อความรวมเมื่อเทียบกับการปรับปรุงเดียวมากมาย
ฉันขอแนะนำให้ตรวจสอบการอัปเดตทั้งหมดที่คุณพิจารณาการจำลองแบบเช่น MMORPGs และ FPS ส่วนใหญ่ไม่รำคาญที่จะส่งผู้เล่นที่คลิกบนเหตุการณ์ X ไปยังการสังเกตลูกค้าเว้นแต่ว่าจะส่งผลให้เกิดการเปลี่ยนแปลงสถานะสำหรับวัตถุที่พวกเขาตระหนักเช่นกัน .