Sementara perpustakaan seperti SDL menyediakan API pembungkus lintas-platform untuk threading, saya pikir akan naif untuk menganggap bahwa ini mengarah langsung ke pengembangan game yang mudah di berbagai platform yang sangat berbeda (desktop / seluler).
Apa cara terbaik untuk mengatasi pengembangan dengan cara ini (diberikan API threading lintas-platform) dengan mempertimbangkan hal berikut:
- jumlah core yang berbeda
- kemampuan pemrosesan yang sangat berbeda per inti
- Arsitektur sistem yang umumnya berbeda dengan misalnya. latensi berbeda untuk cache, RAM, dan akses I / O
Saya merasa bahwa satu-satunya cara untuk melakukan ini adalah mengevaluasi berapa banyak utas yang dapat dijalankan per setiap perangkat yang ingin Anda dukung, dan mencari tahu apa yang merupakan common denominator terendah. Namun, ini masih membuat saya dalam kegelapan karena jumlah total throughput pemrosesan yang tersedia. Apakah saya benar berasumsi bahwa satu-satunya cara untuk melakukan ini secara efektif adalah dengan secara aktif mengembangkan perangkat seluler dengan spesifikasi terendah yang ingin saya dukung, selama pengembangan? - yaitu penyebut umum terendah? Apakah kira - kira ini cukup? Atau ada yang lebih dari ini?
EDIT: Tolong bisakah orang lain menawarkan pengalaman lebih lanjut tentang ini karena saya tidak merasa pertanyaan saya telah dijawab sepenuhnya.
sumber
Jawaban:
Anda berbicara tentang "kesulitan multithreading" tetapi kesulitan apa yang sebenarnya Anda bicarakan? Dengan cara Anda mengutip masalah hantu yang bahkan mungkin tidak ada. Tantangan sebenarnya adalah tantangan yang Anda buat untuk diri sendiri - jika Anda benar-benar bertekad untuk mengeluarkan setiap tetes daya terakhir dari perangkat keras, yang memang melibatkan penggunaan perangkat keras untuk efek terbaik, tetapi itu juga memperlebar jarak antara mesin paling kuat dan yang paling kuat. Implikasinya adalah jika Anda memiliki game yang benar-benar memanfaatkan PS3 (misalnya), Anda tidak dapat menjalankannya di ponsel murah, jadi masalahnya bukan lagi "bagaimana saya bisa mendapatkan 1 program untuk bekerja di perangkat keras yang sangat berbeda "tetapi menjadi" bagaimana saya bisa menerapkan 1 ide permainan beberapa cara berbeda sehingga bekerja pada perangkat keras yang berbeda daya ".
Pengembangan game yang mudah - tentu saja. Multithreading optimal, tidak. Tapi Anda tidak perlu multithreading untuk membuat game. Untuk membuat yang berkinerja tinggi, tentu membantu. Tetapi banyak game hebat berjalan dalam satu utas.
Alih-alih mencoba menetapkan sistem ke utas, tetapkan tugas ke utas. Berikan setiap tugas data yang dibutuhkan untuk menjalankan dan mengolah tugas ke perangkat keras mana pun yang tersedia. Biasanya Anda akan memiliki semacam kumpulan utas untuk mengabstraksi berbagai inti atau prosesor, dan seorang pengelola tugas yang memiliki antrian tugas dan menghasilkannya hingga ke berbagai utas ketika utas memberi sinyal bahwa itu telah menyelesaikan tugas sebelumnya dan siap untuk yang baru. Perangkat keras dengan lebih banyak inti jelas akan menyelesaikan tugas lebih cepat dan dapat membuat lebih cepat. Mengkhususkan sistem ini untuk bekerja secara optimal pada sistem dengan karakteristik yang berbeda menjadi masalah optimisasi lanjutan, tetapi dapat didasarkan pada heuristik tertentu (mis. Tugas yang tidak
Namun, penguraian fitur permainan menjadi tugas-tugas tersendiri adalah masalah yang cukup kompleks dan seringkali tidak sepadan dengan usaha kecuali Anda sangat yakin bahwa Anda membutuhkan kinerja, sehingga sebagian besar bahkan tidak akan mencobanya.
Beberapa bacaan lebih lanjut:
http://www.gamasutra.com/view/feature/1830/multithreaded_game_engine_.php - lihat bagian 'data paralel'. Dengan model ini, data dibagi ke beberapa tugas yang identik dan dialirkan ke masing-masing utas.
http://software.intel.com/en-us/articles/designing-the-framework-of-a-parallel-game-engine/ - cukup padat, menjelaskan hal-hal di level OS daripada level game.
http://drdobbs.com/high-performance-computing/216500409 - tidak spesifik untuk game, tetapi sepenuhnya relevan dalam hal memberi tahu Anda bagaimana Anda harus membagi tugas.
http://www.itfgaming.com/news/tech-focus-crysis-2-and-the-future-of-cryengine-3 - setengah jalan wawancara ini adalah anekdot tentang bagaimana mereka bermigrasi ke sistem berbasis tugas .
sumber
Ketika saya membuat game mobile, kami pertama kali mengembangkan versi 'emas' (mis., Game yang berfungsi penuh) dan kemudian kami membaginya menjadi 3 versi utama (layar besar, layar menengah dan layar kecil). Yang ini selanjutnya dikonversi menjadi 11 versi: grafis yang menuntut (baca membutuhkan banyak memori / CPU) vs profil rendah dll (ada versi platform khusus pasangan juga).
Masalah terbesar adalah (itu adalah pekerjaan saya antara lain) untuk mengisolasi platform yang dibutuhkan dan menentukan versi-versi itu dan bagaimana cara membuatnya (mis. Layar lebar tetapi profil rendah harus menjadi versi downgrade dari layar besar / hi profil atau haruskah itu layar berukuran sedang / profil lo dibuat layar lebar?).
Tentu saja kami membuat kode dengan ini dalam pikiran sehingga permainan sangat longgar melekat pada ukuran layar.
HTH
Apa yang saya maksudkan adalah Anda perlu membagi platform target Anda dengan kualitas yang berbeda (mis. 1 core, 2 core, 1 core tetapi dua kali lebih cepat ...) Kemudian tentukan berapa banyak target virtual yang Anda inginkan (misalnya " hanya satu "atau" Rendah, Menengah, Hai ") Lalu letakkan semua platform di 'kualitas' masing-masing dan untuk Setiap kualitas, ambil penyebut terendah dan 'port' kode sehingga memenuhi persyaratan tersebut (mis. berfungsi dan cepat cukup).
Mungkin Anda harus melakukan ini dengan menebak-nebak, tetapi Anda sudah dapat menemukan kualitas terburuk dengan platform terburuk. Saya akan memilih setiap kualitas berikutnya setidaknya "dua kali lebih baik" dari yang pertama, ini mungkin tidak akan menghasilkan lebih dari mengatakan 3-4 "kualitas". Jika kode porting dari versi emas, platform apa pun yang tidak berkinerja cukup baik bisa saja ditingkatkan ke 'kualitas' yang lebih rendah untuk mempercepatnya. Setiap platform baru juga bisa dengan mudah ditempatkan dalam kualitas yang tepat.
sumber
Belum tentu - mungkin ada harapan untuk solusi yang lebih dinamis, tetapi ini tergantung pada masalah aktual yang Anda coba selesaikan (jika ada). Anda agak kabur dalam pertanyaan Anda, jadi jawaban saya juga harus tidak jelas.
Jika pengelompokan platform yang ingin Anda jalankan memiliki kemampuan untuk penghitungan perangkat keras melalui API, Anda dapat menggunakan antarmuka itu untuk mendeteksi jumlah maksimum utas yang dapat ditangani sistem, dan menggunakannya sebagai dasar untuk berapa banyak utas aplikasi Anda harus dibuat. Satu-satunya tantangan di sini adalah menemukan API tersebut; apakah Anda pergi ke tingkat OS, atau mencari perpustakaan pihak ketiga, atau SDK / API lintas-platform terserah Anda dan tergantung pada platform yang Anda coba dukung.
Menurut pendapat saya, tidak ada hal-hal itu yang menjadi perhatian Anda. Kekhawatiran Anda harus membangun permainan Anda. Jika Anda menekan hambatan dan memutuskan bahwa akan lebih baik untuk menelurkan utas terpisah untuk tugas intensif prosesor tertentu, kemudian menelurkan utas dan biarkan OS dan perangkat lunak tingkat rendah lainnya memutuskan bagaimana memanipulasi perangkat keras untuk menangani threading.
sumber