ระบบส่วนประกอบของเอนทิตี - วิธีการใช้การแปลงของวัตถุ?


11

ในการออกแบบระบบเอนทิตีส่วนประกอบสำหรับเครื่องยนต์ของฉันฉันเจออุปสรรคเล็กน้อยในการจัดเก็บและดึงส่วนประกอบบางประเภท

ก่อนอื่นให้ฉันตั้งคำศัพท์เล็กน้อยที่ฉันจะใช้ในคำถามนี้:

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

แต่ละระบบมีอาร์เรย์ (ID-mapped) ของประเภทส่วนประกอบ (เช่น Physics-> PhysicsComponent, AI-> AIComponent, Rendering-> RenderingComponent) เพื่อให้สามารถทำซ้ำข้อมูลได้อย่างมีประสิทธิภาพ

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

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

มีวิธีที่เหมาะสมในการแก้ปัญหานี้หรือไม่? ควรเปลี่ยนเป็นองค์ประกอบหรือไม่?


3
+1 สำหรับ"ก่อนอื่นให้ฉันตั้งคำศัพท์นิดหน่อยฉันจะใช้ในคำถามนี้:"
Vaillancourt

ฉันชอบที่จะเห็นคำถามประเภทนี้มากขึ้นในเว็บไซต์นี้ +1
S. TarıkÇetin

เพียงแค่เก็บส่วนประกอบทั้งหมดเป็นตัวแปรส่วนกลาง
Miles Rout

คำตอบ:


2

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

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

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

หากคุณเลือกอดีตระบบแต่ละระบบต้องทำคือเข้าถึงเอนทิตี้ของตัวเองและร้องขอการแปลง

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

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

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

ดูภาพรวม ECSนี้สำหรับข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้

ในตอนท้ายของวันมันขึ้นอยู่กับคุณที่จะตัดสินใจว่าอะไรสำคัญกับคุณมากขึ้น: ความง่ายในการพัฒนาหรือประสิทธิภาพ

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


ขอบคุณสำหรับคำแนะนำของคุณ ฉันมีคำถาม แต่ทำไมระบบ AI ไม่ต้องการตำแหน่งของวัตถุ
CRefice

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

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

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

@ Naros ใช่นี่คือสิ่งที่ฉันหมายถึง: สององค์ประกอบการแปลงและ (ในกรอบของฉัน) SpatialData ซึ่งมีตำแหน่งความเร็วการปฐมนิเทศและความเร็วเชิงมุม ตำแหน่งและการวางแนวจะใช้ในการสร้างและอัปเดตการแปลง
Ian Young
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.