Latar Belakang
Saya telah bekerja untuk menciptakan mesin permainan multithreaded di waktu luang saya dan saat ini saya mencoba untuk memutuskan cara terbaik untuk bekerja dengan sistem entitas ke dalam apa yang telah saya buat. Sejauh ini, saya telah menggunakan artikel ini dari Intel sebagai titik awal untuk mesin saya. Sejauh ini saya telah mengimplementasikan loop permainan normal menggunakan tugas-tugas, dan saya sekarang pindah untuk mendapatkan beberapa sistem dan / atau entitas-sistem yang dimasukkan. Saya telah menggunakan sesuatu yang mirip dengan Artemis di masa lalu, tetapi paralelisme membuat saya pergi.
Artikel dari Intel tampaknya menganjurkan memiliki banyak salinan data entitas, dan perubahan yang dibuat untuk setiap entitas didistribusikan secara internal pada akhir pembaruan lengkap. Ini berarti bahwa rendering akan selalu menjadi satu kerangka di belakang, tetapi itu tampak seperti kompromi yang dapat diterima mengingat manfaat kinerja yang harus diperoleh. Namun ketika menyangkut sistem entitas seperti Artemis, setiap entitas digandakan untuk setiap sistem berarti setiap komponen juga perlu diduplikasi. Ini bisa dilakukan tetapi bagi saya sepertinya akan menghabiskan banyak memori. Bagian-bagian dari dokumen Intel yang membahas ini adalah 2.2 dan 3.2.2 terutama. Saya telah melakukan beberapa pencarian untuk melihat apakah saya dapat menemukan referensi yang bagus untuk mengintegrasikan arsitektur yang saya inginkan, tetapi saya belum dapat menemukan sesuatu yang bermanfaat.
Catatan: Saya menggunakan C ++ 11 untuk proyek ini, tetapi saya membayangkan sebagian besar dari apa yang saya tanyakan harus berupa bahasa agnostik yang cantik.
Kemungkinan Solusi
Memiliki EntityManager global yang digunakan untuk membuat dan mengelola Entitas dan EntityAttributes. Izinkan akses baca untuk mereka hanya selama fase pembaruan, dan simpan semua perubahan dalam antrian per utas. Setelah semua tugas selesai, antrian digabungkan dan perubahan di masing-masing diterapkan. Ini mungkin akan memiliki masalah dengan beberapa penulisan ke bidang yang sama tetapi saya yakin mungkin ada sistem prioritas atau cap waktu untuk mengatasinya. Ini sepertinya pendekatan yang baik bagi saya karena sistem dapat diberitahu tentang perubahan entitas secara alami selama tahap distribusi perubahan.
Pertanyaan
Saya mencari beberapa umpan balik tentang solusi saya untuk melihat apakah itu masuk akal. Saya tidak akan berbohong dan mengklaim sebagai ahli multithreading, dan saya melakukan ini sebagian besar untuk latihan. Saya dapat melihat beberapa kekacauan rumit yang muncul dari solusi saya di mana banyak sistem membaca / menulis beberapa nilai. Antrian perubahan yang saya sebutkan juga mungkin sulit untuk diformat sedemikian rupa sehingga setiap perubahan yang mungkin dapat dikomunikasikan dengan mudah ketika saya tidak bekerja dengan POD.
Umpan balik / saran akan sangat dihargai! Terima kasih!
Tautan
- http://software.intel.com/en-us/articles/designing-the-framework-of-a-parallel-game-engine
- http://gamadu.com/artemis/
- http://www.gamedev.net/topic/560083-rendering-in-a-task-based-multithreaded-environment/ (tidak disebutkan dalam pos posting ini tetapi solusi serupa disebutkan)