วิธีการจัดการการพึ่งพาระหว่างแผนที่ย่อยและหน่วย


11

ฉันมีกลยุทธ์แบบกระเบื้องสองมิติในการทำงาน ฉันหลงทางเกี่ยวกับการจัดการความสัมพันธ์ระหว่างแผนที่และหน่วยบนแผนที่

ถ้ามีพิกัดของกระเบื้องฉันจะต้องสามารถทำให้ยูนิตนั้นยืนอยู่ได้ถ้ามี ในเวลาเดียวกันหากได้รับหน่วยฉันจะต้องการได้รับการประสานงานของหน่วย

ฉันเห็นวิธีแก้ไขปัญหาสองข้อนี้แล้ว วิธีแก้ปัญหาแรกคือการให้หน่วยจัดเก็บพิกัดและหน่วยเก็บแผนที่อ้างอิงในแผ่นกระเบื้อง สิ่งนี้สร้างการพึ่งพาแบบวนรอบระหว่างแผนที่และหน่วย ฉันต้องตรวจสอบให้แน่ใจว่าแผนที่ของหน่วยใด ๆ ได้รับการซิงค์หากหน่วยเคลื่อนที่

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

ฉันยังไม่สามารถเก็บหน่วยไว้ในแผนที่ได้ (หรือฉันสามารถทำได้) หน่วยที่เกี่ยวข้องกับ "กองทัพ" ผู้เล่นหรือ AI กองทัพควรสามารถเข้าถึงได้ง่ายและย้ำทุกหน่วยของมัน

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

คำตอบ:


3

มันไม่ใช่รูปแบบที่นิยม แต่โลกฐานข้อมูลเชิงสัมพันธ์นำเสนอวิธีที่สาม: ใช้โครงสร้างข้อมูลที่มีหลายคีย์ ในรูปแบบตารางอาจมีลักษณะเช่นนี้:

Unit id    Location
-------------------
  1309     13,15
  2357      7,93
  8552      7,93

คุณต้องการถามว่า“ หน่วย 2357 อยู่ที่ไหน” และรับคืน 7,93 คุณต้องการถามว่า“ มีอะไรอยู่ในสถานที่ 7,93” และรับกลับมา 2357 และ 8552 มีโครงสร้างข้อมูลที่อนุญาตให้ใช้หลายปุ่มสำหรับค้นหาข้อมูล คุณสามารถเก็บสิ่งนี้ไว้นอกหน่วยและนอกแผนที่ได้หากคุณต้องการลบการพึ่งพา

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

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


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

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

5

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

ในความเป็นจริงแม้ว่าคุณจะมี 4000 หน่วยต่อผู้เล่นโดยใช้จำนวนเต็มสองจำนวนเพื่อเก็บตำแหน่งและ 8 ผู้เล่นที่ใช้เวลาเพียง 2MB แต่ด้วยวิธีแก้ปัญหาแรกคุณจะได้ใช้ตัวประสาน O (1) แทน O (n) (สมมติว่าไม่ได้เรียงลำดับ) ซึ่งมีจำนวนมากอาจช้า

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


ฉันไม่กังวลเกี่ยวกับการใช้หน่วยความจำฉันสนใจการจัดการการอ้างอิง (ในแง่ของการออกแบบเชิงวัตถุ) มันไม่ใช่ความทรงจำพิเศษที่ทางออกแรกที่จะนำมาซึ่งความกังวลของฉันมันเป็นการพึ่งพาอาศัยแบบวนรอบที่ฉันโกงมากเท่ากับที่ฉันชอบ O-1 co-ord getter นอกจากนี้ฉันรู้ว่าเกมจำนวนมากใช้พิกเซลในขณะนี้ แต่ฉันชอบไทล์นั่นคือสิ่งที่ฉันใช้ : P
AJM

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