พื้นหลัง:
ฉันกำลังออกแบบระบบการเรนเดอร์ 3D แบบง่ายสำหรับสถาปัตยกรรมชนิดเอนทิตีคอมโพเนนต์โดยใช้ C ++ และ OpenGL ระบบประกอบด้วย renderer และกราฟฉาก เมื่อฉันเสร็จสิ้นการทำซ้ำครั้งแรกของโหมดแสดงภาพฉันอาจกระจายกราฟฉากลงในสถาปัตยกรรม ECS สำหรับตอนนี้มันเป็นตัวยึดตำแหน่งทางเดียวหรืออื่น หากเป็นไปได้ต่อไปนี้เป็นเป้าหมายของฉันสำหรับผู้สร้างภาพ:
- ความง่าย นี่เป็นโครงการวิจัยและฉันต้องการที่จะสามารถเปลี่ยนแปลงและขยายระบบของฉันได้อย่างง่ายดาย (ด้วยวิธีการของ ECS)
- การปฏิบัติ ฉากของฉันอาจมีนางแบบขนาดเล็กจำนวนมากและยังมีเล่มขนาดใหญ่ที่มีรูปทรงเรขาคณิตมากมาย ไม่สามารถรับวัตถุจากบริบท OGL และเรขาคณิตบัฟเฟอร์ทุกเฟรมการเรนเดอร์ ฉันตั้งเป้าหมายในการหาที่ตั้งของข้อมูลเพื่อหลีกเลี่ยงการพลาดแคช
- มีความยืดหยุ่น มันจะต้องสามารถแสดงสไปรต์โมเดลและโวลุ่ม (voxels)
- แยกออก กราฟฉากอาจถูก refactored ลงในสถาปัตยกรรมหลักของ ECS หลังจากที่ฉันเขียน renderer ของฉัน
- modular เป็นเรื่องดีที่สามารถสลับในโหมดแสดงภาพที่ต่างกันได้โดยไม่ต้องเปลี่ยนกราฟฉากของฉัน
- ความโปร่งใสอ้างอิงซึ่งหมายความว่า ณ เวลาใด ๆ ฉันสามารถให้มันถูกต้องฉากใด ๆ และมันจะทำให้ภาพเดียวกันสำหรับฉากนั้น โดยเฉพาะอย่างยิ่งเป้าหมายนี้ไม่จำเป็นต้องมี ฉันคิดว่ามันจะช่วยทำให้การจัดลำดับฉากเป็นเรื่องง่ายขึ้น (ฉันจะต้องสามารถบันทึกและโหลดฉาก) และให้ความยืดหยุ่นในการสลับฉากต่าง ๆ ระหว่างรันไทม์เพื่อการทดสอบ / การทดลอง
ปัญหาและแนวคิด:
ฉันได้ลองวิธีที่แตกต่างกัน แต่ฉันพยายามดิ้นรนกับวิธีการแคชทรัพยากร OGL (VAO, VBOs, shaders ฯลฯ ) สำหรับโหนดการแสดงผลแต่ละโหนด ต่อไปนี้เป็นแนวคิดการแคชที่แตกต่างกันที่ฉันคิดไว้จนถึงตอนนี้:
- แคชส่วนกลาง. แต่ละโหนดของฉากมี ID และตัวแสดงภาพมีแคชที่จับคู่รหัสเพื่อแสดงผลโหนด โหนดการแสดงผลแต่ละโหนดมี VAO และ VBO ที่เกี่ยวข้องกับรูปทรงเรขาคณิต แคชมิสได้มาซึ่งทรัพยากรและแมปเรขาคณิตกับโหนดการแสดงผลในแคช เมื่อรูปทรงเรขาคณิตมีการเปลี่ยนแปลงการตั้งค่าสถานะสกปรก หากตัวแสดงภาพเห็นธงรูปทรงเรขาคณิตสกปรกในขณะที่วนดูผ่านโหนดของฉากก็จะทำการรีบูตข้อมูลโดยใช้โหมดการแสดงผล เมื่อโหนดฉากถูกลบออกเหตุการณ์จะถูกออกอากาศและ renderer จะลบโหนดการแสดงผลที่เกี่ยวข้องออกจากแคชในขณะที่ปล่อยทรัพยากร หรือมิฉะนั้นโหนดจะถูกทำเครื่องหมายสำหรับการลบและ renderer รับผิดชอบในการลบออก ฉันคิดว่าวิธีการนี้บรรลุเป้าหมาย 6 อย่างใกล้ชิดที่สุดในขณะที่การพิจารณา 4 และ 5 2 ประสบกับความซับซ้อนและการสูญเสียข้อมูลในพื้นที่ด้วยการค้นหาแผนที่แทนการเข้าถึงอาร์เรย์
- แคชกระจาย คล้ายกันด้านบนยกเว้นแต่ละโหนดของฉากมีโหนดการแสดงผล การทำเช่นนี้จะข้ามการค้นหาแผนที่ เพื่อระบุตำแหน่งของข้อมูล data โหนดการเรนเดอร์สามารถเก็บไว้ใน renderer จากนั้นโหนดของฉากอาจมีพอยน์เตอร์แทนการเรนเดอร์แทนและ renderer จะตั้งค่าตัวชี้บนแคชมิส ฉันคิดว่าการเลียนแบบวิธีนี้เป็นองค์ประกอบเอนทิตีดังนั้นมันจะสอดคล้องกับส่วนที่เหลือของสถาปัตยกรรม ปัญหาคือตอนนี้โหนดของซีนจัดเก็บข้อมูลเฉพาะ renderer-implementation ถ้าฉันเปลี่ยนวิธีการแสดงผลสิ่งต่าง ๆ ในโหมดแสดงภาพ (เช่นเรนเดอร์เรนเดอร์ vs ปริมาตร) ตอนนี้ฉันต้องเปลี่ยนโหมดการแสดงผลหรือเพิ่ม "องค์ประกอบ" ไปยังโหนดภาพ (ซึ่งหมายถึงการเปลี่ยนกราฟฉากด้วย) ในด้านบวกนี่เป็นวิธีที่ง่ายที่สุดในการทำให้ตัวเรนเดอร์ตัวแรกของฉันทำงาน
- เมตาดาต้ากระจาย คอมโพเนนต์ข้อมูลเมตาแคช renderer ถูกเก็บไว้ในแต่ละโหนดของฉาก ข้อมูลนี้ไม่ได้เจาะจงใช้งาน แต่เก็บ ID ประเภทและข้อมูลอื่น ๆ ที่เกี่ยวข้องที่แคชต้องการ จากนั้นการค้นหาแคชสามารถทำได้โดยตรงในอาร์เรย์โดยใช้ ID และประเภทสามารถระบุประเภทของวิธีการแสดงผลที่จะใช้ (เช่นสไปรต์และปริมาณ)
- จำนวนผู้เข้าชม + กระจายการทำแผนที่ โหมดแสดงภาพเป็นโหนดผู้เข้าชมและโหนดเป็นองค์ประกอบในรูปแบบผู้เยี่ยมชม แต่ละโหนดของฉากถือคีย์แคช (เช่นข้อมูลเมตา แต่เป็น ID) ที่มีเฉพาะเรนเดอร์เท่านั้น ID สามารถใช้สำหรับอาร์เรย์แทนการค้นหาแผนที่ทั่วไป โหมดแสดงภาพสามารถอนุญาตให้โหนดซีนเพื่อจัดส่งฟังก์ชั่นการแสดงผลที่แตกต่างกันตามชนิดของโหนดฉากและ ID สามารถใช้โดยแคชใด ๆ รหัสเริ่มต้นหรืออยู่นอกช่วงจะระบุว่าแคชไม่ได้
คุณจะแก้ปัญหานี้อย่างไร หรือคุณมีข้อเสนอแนะใด ๆ ขอบคุณที่อ่านกำแพงข้อความของฉัน!