Grafik Adegan di Thread Terpisah

12

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?

EricP
sumber

Jawaban:

4

Sudahkah Anda membaca tesis Johannes Spohr tentang "Pace" dan pembuatnya? Ini menggambarkan apa yang disebut "mesin pengajuan" * penyaji paralel, dan dapat memberi Anda beberapa ide.

Berikut adalah halaman ringkasan (dalam bahasa Jerman), dan di sini adalah link langsung ke PDF yang dalam bahasa Inggris.

( *: tautan ini juga menuju ke artikel di mana saya awalnya mendengar tentang tesis.)

EDIT: Saya hanya membaca sekilas ini sebelumnya, dan saya hanya melihatnya lagi ... dan menyadari itu benar-benar mengacaukan detail grafik adegan. Saya kira saya tidak menyadari betapa ortogonal desainnya. Maaf jika itu tidak terlalu membantu.

Neverender
sumber
1
Salah satu makalah ini masih mencuat ke saya: "Idealnya, aplikasi bahkan tidak akan tahu ada grafik adegan sama sekali, itu hanya harus menyadari komponen tampilan yang harus menginformasikan perubahan pada model data". Ini mengilhami saya cara berpikir baru tentang hal itu: Saya tidak perlu melipattigakan seluruh adegan, hanya yang terlihat melalui kamera saat ini. Saya dapat memindahkan pemusnahan dari utas render ke utas grafik adegan (saat bertemu dengan kamera), dan pada waktu tertentu, salah satu dari tiga buffer ini dapat dituliskan padanya, dan yang lain dibaca oleh renderer.
EricP
1
Anda juga dapat memeriksa artikel "Desain Mesin Sentris-Kamera untuk Rendering Multithreaded" di Permata Mesin 1, dan "Rendering Paralel Praktis yang terkait dengan DirectX 9 dan DirectX 10" - microsoft.com/downloads/en/…
Neverender
1
Sepertinya Permata Mesin Game 1 tersedia gratis secara online: books.google.com/...
EricP