Saya sering tergoda untuk memecahkan permainan yang sedang saya kerjakan untuk mencoba arsitektur berbasis tugas paralel, tapi itu sepertinya bukan persyaratan besar untuk proyek saya jadi saya menghindari ini untuk saat ini. Saya berencana untuk mencobanya di proyek mainan terlebih dahulu, untuk "bermain dengan konsep."
Sekarang, yang saya tanyakan adalah, karena banyak game (non AAA) tidak membutuhkan kinerja yang sangat tinggi, rasanya seperti menggunakan mesin berbasis tugas tidak perlu repot sampai ... kasus apa?
Saat ini, saya hanya menebak bahwa itu perlu ketika Anda benar-benar perlu mengeksploitasi kinerja maksimal perangkat keras (multi-core). Apakah ada kasus lain di mana itu ide yang baik untuk menggunakan mesin berbasis tugas? Atau mungkin, untuk proyek baru, selalu baik untuk memulai dengan mesin berbasis tugas?
sumber
Jika gim Anda akan menjadi perangkat keras jarak jauh maka Anda perlu utas untuk mengatasi semua perangkat keras modern; CPU di masa depan yang akan keluar dalam satu atau dua tahun mendatang mulai membuat 4 core menjadi minimum dan hingga 16 core umum untuk pasar penggemar / kinerja. Jika Anda melakukan multi-threading sama sekali, pasti lakukan arsitektur berorientasi tugas karena model threading lainnya secara inheren rusak untuk mesin game yang berpandangan ke depan.
Sekarang perlu diingat bahwa dengan "tugas" yang saya maksud "pekerjaan" dan bukan "utas terpisah untuk subsistem mesin yang berbeda." Anda benar-benar benar-benar tidak ingin melakukan sesuatu seperti memiliki satu utas grafik, satu utas fisika, satu utas AI, dll. Itu tidak berskala di luar segelintir inti dan itu sebenarnya tidak memberi Anda paralelisme nyata. Fisika seharusnya tidak menjalankan lebih dari satu pembaruan per pembaruan AI (Anda ingin AI Anda dapat bereaksi terhadap peristiwa fisika), dan grafik hampir tidak ada yang baru untuk dirender jika fisika tidak berjalan, sehingga setiap subsistem secara alami berjalan secara berurutan memesan. Kamu tidak
Yang Anda inginkan adalah melakukan ini. Buat spool utas. Jalankan putaran game Anda dengan urutan klasik pembaruan subsistem. Namun, untuk masing-masing subsistem, pisahkan beban kerja menjadi kumpulan terpisah yang berbeda, dan distribusikan ke kumpulan benang. Tunggu semua pekerjaan diselesaikan sebelum menjalankan status berikutnya dari loop pembaruan game. Beberapa subsistem mungkin memiliki beberapa subtasi; misalnya, gambar dapat mengeluarkan serangkaian pekerjaan untuk melakukan pemusnahan dan kemudian seri kedua pekerjaan untuk melakukan pembuatan antrian. Pendekatan ini menghindari masalah sinkronisasi dari pendekatan pertama, menskala ke jumlah core yang jauh lebih besar, dan terus terang hanya lebih mudah untuk kode, debug, dan pemeliharaan.
sumber
ada dua kegunaan dalam multithreading, satu untuk meningkatkan kinerja program Anda dan yang lainnya adalah membiarkan program berjalan ketika ada proses besar yang sedang berlangsung. misalnya ketika Anda mencoba memuat beberapa data, itu mengganggu jika program Anda ditutup, jadi Anda dapat menggunakan utas lainnya untuk memuat dan menjaga utas utama bebas untuk melanjutkan loop utama. meningkatkan kinerja menggunakan utas adalah hal yang sangat sulit. karena biasanya Anda melakukan segala sesuatu dalam proses linear dan itu adalah sesuatu yang berbeda dengan pemrosesan paralel. dan Anda selalu harus menggunakan utas utama Anda untuk pembaruan perangkat grafis yang membuatnya semakin sulit untuk membagi tugas di antara utas.
sumber