คุณติดตามตำแหน่งของผู้เล่นใน MMORPG ได้อย่างไร? ฉันอ่านว่าคุณสามารถใช้ฐานข้อมูลหรือคุณสามารถเก็บพิกัดในไฟล์ ฉันลองใช้ฐานข้อมูล แต่มันก็ช้า ไฟล์จะถูกใช้เพื่อติดตามตำแหน่งของผู้เล่นได้อย่างไร?
คุณติดตามตำแหน่งของผู้เล่นใน MMORPG ได้อย่างไร? ฉันอ่านว่าคุณสามารถใช้ฐานข้อมูลหรือคุณสามารถเก็บพิกัดในไฟล์ ฉันลองใช้ฐานข้อมูล แต่มันก็ช้า ไฟล์จะถูกใช้เพื่อติดตามตำแหน่งของผู้เล่นได้อย่างไร?
คำตอบ:
ไฟล์จะถูกใช้เพื่อติดตามตำแหน่งของผู้เล่นได้อย่างไร?
คุณเขียนตำแหน่งผู้เล่นไปยังไฟล์ ตัวอย่างเช่นหากคุณระบุผู้เล่นทุกคนด้วยหมายเลขที่ไม่ซ้ำกัน (หรือ GUID) คุณสามารถใช้ชื่อนั้นเป็นชื่อไฟล์ได้ ในไฟล์เพียงเขียนข้อมูลตำแหน่งในรูปแบบที่คุณสามารถแยกวิเคราะห์ในภายหลัง ตัวอย่างเช่น467239.txt
อาจมี20, 3, 19
หากผู้เล่น # 467239 อยู่ที่ตำแหน่ง ( x, y, z )
นี่ไม่แตกต่างจากสิ่งที่คุณจะทำกับฐานข้อมูลอย่างไรก็ตาม - ฐานข้อมูลไม่ควร "ช้า" ในการดำเนินการนี้ควรเร็วมาก (อาจเร็วกว่าไฟล์เพราะคุณมีดิสก์โอเวอร์เฮดหรือ IO ล็อคมากขึ้น contention - ถ้าคุณเก็บหลายตำแหน่งต่อไฟล์ - ในแนวทางที่ใช้ระบบไฟล์)
บางทีคุณพยายามใช้ฐานข้อมูลหรือระบบไฟล์เพื่อจัดเก็บตำแหน่งผู้เล่นที่รันไทม์ ? คุณไม่ควรทำสิ่งนี้เลย
ที่รันไทม์ในเซิร์ฟเวอร์ของคุณตำแหน่งผู้เล่นควรถูกเก็บไว้ในหน่วยความจำและอัพเดทที่นั่นเช่นเดียวกับเกมอื่น ๆ พวกเขาสามารถบันทึกเป็นระยะไปยังดิสก์หรือที่เก็บข้อมูลถาวรอื่น ๆ - ตัวอย่างเช่นเมื่อผู้เล่นวางบันทึกหรือออกจากระบบ
แต่การเขียนตำแหน่งผู้เล่นทุกคนลงในที่จัดเก็บข้อมูลทุกการอัพเดทนั้นไม่จำเป็นและไม่มีประสิทธิภาพอย่างยิ่ง มันจะไม่เร็วพอที่จะจัดการกับสิ่งที่มีลักษณะคล้ายกับเครื่องเล่นขนาดใหญ่
ตำแหน่งต้องอยู่ใน RAM ขณะใช้งาน (เช่น: ตัวละครของผู้เล่นอยู่ในโลก) คุณไม่สามารถใช้ฐานข้อมูลเป็นหน่วยความจำในการทำงาน คุณทำได้ แต่สิ่งนี้จะแย่มาก
คุณควรบันทึกตำแหน่งเป็นประจำ แต่ไม่ใช่ทุกครั้งที่มีการเปลี่ยนแปลง
ฉันจะหลีกเลี่ยงการบันทึกตำแหน่งทั้งหมดในเวลาเดียวกัน หากคุณต้องการรักษาการคงอยู่ในกรณีที่เซิร์ฟเวอร์ล่มคุณควรบันทึกตำแหน่งให้บ่อยที่สุดเท่าที่จะทำได้ แต่ในเวลาว่างของเกม เพียงทำเช่นนี้ด้วยแบทช์
บันทึก 30 ตำแหน่งในขณะที่ว่าง
สำหรับลูกค้า พวกเขาควรได้รับการอัพเดตสถานะเกม (ที่เกี่ยวข้อง) ผ่านการเชื่อมต่อกับซอฟต์แวร์เซิร์ฟเวอร์ของคุณ ไม่ได้มาจากฐานข้อมูล ... นั่นอาจจะเป็นไปไม่ได้ช้าช้าเลวร้ายและกำลังจะถูกรบกวน
ฉันมีเธรดแยกต่างหากที่ฉันรอคิวเพื่อบันทึกไฟล์ทุก ๆ 500 ติ๊กของเกม มิฉะนั้นคุณควรเก็บทุกอย่างไว้ใน RAM
สิ่งที่ฉันทำในเซิร์ฟเวอร์คือเก็บทิศทางผู้เล่น (เวกเตอร์) และตำแหน่งสุดท้ายหากผู้เล่นมีความเร็วฉันจะคำนวณตำแหน่งผู้เล่นใหม่ทุก 2 วินาที
ลูกค้ามีตำแหน่งของตนเองแน่นอนและส่งทิศทางใหม่ (เวกเตอร์) ไปยังเซิร์ฟเวอร์
เซิร์ฟเวอร์มีสิทธิ์เกี่ยวกับตำแหน่งและส่งแพ็คเก็ตตำแหน่งหากลูกค้าย้ายระยะทางที่แน่นอนตั้งแต่การตรวจสอบครั้งล่าสุด
ทั้งหมดนี้เกิดขึ้นในความทรงจำแน่นอน