Saya mengembangkan mesin gim saya sendiri untuk bersenang-senang (tapi tidak untung). Saya telah merender dalam satu utas dan grafik pembaruan saya (kecepatan, dll.) Di yang lain. Ketika tiba saatnya untuk membuat, utas render menambahkan node yang terlihat ke buffer linier baru dan melewatinya.
Secara lebih rinci, grafik adegan saya memiliki buffer tiga. Setiap node dalam grafik adegan saya memiliki tiga salinan matriks transformasi relatif dan absolut (4x4). Pada waktu tertentu, satu salinan ditulis oleh utas grafik adegan, satu salinan dibaca oleh renderer, dan yang ketiga ada sehingga pembaca atau penulis dapat beralih ke yang berikutnya tanpa menunggu yang lain. Ini mencegah penulisan sesuatu saat sedang dirender dan membuat grafik adegan yang setengah diperbarui. Entah bagaimana saya juga punya salinan keempat dari setiap matriks untuk bekerja dengan pengguna agar tidak bertentangan dengan utas pembaruan. Ini tampaknya berkinerja baik dengan menghindari harus menyinkronkan sepanjang waktu.
Namun, ini berantakan.
Ini adalah tujuan utama saya untuk sistem:
- Grafik rendering dan pembaruan adegan tetap berada di utas terpisah.
- Minimalkan berapa banyak utas ini harus menunggu satu sama lain.
- Jangan membuat adegan yang setengah diperbarui oleh utas pembaruan. Ini terutama terlihat jika kamera bergerak cepat dan kadang-kadang ditampilkan sebelum atau setelah pembaruan.
- Pengurangan penggunaan memori. Saya memiliki terlalu banyak matriks per Node. Saya juga mempertimbangkan untuk pindah ke vektor untuk posisi / rotasi / skala karena peningkatan floating point drift dengan matriks.
- Kemampuan untuk menangani puluhan ribu Nodes. Sistem saat ini melakukan ini dengan cukup baik.
Saya juga berharap untuk memasukkan Bullet (mesin fisika) dan jaringan di masa depan, yang tidak satu pun yang saya pikirkan.
Apa saja pendekatan untuk mencapai grafik adegan yang lebih baik?
sumber