สิ่งนี้เกี่ยวข้องกับประสิทธิภาพ MMOยกเว้นคำถามนั้นเกี่ยวกับแบนด์วิดท์ นี่เป็นเรื่องของ cpu load
ฉันรวบรวม FPS ง่าย ๆ โดยใช้ node.js และ webGL มันง่ายมาก ๆ เหมือนโคลน BuddyMaze ของ MIDI Maze เกิดขึ้นน้อยมากทุกคนเคลื่อนที่ในสองมิติ (ไม่มีความสูง) ยิงขีปนาวุธง่าย ๆ แล้ววิ่งเข้าไปในกำแพง
ตอนนี้ถ้าฉันทำการเชื่อมต่อหลายครั้งไปยังเซิร์ฟเวอร์ที่ผู้เล่นทุกคนถ่ายภาพอย่างรวดเร็วในขณะที่หมุนเป็นวงกลมฉันสามารถรับผู้เล่นได้ประมาณ 15 - 20 คนในเกมก่อนที่เซิร์ฟเวอร์จะคายแกนและช้าลง และนี่คือเมื่อทำงานที่ 30 fps บนเซิร์ฟเวอร์ ที่ 10 fps ฉันได้รับการเชื่อมต่อประมาณ 25 - 30 นี่เป็นสิ่งที่ไม่ดีนักเนื่องจากเกมจะมีอะไรอีกมากมายที่ต้องทำในไม่ช้าและฉันจะต้องเพิ่มผู้เล่นให้มากขึ้นเพื่อให้เป็นไปได้
พี่ชายของฉันเพิ่งชี้ให้เห็นสถิติบางอย่างเกี่ยวกับเซิร์ฟเวอร์ TF2 ของเพื่อนร่วมงานของเขา เซิร์ฟเวอร์ของเขามีสเปคต่ำกว่าของเรา แต่มันรัน TF2 ซึ่งเป็นเกมที่ซับซ้อนมากขึ้นอย่างมากที่ 500 เห็บต่อวินาทีต่อวินาทีโดยมีผู้ใช้ 36 คนต่อคอร์ นอกจากนี้เรายังใช้แบนด์วิดท์มากกว่าที่ทำอยู่ แต่เรายังไม่ได้พยายามลดขนาดนั้นลง
เป็นไปได้อย่างไร? เทคนิคอะไรที่มีเพื่อเพิ่มประสิทธิภาพของเซิร์ฟเวอร์ในขนาดนี้ บางสิ่งที่ฉันรู้รวมถึง:
- ลดอัตราเฟรมบนเซิร์ฟเวอร์และแก้ไขตำแหน่งบนไคลเอ็นต์ ฉันได้รับประโยชน์ แต่เห็นได้ชัดว่าเซิร์ฟเวอร์ TF2 ไม่ได้สนใจสิ่งนี้
- การทำสิ่งที่มีราคาแพงเช่นการตรวจจับการชนกันของไคลเอนต์และตรวจสอบว่านาน ๆ ครั้งบนเซิร์ฟเวอร์ ฉันยังไม่ได้ขยับมันมากกว่านี้ฉันจะคืนนี้ ถึงอย่างนั้นฉันก็ไม่คาดหวังว่าจะได้กำไรมหาศาลเช่นนี้
- แบ่งสนามเด็กเล่นออกเป็นภูมิภาค (ต้นไม้สี่ต้น) เพื่อลดการคำนวณ ยังไม่ได้มีโอกาสนี้
- ฉันได้พิจารณาความเป็นไปได้ที่โชคร้ายที่ node.js ช้ากว่าที่ใช้ใน TF2 และอาจไม่เหมาะกับงานที่มีความเข้มสูงเช่นนี้
- มันทั้งหมดอยู่ในเวทย์มนตร์การกำหนดค่าเซิร์ฟเวอร์หรือไม่?
ดังนั้นเทคนิคอื่น ๆ ของอุตสาหกรรมที่ต้องทำเพียงขั้นต่ำที่จำเป็นบนเซิร์ฟเวอร์ แต่ยังมีประสบการณ์การเล่นเกมที่สมบูรณ์แบบ? มีข้อขัดแย้งอย่างใหญ่หลวงระหว่าง "เลื่อนเวลาไปที่ลูกค้าเพื่อประหยัดเวลาของซีพียู" และ "ไม่ไว้วางใจลูกค้า" ดังนั้นอาจช่วยให้ทราบได้ว่าการลากเส้นนั้นเกิดขึ้นในสถานการณ์ต่าง ๆ หรือไม่?
ปรับปรุง
การทำโปรไฟล์เป็นมนต์เดียวที่ฉันเคยพบว่าไม่ผิดพลาดจริง ๆ ฉันห่อฟังก์ชั่นจับเวลารอบรหัสของฉัน (ขอบคุณ FP!) และค้นพบสิ่งที่ฉันไม่คาดคิด: การส่งข้อมูลไปยังบัญชีลูกค้าเกือบตลอดเวลา โดยเฉพาะประมาณ 90% ของมัน การทดสอบเพิ่มเติมแสดงให้เห็นว่าเวลานี้ขึ้นอยู่กับจำนวนลูกค้าและขนาดของข้อมูล แต่มากขึ้นดังนั้นหลัง ในการโหลดผู้ใช้ 20 คนฉันลดเวลาออกอากาศ 90% จาก 24ms ลงเหลือเพียง 2ms โดยส่ง "{}" เท่านั้นแทนที่จะส่งข้อมูลแบบเต็ม แต่มีผู้ใช้เพียง 5 รายการออกอากาศใช้เวลาประมาณ 0.5 ms ดังนั้นฉันต้องทำการเพิ่มประสิทธิภาพอย่างชัดเจนที่นี่
การปรับปรุงที่ชัดเจนที่สุดครั้งแรกคือการตรวจสอบสายตา สิ่งนี้จะลดทั้งจำนวนคนที่สนใจข้อมูลและจำนวนข้อมูลที่ส่งไปยังผู้ที่สนใจ มีเทคนิคอื่นในดินแดนนี้ที่ฉันสามารถลองได้ซึ่งมุ่งเน้นไปที่การลดค่าใช้จ่ายในการดำเนินการออกอากาศของฉันให้น้อยที่สุด?