แนวคิด
โดยพื้นฐานแล้วกราฟฉากไม่มีอะไรมากไปกว่ากราฟอะไซโคลแบบสองทิศทางซึ่งทำหน้าที่เป็นตัวแทนของชุดของความสัมพันธ์เชิงพื้นที่
เอนจิ้นในป่ามีแนวโน้มที่จะรวมสารพัดอื่น ๆ ลงในกราฟฉากตามที่ระบุไว้ ไม่ว่าคุณจะเห็นว่าในขณะที่เนื้อหรือวัวนั้นอาจขึ้นอยู่กับประสบการณ์ของคุณกับเครื่องยนต์และห้องสมุด
น้ำหนักเบา
ฉันชอบสไตล์ Unity3D ที่มีโหนดกราฟฉากของคุณ (ซึ่งหัวใจของมันคือโทโพโลยีมากกว่าโครงสร้างเชิงพื้นที่ / ภูมิประเทศ) โดยเนื้อแท้จะมีพารามิเตอร์เชิงพื้นที่และฟังก์ชันการทำงาน ในเอ็นจิ้นของฉันโหนดของฉันมีน้ำหนักเบากว่า Unity3D ซึ่งพวกมันสืบทอดสมาชิกขยะจำนวนมากที่ไม่จำเป็นจากซูเปอร์คลาส / อินเตอร์เฟสที่ใช้งาน: นี่คือสิ่งที่ฉันมี - เบาพอ ๆ กับที่คุณจะได้รับ:
- สมาชิกตัวชี้พาเรนต์ / ลูก
- pre-transform สมาชิกพารามิเตอร์ spatial: ตำแหน่ง xyz, pitch, yaw และ roll
- เมทริกซ์การแปลง เมทริกซ์ในห่วงโซ่แบบลำดับชั้นสามารถอย่างรวดเร็วและง่ายดายคูณด้วยการเดินขึ้น / ลงต้นไม้ซ้ำ ๆ เพื่อให้การแปลงเชิงพื้นที่แบบลำดับชั้นซึ่งเป็นคุณสมบัติหลักของกราฟฉาก
updateLocal()
วิธีการที่ปรับปรุงเพียงแค่นี้โหนดเป็นแปลงเมทริกซ์
updateAll()
วิธีการที่ปรับปรุงนี้และลูกหลานโหนดเปลี่ยนเมทริกซ์
... ฉันยังรวมถึงสมการของตรรกะการเคลื่อนไหวและทำให้สมาชิกความเร็ว / การเร่ง (เชิงเส้นและเชิงมุม) ในชั้นโหนดของฉัน คุณสามารถนำมาใช้และจัดการกับมันในตัวควบคุมหลักของคุณแทนหากคุณต้องการ แต่นั่นคือ - น้ำหนักเบามากอย่างแน่นอน จำไว้ว่าคุณสามารถมีสิ่งเหล่านี้ได้ในเอนทิตีหลายพันรายการ ดังนั้นตามที่คุณแนะนำไว้ให้เบา
การสร้างลำดับชั้น
สิ่งที่คุณพูดเกี่ยวกับกราฟฉากอ้างอิงกราฟฉากอื่น ๆ ... ฉันกำลังรอหมัดเด็ด? แน่นอนพวกเขาทำ นั่นคือการใช้งานหลักของพวกเขา คุณสามารถเพิ่มโหนดใด ๆ ไปยังโหนดอื่นและการแปลงควรเกิดขึ้นโดยอัตโนมัติภายในพื้นที่ภายในของการแปลงใหม่ สิ่งที่คุณกำลังทำคือการเปลี่ยนตัวชี้ไม่ใช่ว่าคุณกำลังคัดลอกข้อมูลอยู่! โดยการเปลี่ยนตัวชี้คุณจะมีกราฟฉากที่ลึกกว่า หากใช้พร็อกซี่ทำให้สิ่งต่าง ๆ มีประสิทธิภาพมากขึ้นโดยทั้งหมด แต่ฉันไม่เคยเห็นความต้องการ
หลีกเลี่ยงลอจิกที่เกี่ยวข้องกับ Render
ลืมเกี่ยวกับการเรนเดอร์ขณะที่คุณเขียนคลาสโหนดกราฟของฉากหรือคุณจะทำให้คุณสับสน สิ่งที่สำคัญคือคุณมีโมเดลข้อมูลไม่ว่าจะเป็นกราฟฉากหรือไม่สำคัญและนักแสดงบางคนจะตรวจสอบโมเดลข้อมูลและแสดงวัตถุในโลกตามลำดับไม่ว่าจะเป็น 1, 2 , 3 หรือ 7 ส่วนข้อมูล จุดที่ฉันทำคือ: อย่าปนเปื้อนกราฟฉากของคุณด้วยตรรกะการแสดงผล กราฟฉากเป็นเรื่องเกี่ยวกับโทโพโลยีและภูมิประเทศ - เช่นการเชื่อมต่อและลักษณะเชิงพื้นที่ สิ่งเหล่านี้เป็นสถานะที่แท้จริงของการจำลองและมีอยู่แม้ในกรณีที่ไม่มีการเรนเดอร์ (ซึ่งสามารถใช้รูปแบบใด ๆ ภายใต้ดวงอาทิตย์จากมุมมองบุคคลที่หนึ่งไปยังกราฟสถิติไปยัง โหนดไม่ได้ชี้ไปที่วัตถุที่เกี่ยวข้องกับการเรนเดอร์ - อย่างไรก็ตามการย้อนกลับอาจเป็นจริงได้ พิจารณาสิ่งนี้ด้วย: ไม่ใช่กราฟกราฟฉากในต้นไม้ทั้งหมดของคุณที่จะแสดงผลได้ หลายคนจะเป็นเพียงภาชนะบรรจุ ดังนั้นทำไมถึงต้องจัดสรรหน่วยความจำสำหรับตัวชี้ไปยังวัตถุ? แม้แต่สมาชิกตัวชี้ที่ไม่เคยใช้ยังคงใช้หน่วยความจำ ดังนั้นย้อนกลับทิศทางตัวชี้: อินสแตนซ์ที่เกี่ยวข้องกับการแสดงผลอ้างอิงแบบจำลองข้อมูล (ซึ่งอาจจะเป็นหรือรวมถึงโหนดกราฟฉากของคุณ) ไม่ใช่ในทางกลับกัน และถ้าคุณต้องการวิธีง่ายๆในการเรียกใช้ผ่านรายการคอนโทรลเลอร์ของคุณ แต่ยังสามารถเข้าถึงมุมมองที่เกี่ยวข้องได้ให้ใช้พจนานุกรม / hashtable ซึ่งใช้เวลา O (1) ในการอ่าน ด้วยวิธีนี้ไม่มีสิ่งเจือปนและตรรกะการจำลองของคุณไม่สนใจสิ่งที่แสดงอยู่ในสถานที่ซึ่งทำให้วันและคืนของการเข้ารหัสของคุณ ดังนั้นทำไมถึงต้องจัดสรรหน่วยความจำสำหรับตัวชี้ไปยังวัตถุ? แม้แต่สมาชิกตัวชี้ที่ไม่เคยใช้ยังคงใช้หน่วยความจำ ดังนั้นย้อนกลับทิศทางตัวชี้: อินสแตนซ์ที่เกี่ยวข้องกับการแสดงผลอ้างอิงแบบจำลองข้อมูล (ซึ่งอาจจะเป็นหรือรวมถึงโหนดกราฟฉากของคุณ) ไม่ใช่ในทางกลับกัน และถ้าคุณต้องการวิธีง่ายๆในการเรียกใช้ผ่านรายการคอนโทรลเลอร์ของคุณ แต่ยังสามารถเข้าถึงมุมมองที่เกี่ยวข้องได้ให้ใช้พจนานุกรม / hashtable ซึ่งใช้เวลา O (1) ในการอ่าน ด้วยวิธีนี้ไม่มีสิ่งเจือปนและตรรกะการจำลองของคุณไม่สนใจสิ่งที่แสดงอยู่ในสถานที่ซึ่งทำให้วันและคืนของการเข้ารหัสของคุณ ดังนั้นทำไมถึงต้องจัดสรรหน่วยความจำสำหรับตัวชี้ไปยังวัตถุ? แม้แต่สมาชิกตัวชี้ที่ไม่เคยใช้ยังคงใช้หน่วยความจำ ดังนั้นย้อนกลับทิศทางตัวชี้: อินสแตนซ์ที่เกี่ยวข้องกับการแสดงผลอ้างอิงแบบจำลองข้อมูล (ซึ่งอาจจะเป็นหรือรวมถึงโหนดกราฟฉากของคุณ) ไม่ใช่ในทางกลับกัน และถ้าคุณต้องการวิธีง่ายๆในการเรียกใช้ผ่านรายการคอนโทรลเลอร์ของคุณ แต่ยังสามารถเข้าถึงมุมมองที่เกี่ยวข้องได้ให้ใช้พจนานุกรม / hashtable ซึ่งใช้เวลา O (1) ในการอ่าน ด้วยวิธีนี้ไม่มีสิ่งเจือปนและตรรกะการจำลองของคุณไม่สนใจสิ่งที่แสดงอยู่ในสถานที่ซึ่งทำให้วันและคืนของการเข้ารหัสของคุณ และถ้าคุณต้องการวิธีง่ายๆในการเรียกใช้ผ่านรายการคอนโทรลเลอร์ของคุณ แต่ยังสามารถเข้าถึงมุมมองที่เกี่ยวข้องได้ให้ใช้พจนานุกรม / hashtable ซึ่งใช้เวลา O (1) ในการอ่าน ด้วยวิธีนี้ไม่มีสิ่งเจือปนและตรรกะการจำลองของคุณไม่สนใจสิ่งที่แสดงอยู่ในสถานที่ซึ่งทำให้วันและคืนของการเข้ารหัสของคุณ และถ้าคุณต้องการวิธีง่ายๆในการเรียกใช้ผ่านรายการคอนโทรลเลอร์ของคุณ แต่ยังสามารถเข้าถึงมุมมองที่เกี่ยวข้องได้ให้ใช้พจนานุกรม / hashtable ซึ่งใช้เวลา O (1) ในการอ่าน ด้วยวิธีนี้ไม่มีสิ่งเจือปนและตรรกะการจำลองของคุณไม่สนใจสิ่งที่แสดงอยู่ในสถานที่ซึ่งทำให้วันและคืนของการเข้ารหัสของคุณโลกง่ายขึ้น
สำหรับการเลือกสรรให้อ้างอิงกลับไปด้านบน การเลือกสรรพื้นที่ที่น่าสนใจเป็นแนวคิดตรรกะการจำลอง นั่นคือคุณไม่ได้ประมวลผลโลกภายนอกบริเวณนี้ (โดยปกติคือกล่องวงกลมหรือทรงกลม) สิ่งนี้เกิดขึ้นในตัวควบคุมหลัก / วงเกมก่อนที่จะทำการเรนเดอร์ ในทางกลับกันการเลือกสรร frustum นั้นเกี่ยวข้องกับการเรนเดอร์อย่างหมดจด ดังนั้นลืมเกี่ยวกับการเลือกสรรทันที มันไม่มีอะไรเกี่ยวข้องกับกราฟฉากและการเน้นไปที่มันคุณจะต้องปิดบังวัตถุประสงค์ที่แท้จริงของสิ่งที่คุณพยายามจะบรรลุ
หมายเหตุสุดท้าย ...
ฉันรู้สึกว่าคุณมาจากพื้นหลัง Flash (โดยเฉพาะ AS3) โดยให้รายละเอียดทั้งหมดเกี่ยวกับการแสดงผลที่นี่ ใช่กระบวนงานของ Flash Stage / DisplayObject รวมตรรกะการแสดงผลทั้งหมดไว้เป็นส่วนหนึ่งของ Scenegraph แต่ Flash สร้างข้อสันนิษฐานมากมายที่คุณไม่ต้องการ สำหรับเครื่องยนต์เกมเต็มเปี่ยมมันจะดีกว่าที่จะไม่ผสมสองสำหรับเหตุผลของการทำงาน, ความสะดวกสบายและการควบคุมความซับซ้อนรหัสผ่านที่เหมาะสมSoC