GPU adalah tugas paralel yang sangat baik. Bagus sekali ... jika Anda menjalankan tugas paralel.
Game adalah jenis aplikasi yang paling tidak dapat diparalelkan. Pikirkan tentang loop permainan utama. AI (anggaplah pemain ditangani sebagai kasus khusus AI) perlu merespons tabrakan yang terdeteksi oleh fisika. Karena itu, harus dijalankan sesudahnya. Atau paling tidak, fisika perlu memanggil rutinitas AI dalam batas sistem fisika (yang umumnya bukan ide yang baik karena berbagai alasan). Grafik tidak dapat berjalan sampai fisika telah berjalan, karena fisika adalah yang memperbarui posisi objek. Tentu saja, AI perlu dijalankan sebelum rendering juga, karena AI dapat menelurkan objek baru. Suara perlu dijalankan setelah kontrol AI dan pemain
Secara umum, game dapat menyambung sendiri dengan sangat sedikit cara. Grafik dapat diputar dalam utas; lingkaran permainan dapat mendorong sekelompok data di utas grafik dan berkata: render ini. Ini dapat melakukan interpolasi dasar, sehingga loop permainan utama tidak harus disinkronkan dengan grafik. Suara adalah utas lainnya; lingkaran permainan mengatakan "mainkan ini", dan itu dimainkan.
Setelah itu, semuanya mulai terasa menyakitkan. Jika Anda memiliki algoritme lintasan yang rumit (seperti untuk RTS), Anda dapat utas itu. Mungkin diperlukan beberapa frame untuk menyelesaikan algoritme, tetapi setidaknya akan bersamaan. Di luar itu, cukup sulit.
Jadi Anda melihat 4 utas: game, grafik, suara, dan kemungkinan pemrosesan AI jangka panjang. Itu tidak banyak. Dan itu hampir tidak cukup untuk GPU, yang dapat memiliki ratusan utas dalam penerbangan sekaligus. Itulah yang memberi GPU kinerja mereka: bisa memanfaatkan semua utas itu sekaligus. Dan game tidak bisa melakukan itu.
Sekarang, mungkin Anda mungkin bisa "melebar" untuk beberapa operasi. AI, misalnya, biasanya tidak tergantung satu sama lain. Jadi Anda bisa memproses beberapa lusin AI sekaligus. Sampai Anda benar-benar harus membuat mereka saling bergantung. Maka Anda dalam kesulitan. Objek fisika sama-sama independen ... kecuali ada batasan antara mereka dan / atau mereka bertabrakan dengan sesuatu. Kemudian mereka menjadi sangat tergantung.
Plus, ada fakta bahwa GPU tidak memiliki akses ke input pengguna, yang seperti yang saya pahami agak penting untuk gim. Jadi itu harus disediakan. Itu juga tidak memiliki akses file langsung atau metode nyata berbicara ke OS; jadi sekali lagi, harus ada semacam cara untuk menyediakan ini. Oh, dan semua pemrosesan suara itu? GPU tidak mengeluarkan suara. Jadi mereka harus kembali ke CPU dan kemudian keluar ke chip suara.
Oh, dan coding untuk GPU sangat buruk. Sulit untuk mendapatkan yang benar, dan apa yang "benar" untuk satu arsitektur GPU bisa sangat, sangat salah untuk yang lain. Dan itu bahkan bukan hanya beralih dari AMD ke NVIDIA; yang bisa beralih dari GeForce 250 ke GeForce 450. Itu perubahan dalam arsitektur dasar. Dan itu bisa dengan mudah membuat kode Anda tidak berjalan dengan baik. C ++ dan bahkan C tidak diizinkan; yang terbaik yang Anda dapatkan adalah OpenCL, yang agak mirip C tetapi tanpa basa-basi. Seperti rekursi . Itu benar: tidak ada rekursi pada GPU.
Debugging? Oh, saya harap Anda tidak suka fitur debugging IDE Anda, karena itu pasti tidak akan tersedia. Bahkan jika Anda menggunakan GDB, cium selamat tinggal itu. Anda harus menggunakan printf
debug ... tunggu, tidak ada printf
pada GPU. Jadi Anda harus menulis ke lokasi memori dan meminta program rintisan CPU Anda membacanya kembali.
Benar: debugging manual . Semoga beruntung dengan itu.
Juga, perpustakaan bermanfaat yang Anda gunakan di C / C ++? Atau mungkin Anda lebih menyukai .NET, menggunakan XNA dan sebagainya. Atau terserah. Tidak masalah, karena Anda tidak dapat menggunakan setiap dari mereka di GPU. Anda harus mengkodekan semuanya dari awal. Dan jika Anda memiliki basis kode yang sudah ada, sulit: waktu untuk menulis ulang semua kode itu.
Jadi ya. Sungguh mengerikan untuk melakukan semua jenis permainan yang kompleks. Dan itu bahkan tidak akan berhasil, karena game tidak cukup paralel untuk bisa membantu.