Latar Belakang:
Saya merancang sistem render 3D sederhana untuk arsitektur tipe sistem komponen entitas menggunakan C ++ dan OpenGL. Sistem terdiri dari renderer dan grafik adegan. Ketika saya menyelesaikan iterasi pertama renderer, saya mungkin mendistribusikan grafik adegan ke arsitektur ECS. Untuk sekarang ini adalah placeholder dengan satu atau lain cara. Jika memungkinkan, berikut ini adalah tujuan saya untuk pemberi render:
- Kesederhanaan . Ini untuk proyek penelitian dan saya ingin dapat dengan mudah mengubah dan memperluas sistem saya (karenanya pendekatan ECS).
- Performa . Adegan saya mungkin memiliki banyak model kecil dan volume besar dengan banyak geometri. Tidak dapat diterima untuk memperoleh objek dari konteks OGL dan geometri buffer setiap bingkai render. Saya bertujuan untuk lokalitas data untuk menghindari kesalahan cache.
- Fleksibilitas . Itu harus dapat membuat sprite, model, dan volume (voxels).
- Terpisah . Grafik adegan dapat di refactored ke arsitektur ECS inti setelah saya menulis renderer saya.
- Modular . Alangkah baiknya bisa menukar penyaji yang berbeda tanpa mengubah grafik adegan saya.
- Transparansi referensial , artinya pada suatu saat saya dapat memberikannya adegan yang valid dan itu akan selalu membuat gambar yang sama untuk adegan itu. Tujuan ini khususnya tidak selalu diperlukan. Saya pikir ini akan membantu menyederhanakan adegan serialisasi (saya harus dapat menyimpan dan memuat adegan) dan memberi saya fleksibilitas untuk bertukar dalam adegan yang berbeda selama runtime untuk keperluan pengujian / eksperimen.
Masalah dan ide:
Saya telah datang dengan beberapa pendekatan berbeda untuk mencoba tetapi saya berjuang dengan cara men-cache sumber daya OGL (VAO, VBO, shader, dll) untuk setiap node render. Berikut ini adalah konsep caching yang berbeda yang telah saya pikirkan sejauh ini:
- Cache terpusat. Setiap node adegan memiliki ID dan renderer memiliki cache yang memetakan ID ke render node. Setiap node render berisi VAO dan VBO yang terkait dengan geometri. Cache yang ketinggalan memperoleh sumber daya dan memetakan geometri ke simpul render dalam cache. Ketika geometri diubah, bendera kotor diatur. Jika penyaji melihat bendera geometri yang kotor saat iterasi melalui node adegan, itu menolak data menggunakan node render. Ketika node adegan dihapus, sebuah acara disiarkan dan renderer menghapus simpul render terkait dari cache saat melepaskan sumber daya. Atau, simpul ditandai untuk dihapus dan renderer bertanggung jawab untuk menghapusnya. Saya pikir pendekatan ini paling dekat mencapai tujuan 6 sementara juga mempertimbangkan 4 dan 5. 2 menderita kompleksitas tambahan dan hilangnya data lokalitas dengan pencarian peta, bukan akses array.
- Tembolok yang didistribusikan . Mirip di atas kecuali setiap adegan memiliki simpul render. Ini memintas pencarian peta. Untuk mengatasi lokalitas data, node render dapat disimpan di renderer. Kemudian node adegan malah bisa memiliki pointer untuk membuat node dan renderer menetapkan pointer pada cache miss. Saya pikir jenis ini meniru pendekatan komponen entitas, sehingga akan konsisten dengan seluruh arsitektur. Masalahnya di sini adalah bahwa sekarang node adegan menyimpan data renderer-implementasi-spesifik. Jika saya mengubah cara merender di renderer (seperti rendering sprite vs volume) sekarang saya perlu mengubah render node atau menambahkan lebih banyak "komponen" ke node adegan (yang berarti mengubah grafik adegan juga). Di sisi positifnya, ini sepertinya cara paling sederhana untuk mengaktifkan dan menjalankan renderer iterasi pertama saya.
- Metadata terdistribusi . Komponen metadata cache penyaji disimpan di setiap adegan adegan. Data ini tidak khusus untuk implementasi, melainkan memiliki ID, tipe, dan data relevan lainnya yang dibutuhkan oleh cache. Kemudian pencarian cache dapat dilakukan secara langsung dalam array menggunakan ID, dan jenisnya dapat menunjukkan jenis pendekatan rendering yang digunakan (seperti sprite vs volume).
- Pengunjung + pemetaan terdistribusi . Perender adalah pengunjung dan node adegan adalah elemen dalam pola pengunjung. Setiap node adegan menyimpan kunci cache (seperti metadata tetapi hanya ID) yang hanya dimanipulasi oleh renderer. ID dapat digunakan untuk larik alih-alih pencarian peta umum. Renderer dapat mengizinkan adegan adegan untuk mengirim fungsi rendering yang berbeda berdasarkan pada jenis adegan adegan, dan ID dapat digunakan oleh cache apa pun. ID default atau di luar jangkauan akan menunjukkan kehilangan cache.
Bagaimana Anda memecahkan masalah ini? Atau Anda punya saran? Terima kasih telah membaca dinding teks saya!