ฉันจะติดตามตำแหน่งเรียลไทม์ของผู้เล่นใน MMO ได้อย่างไร


14

คุณติดตามตำแหน่งของผู้เล่นใน MMORPG ได้อย่างไร? ฉันอ่านว่าคุณสามารถใช้ฐานข้อมูลหรือคุณสามารถเก็บพิกัดในไฟล์ ฉันลองใช้ฐานข้อมูล แต่มันก็ช้า ไฟล์จะถูกใช้เพื่อติดตามตำแหน่งของผู้เล่นได้อย่างไร?

คำตอบ:


23

ไฟล์จะถูกใช้เพื่อติดตามตำแหน่งของผู้เล่นได้อย่างไร?

คุณเขียนตำแหน่งผู้เล่นไปยังไฟล์ ตัวอย่างเช่นหากคุณระบุผู้เล่นทุกคนด้วยหมายเลขที่ไม่ซ้ำกัน (หรือ GUID) คุณสามารถใช้ชื่อนั้นเป็นชื่อไฟล์ได้ ในไฟล์เพียงเขียนข้อมูลตำแหน่งในรูปแบบที่คุณสามารถแยกวิเคราะห์ในภายหลัง ตัวอย่างเช่น467239.txtอาจมี20, 3, 19หากผู้เล่น # 467239 อยู่ที่ตำแหน่ง ( x, y, z )

นี่ไม่แตกต่างจากสิ่งที่คุณจะทำกับฐานข้อมูลอย่างไรก็ตาม - ฐานข้อมูลไม่ควร "ช้า" ในการดำเนินการนี้ควรเร็วมาก (อาจเร็วกว่าไฟล์เพราะคุณมีดิสก์โอเวอร์เฮดหรือ IO ล็อคมากขึ้น contention - ถ้าคุณเก็บหลายตำแหน่งต่อไฟล์ - ในแนวทางที่ใช้ระบบไฟล์)

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

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

แต่การเขียนตำแหน่งผู้เล่นทุกคนลงในที่จัดเก็บข้อมูลทุกการอัพเดทนั้นไม่จำเป็นและไม่มีประสิทธิภาพอย่างยิ่ง มันจะไม่เร็วพอที่จะจัดการกับสิ่งที่มีลักษณะคล้ายกับเครื่องเล่นขนาดใหญ่


1
ใช่จริง ๆ แล้วฉันบันทึกตำแหน่งผู้เล่นลงใน postgreSQL ที่รันไทม์ แต่ถ้าฉันเก็บไว้ในหน่วยความจำเซิร์ฟเวอร์ฉันจะอัพเดตตำแหน่งในไคลเอนต์ได้อย่างไร
Baccari

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

1
ฉันพลาดที่จะพูดว่า "ทำกับไฟล์" เพื่ออธิบายว่ามันเลวร้ายยิ่งกว่าการใช้ฐานข้อมูลแล้วอธิบายว่าเป็นปัญหาจริงหรือไม่ ทำไมคุณต้องการคำอธิบายไฟล์ที่ไร้ประโยชน์ในตอนแรก? มันสร้างความสับสนให้กับผู้อ่านทั่วไปเท่านั้นซึ่งไม่เป็นประโยชน์ต่อทุกคน
o0 '

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

13

ตำแหน่งต้องอยู่ใน RAM ขณะใช้งาน (เช่น: ตัวละครของผู้เล่นอยู่ในโลก) คุณไม่สามารถใช้ฐานข้อมูลเป็นหน่วยความจำในการทำงาน คุณทำได้ แต่สิ่งนี้จะแย่มาก

คุณควรบันทึกตำแหน่งเป็นประจำ แต่ไม่ใช่ทุกครั้งที่มีการเปลี่ยนแปลง

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

บันทึก 30 ตำแหน่งในขณะที่ว่าง

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


2
และใช่ใช้เธรดแยกต่างหากเพื่อหลีกเลี่ยงสถานการณ์ที่ฐานข้อมูลอาจบล็อกส่วนที่เหลือของลูปเกมของคุณ
โคโยตี้

4

ฉันมีเธรดแยกต่างหากที่ฉันรอคิวเพื่อบันทึกไฟล์ทุก ๆ 500 ติ๊กของเกม มิฉะนั้นคุณควรเก็บทุกอย่างไว้ใน RAM


4

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

ลูกค้ามีตำแหน่งของตนเองแน่นอนและส่งทิศทางใหม่ (เวกเตอร์) ไปยังเซิร์ฟเวอร์

เซิร์ฟเวอร์มีสิทธิ์เกี่ยวกับตำแหน่งและส่งแพ็คเก็ตตำแหน่งหากลูกค้าย้ายระยะทางที่แน่นอนตั้งแต่การตรวจสอบครั้งล่าสุด

ทั้งหมดนี้เกิดขึ้นในความทรงจำแน่นอน

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