อะไรคือบทบาทของ“ ระบบ” ในสถาปัตยกรรมเอนทิตีที่อิงองค์ประกอบ


177

ฉันได้อ่านเกี่ยวกับองค์ประกอบและระบบเอนทิตีและได้คิดว่าความคิดของเอนทิตีที่เพิ่งเป็น ID นั้นค่อนข้างน่าสนใจ

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

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

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

อีกสิ่งที่ฉันได้อ่านบ่อยๆก็คือ 'ประเภท' ของเอนทิตีถูกอนุมานด้วยส่วนประกอบที่มันมี หากเอนทิตีของฉันเป็นเพียง ID ฉันจะรู้ได้อย่างไรว่าเอนทิตีโรบ็อตของฉันต้องถูกย้ายหรือเรนเดอร์และทำการแก้ไขโดยระบบบางระบบ

ขออภัยสำหรับการโพสต์ยาว (หรืออย่างน้อยก็ดูเหมือนจากหน้าจอโทรศัพท์ของฉัน)!

คำตอบ:


336

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

ฉันจะแนะนำการเปรียบเทียบสำหรับสถาปัตยกรรมเอนทิตี / ส่วนประกอบ / ระบบที่อาจช่วยได้ ลองนึกถึงเอนทิตีเหมือนกุญแจ

หน่วยงาน

รหัสเอนทิตี

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

ระบบ

ล็อคระบบการเคลื่อนไหว

ล็อคใช้งานได้เฉพาะในกรณีที่กุญแจของเรามีทั้งตำแหน่งและความเร็ว ระบบนี้จะประมวลผลเอนทิตีที่มีตำแหน่งและความเร็วเท่านั้น มีหลายวิธีที่จะตั้งขึ้นว่าระบบเหล่านี้รู้จักซึ่งหน่วยงานในการประมวลผลมี longแต่วิธีหนึ่งคือการใช้ แต่ละบิตสงวนไว้สำหรับประเภทส่วนประกอบ สำหรับตัวอย่างของเราสมมติประเภท 4 บิตแทนความยาว 64 บิต หน่วยงานตัวอย่างของเราจะมีส่วนประกอบทั้งหมด 1111ดังนั้นจึงเป็นกุญแจสำคัญที่จะเป็น จากนั้นระบบจะมองหานิติบุคคลใด ๆ 11--ที่มี ( -ตัวแทนไม่สนใจเพราะการเคลื่อนไหวไม่สนใจว่ามีสไปรต์หรือสุขภาพ) สามารถตรวจสอบเอนทิตีด้วยการANDดำเนินการอย่างง่าย ((1111 & 1100) == 1100)ดังนั้นนิติบุคคลของเราตรงกับถ้า ถ้าฉันหายไปคุณมีตรวจสอบบางส่วนเพิ่มเติมเกี่ยวกับการดำเนินงานค่าที่เหมาะสม

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

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

ให้ดูที่ระบบอื่นเพื่อช่วยเสริมความคิด:

การวาดระบบล็อค

นี่คือระบบการวาดของเรา 1-1-จะมองหาชิ้นส่วนที่ตรงกับ เอนทิตีนี้ตรงกันเนื่องจาก: ((1111 & 1010) == 1010)นอกจากนี้คุณจะเห็นว่าระบบนี้ส่งออกข้อมูลไปยังหน้าจอโดยการวาดเอนทิตีสไปรท์ที่ตำแหน่ง

ตกลงอีกหนึ่ง ลองดูที่เอนทิตีอื่นและดูว่ามันอาจเป็นตัวอย่างของเราได้อย่างไร

คีย์เอนทิตีที่เคลื่อนย้ายไม่ได้

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

ต่อต้านระบบการเคลื่อนไหวของเรา: ((1010 & 1100) != 1100)ไม่ ดูเหมือนว่าระบบการเคลื่อนไหวจะไม่สนใจเกี่ยวกับเอนทิตีนี้เพราะมันไม่จำเป็นต้องมีส่วนประกอบ

ระบบการวาดของเรา: ((1010 & 1010) == 1010)เฮ้นั่นมันเข้ากันได้แล้ว เอนทิตีนี้จะดำเนินการโดยระบบการวาด ระบบการวาดจะวาดเทพดาที่ตำแหน่งที่กำหนดไว้


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

ถ้าหลายระบบต้องการเข้าถึงส่วนประกอบเดียวกัน ข้อมูลควรอยู่ที่ไหน

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

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

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

หากเอนทิตีของฉันเป็นเพียง ID ฉันจะรู้ได้อย่างไรว่าเอนทิตีโรบ็อตของฉันต้องถูกย้ายหรือเรนเดอร์และทำการแก้ไขโดยระบบบางระบบ

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

วุ้ย นั่นคือการโพสต์ยาว! (หรืออย่างน้อยก็ดูเหมือนกับจอภาพขนาดใหญ่ของฉัน)


23
การเปรียบเทียบคีย์นี้มีประโยชน์จริง ๆ สำหรับการทำความเข้าใจแนวคิดทั้งหมดในขณะนี้ ความคิดหลักแหลม! ฮ่า ๆ ในย่อหน้าสุดท้ายของคุณ :)
bio595

16
+1 สำหรับคำอธิบายที่ดีที่สุดและดีที่สุดของระบบส่วนประกอบที่ฉันเคยเห็น โอ้!
knight666

7
-1 จากฉัน - ไม่ใช่เพราะนี่เป็นวิธีการที่ไม่ดี แต่เพราะมันแสดงให้เห็นว่าเป็นแนวทาง ยังมีอีกหลายระบบที่ไม่มีการแยกส่วนประกอบและบริการ (เช่นใน Unity) และมีวิธีที่ง่ายกว่าสำหรับระบบที่จะรู้ว่าเอนทิตีที่จะประมวลผล (เพียงเพิ่มเมื่อสร้างเอนทิตี)
Kylotan

37
@Kylotan ฉันจะพูดว่า " มีหลายวิธีในการตั้งค่าวิธีการที่ระบบเหล่านี้จดจำเอนทิตีที่ต้องดำเนินการ แต่วิธีหนึ่งคือการใช้ a long. " นอกจากนี้ฉันมักจะจองลงคะแนนโหวตสำหรับคำตอบที่ไม่เป็นประโยชน์ กล่าว) ฉันคิดว่าคุณจะใช้เวลาลงคะแนนนานหากคุณทำตามคำตอบทั้งหมดที่ไม่ครอบคลุม 100% ของหัวข้อที่พวกเขาพูดถึง
MichaelHouse

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