ประเภทของตัวแปรประเภทใดที่ตำแหน่งผู้เล่นเก็บไว้ใน MMORPG เช่น WoW


18

ฉันเคยได้ยิน J. Carmack พูดอย่างรวดเร็วเกี่ยวกับเรื่องนี้ ...

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

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

คำตอบ:


26

สกอตต์ Bilas ทำงานในDungeon Siegeและเขียนกระดาษ"ความต่อเนื่องโลกของ Dungeon Siege" ในขณะที่ Dungeon Siege ไม่ใช่ MMO แต่ก็มีโลกและเขาพูดถึงการวางตำแหน่งของผู้เล่นในกระดาษของเขา ฉันพบว่ามันเป็นการอ่านที่ยอดเยี่ยม นี่คือส่วนที่เกี่ยวข้อง:

ปัญหาความแม่นยำ

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

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

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

วิธีการแก้ปัญหาของเราประกอบด้วยระบบพิกัดตามโหนดสัมพันธ์ซึ่งแต่ละชิ้นของรูปทรงเรขาคณิต (Siege Node) มีพื้นที่ประสานงานของตัวเองและมีการเชื่อมโยงเชิงพื้นที่กับรูปทรงเรขาคณิตที่อยู่ใกล้เคียงผ่านประตูที่ใช้ร่วมกันกับเพื่อนบ้านเหล่านั้น การจัดเรียงของโหนดที่เชื่อมต่อกันด้วยประตูเป็นกราฟต่อเนื่องที่แสดงถึงแผนที่โลกทั้งหมด ระบบโหนดนี้มีวิวัฒนาการตลอดเวลาจากเป้าหมายดั้งเดิมของการรักษาความแม่นยำของ FPU ให้กลายเป็นวิธีการหลักของการแบ่งพื้นที่อย่างมีประสิทธิภาพและรากของการปรับให้เหมาะสมจำนวนนับไม่ถ้วน

เพื่อห่อหุ้มแนวคิดของตำแหน่ง 3 มิติที่สัมพันธ์กับโหนดที่เฉพาะเจาะจงเวกเตอร์แบบดั้งเดิม (x, y, z) จะต้องมีการเพิ่มด้วย ID ของโหนด (x, y, z, โหนด) และเป็นตัวแทนของการชดเชยจากแหล่งกำเนิด ของโหนดที่ระบุแทน tuple 4 ตัวนี้ถูกห่อหุ้มด้วยตำแหน่ง Siege Node หรือ SiegePos ต่อมาเราได้เพิ่ม SiegeRot (quaternion, node) เพื่อจัดการการเปรียบเทียบระหว่างการวางแนวข้ามโหนด

วลี“ ไม่มีที่ว่างในโลก” กลายเป็นมนต์ของทีมถึงแม้ว่ามันจะใช้เวลาหลายปีกว่าที่ทุกคนจะคลี่คลายความหมายของมัน

คุณสามารถดูข้อมูลเพิ่มเติมของเอกสารของเขาใน Dungeon Siege ที่นี่


นั่นดูเหมือนจะเป็นคำตอบที่หนามาก! ขอบคุณมาก! ฉันคงสงสัยว่าเกมของวันนี้จะใช้ตัวเลขที่มีตัวเลขเหมือนจำนวนเต็มของ gmp หรือไม่
jokoon

3

สำหรับโลกไร้ดินแดนอันกว้างใหญ่ฉันจะไปหาจุดสุดยอดความแม่นยำสองเท่าหรือจุดลอยที่มีชิ้นเล็ก ๆ แบ่งดินแดน

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

ถ้าคุณมีโซนเล็ก ๆ ฉันว่าโฟลตจะเพียงพอ


ความแม่นยำสองเท่าทำให้เกิดประสิทธิภาพและหน่วยความจำได้อย่างรวดเร็ว (x, y, z, zone) คือ 16 ไบต์; (x, y, z) จะเพิ่มเป็นสองเท่าเป็นอย่างน้อย 24 คุณไม่สามารถทำคณิตศาสตร์อย่างรวดเร็วกับพวกเขาและคุณไม่สามารถใช้พวกเขาในกราฟิกการ์ด

การ์ดเฟอร์มีสามารถใช้ความแม่นยำสองเท่า;) แต่ใช่วิธีการที่แยกกันออกมาคือคำตอบที่แนะนำ
Nailer

2

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

จำไว้ว่ามีอย่างน้อย 4 โซน 4 ทวีปที่สำคัญ ฉันไม่คิดว่าคนใดคนหนึ่งมากกว่า 10km อยู่ข้างหนึ่ง ตัวอย่างเช่นบล็อกนี้ก่อนการขยายล่าสุดจะคำนวณพื้นที่ที่สามารถเดินทางได้ทั้งหมดเป็น 41 ตารางไมล์ สนามรบทั้งหมดทุกอินสแตนซ์อยู่ในโซนของตัวเองและประสานงานพื้นที่ด้วย

การใช้ LUA API คุณสามารถรับตำแหน่งของผู้เล่น GetPlayerMapPosition () คืนค่าการลอยสองค่าจาก 0 ถึง 1 เป็นสัดส่วนตามแผนที่โลกทั้งหมด


1

สำหรับ WoW ฉันคาดหวังว่าพวกเขาใช้โฟลต x / y / z อย่างง่าย - แต่เกี่ยวข้องกับ 'โซน' ที่เฉพาะเจาะจง

สิ่งนี้จะช่วยจัดการ 'โซนที่เคลื่อนไหว' ตัวอย่างเช่นเรือและเรือเหาะ


1

โดยปกติเกมออนไลน์เช่น Wow, Tibia เป็นต้นเก็บผู้เล่น pos ใช้สามตัวแปร X + Y + Z ในตารางเมตาของเครื่องเล่น SQl Runescape ทำได้โดยไม่ต้องใช้ Z ซึ่งเป็นวิธีที่โปรแกรมเล่นจะแสดงผลอยู่ด้านบนสุดของตาข่ายพื้นดิน


เมตาตารางคืออะไร ฉันสงสัยจริง ๆ ว่ามันจะเก็บไว้ในฐานข้อมูลมันจำเป็นต้องใช้ในเวลาจริง ...
jokoon

(1) ตารางเมตาในกรณีนั้นคือตาราง DB ที่มีข้อมูลอักขระพื้นฐานสำหรับเช่น เพศตำแหน่ง xyz ปริมาณสุขภาพเงินสดในธนาคาร ฯลฯ และอย่างอื่นที่อาจมี (2) ฉันได้รับการโฮสต์เซิร์ฟเวอร์ Tibia เปิดที่นั่นผู้เล่น pos จะถูกเก็บไว้ในแคชเซิร์ฟเวอร์ แต่ ... ทุกๆ 30 ~ s จะมีเซิร์ฟเวอร์บันทึกและ POS ของผู้เล่นจะถูกเพิ่มลงในข้อมูลเมตาของผู้เล่น ดังนั้นถ้าเซิร์ฟเวอร์ที่ได้รับการปิด / เกิดปัญหาผู้เล่นตำแหน่งที่จะกลับมาที่ตำแหน่ง DB :)
Mikolaj Marcisz

-2

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


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