ประโยชน์ของการใช้ระบบรหัสนิติบุคคลคืออะไร?


12

ฉันกำลังอ่านหนังสือเกม Programming AI โดยตัวอย่าง

หนังสือเล่มนี้กล่าวถึงการกำหนดหมายเลข ID ที่ไม่ซ้ำกันให้กับแต่ละเอนทิตีในเกม บ่อยครั้งเมื่อเอนทิตีAต้องติดต่อเอนทิตีB , Aได้รับการอ้างอิงถึงBโดยส่งหมายเลข ID ของBไปยังคลาสEntityDatabase ชั้นนี้รับหมายเลข ID และส่งกลับการอ้างอิงไปยังเอนทิตี

หมายเลข ID ของเอนทิตีบางตัวสามารถดึงมาจากไฟล์ที่มี ID ของเอนทิตีบางตัว (ตัวละครในเกมหลัก)

คำถามของฉันคือ: ทำไมฉันจะทำเช่นนี้? เหตุใดฉันจึงไม่สามารถทำงานกับการอ้างอิงได้โดยตรง บางครั้งมันยากที่จะได้รับการอ้างอิงโดยตรง? การใช้ระบบ ID เป็นวิธีการทั่วไปหรือไม่ มีเกมที่ไม่ได้ใช้ ID หรือไม่?

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

คำตอบ:


18

การอ้างอิงทำงานได้ดีในหลาย ๆ สถานการณ์ อย่างไรก็ตามมีสามสถานการณ์ที่สำคัญที่การอ้างอิงไม่ได้ผล:

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

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


2
ย่อหน้าสุดท้ายควรเป็นสัญลักษณ์แสดงหัวข้อย่อยของตัวเอง (การจัดการหน่วยความจำ) มีสถานการณ์ที่คลาสหนึ่งต้องการการอ้างอิงไปยังเอนทิตีอื่นบางครั้ง แต่การอ้างอิงเอนทิตีอาจกลายเป็นโมฆะ (เช่นเอนทิตีเป้าหมาย projectile เสียชีวิต) ด้วยการส่งคืน NULL เมื่อร้องขอเอนทิตีด้วย ID แต่ละคลาสจะรับผิดชอบในการทำสิ่งที่ถูกต้อง (แทนที่จะหยุดทำงาน) เมื่อการอ้างอิงเอนทิตีกลายเป็นโมฆะ
LearnCocos2D

ขอบคุณสำหรับคำตอบ. คำถามที่ชัดเจน โดยทั่วไป: ในสถานการณ์ที่เอนทิตี A ต้องได้รับการอ้างอิงถึงเอนทิตี B (เพื่อโจมตีส่งข้อความตรวจสอบการชนกันของมันหรือเหตุผลอื่นใดเลย) - ฉันควรใช้ระบบ ID เพื่อ ได้รับมันหรือบางครั้งมันก็โอเคที่จะได้รับการอ้างอิงโดยตรง? ความหมาย: เอนทิตี A ควรรับการอ้างอิงจาก EntityManager เสมอโดยส่ง ID ของเอนทิตี B (ซึ่งการอ้างอิงข้ามเอนทิตีและหมายเลข ID) และจากนั้นติดต่อเอนทิตี B โดยใช้การอ้างอิงจาก EntityManager? ฉันควรใช้ระบบ ID ทุกครั้งหรือไม่
Aviv Cohn

หรือบางครั้งมันก็โอเคที่จะได้รับการอ้างอิงโดยตรง? กล่าวอีกนัยหนึ่งฉันควรเอนทิตี A ให้ใช้ EntityManager เพื่อรับการอ้างอิงที่เก็บไว้ข้างในและเมื่อเอนทิตี A ดึงการอ้างอิงไปยัง B โดยวิธีใดก็ตามที่มี
Aviv Cohn

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

ฉันเห็น. ให้ฉันใช้ตัวอย่างเพื่อดูว่าฉันเข้าใจสิ่งที่คุณหมายถึง สมมติว่าฉันกำลังใช้กริดสม่ำเสมอเพื่อทำการตรวจจับการชนกัน ตารางเป็นอาร์เรย์ 2d แต่ละเอนทิตีถูกตรวจสอบการชนกับเอนทิตีใน 'เซลล์' เดียวกันในตารางเท่านั้น โดยใช้วิธี "ปกติ" แต่ละเซลล์จะมีการอ้างอิงถึงวัตถุ GameEntity ในพื้นที่ที่เป็นตัวแทน ใช้วิธี "ระบบ ID" แต่ละเซลล์จะเก็บหมายเลข ID ของเอนทิตี หมายเลขเหล่านี้จะถูกส่งไปยัง EntityManager เพื่อรับการอ้างอิงที่เป็นรูปธรรมเพื่อทำการตรวจจับการชนกันของข้อมูล นี่เป็นความเข้าใจที่ดีหรือไม่?
Aviv Cohn

2

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

ID 5067 คะแนนไปยังที่อยู่ 0x8765 สิ่งมีชีวิตตายและอีกสิ่งเกิดใหม่ ID ใหม่ถูกรีเซ็ตเป็น 7073 มีคนตรวจสอบ ID 5067 มันจะชี้ไปที่ 0x8765 แต่สิ่งมีชีวิตนั้นลงทะเบียนกับ ID 7073 แล้วดังนั้นฐานข้อมูลนิติบุคคลรู้ว่าคุณใช้ ID ล้าสมัยและ แจ้งให้คุณทราบว่าสิ่งมีชีวิตที่คุณพยายามเข้าถึงนั้นไม่ทำงานอีกต่อไป

นั่นคือเหตุผลที่ยอดเยี่ยมทั้งหมดที่ Byte56 กล่าวถึงคือเหตุผลว่าทำไมการออกแบบที่ดีจึงไม่ควรใช้การอ้างอิงโดยตรง

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