ประสิทธิภาพด้านเซิร์ฟเวอร์ FPS ของผู้เล่นหลายคน


12

สิ่งนี้เกี่ยวข้องกับประสิทธิภาพ 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 ดังนั้นฉันต้องทำการเพิ่มประสิทธิภาพอย่างชัดเจนที่นี่

การปรับปรุงที่ชัดเจนที่สุดครั้งแรกคือการตรวจสอบสายตา สิ่งนี้จะลดทั้งจำนวนคนที่สนใจข้อมูลและจำนวนข้อมูลที่ส่งไปยังผู้ที่สนใจ มีเทคนิคอื่นในดินแดนนี้ที่ฉันสามารถลองได้ซึ่งมุ่งเน้นไปที่การลดค่าใช้จ่ายในการดำเนินการออกอากาศของฉันให้น้อยที่สุด?


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

1
ฉันสนใจที่จะรับฟังผลลัพธ์ล่าสุดของคุณคุณสามารถรับประสิทธิภาพที่ดีขึ้นจาก node.js ได้หรือไม่
iddqd

คำตอบ:


5

เซิร์ฟเวอร์ของคุณไม่ควรส่งสถานะผู้เล่นทุกคนไปยังผู้เล่นทุกคนในทุก ๆ ขีด แต่ควรส่งข้อความที่สร้างขึ้นเป็นพิเศษให้กับลูกค้าแต่ละรายว่าทุก ๆ 500 ms บอกว่า "ผู้เล่น x เหล่านี้ในพอร์ตการดูของคุณควรอยู่ที่พิกัดเหล่านี้ใน 500 มิลลิวินาที" ส่วนใหญ่เวลานี้จะทำงานได้ดี แต่ถ้าเซิร์ฟเวอร์ตระหนักว่าได้รับข้อมูลที่ผิดก็แค่ส่งข้อความพิเศษ

สิ่งนี้จะลดทราฟฟิกเครือข่ายลงอย่างมาก

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


ใช่ฉันกำลังเพิ่มการตรวจสอบสายตาในตอนนี้ ที่จริงแล้วกำไรได้น้อยที่สุดจาก 45 ms สำหรับผู้เล่น 25 คนลดลงถึง 35 ms แต่อาจมีค่าใช้จ่ายเพิ่มเติมบางอย่างสำหรับการใช้คำสั่งส่งแยกกันแทนที่จะออกอากาศ และฉันจะส่งข้อความไปที่อินพุตเท่านั้น แต่คุณถูกต้องอาจมีวิธีที่ไม่ต้องเลือกเลยเฉพาะเมื่อได้รับข้อมูลเข้าเท่านั้น
Tesserex

1

ฉันได้พิจารณาความเป็นไปได้ที่โชคร้ายที่ node.js ช้ากว่าที่ใช้ใน TF2 และอาจไม่เหมาะกับงานที่มีความเข้มสูงเช่นนี้

มันอาจเป็นแบบนี้ เซิร์ฟเวอร์ของ TF2 เขียนโดยใช้ C / C ++ และจะเร็วกว่า node.js (ซึ่งถ้าฉันจำได้ถูกต้องให้ใช้ Javascript ที่แปลใน Java)

WebGL Google ตาม Quake ใช้จาวาสำหรับเซิร์ฟเวอร์และรหัสที่มาพบที่นี่: http://code.google.com/p/quake2-gwt-port/ มันอาจจะคุ้มค่าที่จะดูว่าทำอย่างไร ฉันยังสงสัยว่าคุณหมายถึงอะไรเมื่อคุณพูดถึงการมีอัตราเฟรมบนเซิร์ฟเวอร์ ไม่มีเหตุผลที่จะแสดงผลใด ๆ บนเซิร์ฟเวอร์มันควรจะมีสำหรับการประมวลผลคำสั่งที่ส่งโดยลูกค้า

ในที่สุดกฎ "ไม่เชื่อใจลูกค้า" มีความสำคัญมากกว่าการลดการคำนวณที่มีราคาแพงไปยังลูกค้าด้วยความหวังว่าจะปรับปรุงประสิทธิภาพ โดยเฉพาะอย่างยิ่งสิ่งที่สำคัญเท่ากับการตรวจจับการชนกันของข้อมูล เพิ่มทวีคูณดังนั้นเมื่อเกมของคุณใช้จาวาสคริปต์และค่อนข้างง่ายต่อการแฮ็ค (เทียบกับ TF2 ที่คอมไพล์แล้ว)

ฉันรู้ว่านี่ไม่ใช่คำตอบที่มากนัก แต่หวังว่ามันจะนำคุณไปสู่อีกไม่กี่ทิศทางที่อาจช่วยปรับปรุงประสิทธิภาพ


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