Multi-platform multi-threading: Apa tantangan nyata?

21

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.

Insinyur
sumber
Karena jawaban saya tidak sepenuhnya menjawab pertanyaan Anda, dapatkah Anda merinci apa yang hilang / apa yang ingin Anda ketahui? Saya mungkin bukan penulis yang hebat, tetapi saya sudah menangani masalah seperti ini lebih dari sekali.
Valmond
Anda benar-benar belum menjawab pertanyaan, yaitu tentang kesulitan multithreading dan bagaimana mengatasinya ketika mengembangkan untuk platform dengan kemampuan threading yang berbeda . Lihat paragraf saya di bawah poin-poin. Anda berbicara tentang ukuran dan resolusi layar - yang tidak ada hubungannya dengan pertanyaan saya - baca judulnya.
Insinyur
1
Saya kira kesulitannya berasal dari untuk apa Anda ingin menggunakan utas. Adalah satu hal memiliki thread helper melakukan sesuatu di samping, dan benar-benar hal lain untuk mencoba memeras bit terakhir kinerja dari mesin 8-core .. Cara saya melihatnya, thread SDL sebagian besar dimaksudkan untuk yang pertama, bukan yang terakhir.
Jari Komppa

Jawaban:

11

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 ".

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).

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.

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

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 .

Kylotan
sumber
Poin yang sangat bagus. Dan benar, saya menggunakan kata "kesulitan" ketika "tantangan" akan lebih akurat. Anda berkata, "Dekomposisi 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." Bisakah Anda menguraikan ini? Sediakan sumber? Agak kabur tetapi saya katakan Anda sampai ke inti permasalahan di sana.
Insinyur
Maaf, saya pikir pendekatan semacam ini sudah dikenal luas. Saya akan menguraikan jawabannya.
Kylotan
4

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.

Valmond
sumber
Dari atas kepala Anda, berapa banyak waktu overhead yang akan Anda katakan bahwa proyek memiliki fase desain dan pengembangan, untuk mengakomodasi rilis multi-platform seperti ini? Rata-rata kasar saja akan membantu.
Insinyur
1
Ya, seperti yang kami lakukan dalam multi bahasa (Inggris, Perancis, Spanyol, Portugis, Jerman dan Italia dalam satu paket + bahasa apa pun yang dibutuhkan pada hari itu, taiwan, turki, rusia ...) dan kami memiliki platform baru yang kami perlukan untuk "port" semua permainan kami setiap beberapa bulan (baca kelas ponsel baru) kami benar-benar akan kehilangan banyak waktu tidak pergi dengan cara ini, itu benar-benar tidak mungkin sebenarnya tanpa suhu yang sangat besar. Desain 'framework' dilakukan saat saya belajar tentang ponsel yang berbeda dan menjadi dewasa setelah mungkin 3-4 tahun. Investasi yang layak.
Valmond
1

Saya merasa bahwa satu-satunya cara untuk melakukan ini adalah mengevaluasi berapa banyak thread yang dapat dijalankan per setiap perangkat yang ingin Anda dukung, dan mencari tahu apa yang merupakan common denominator terendah.

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.

Apa cara terbaik untuk mengatasi pengembangan dengan cara ini (diberikan API threading lintas-platform) dengan mempertimbangkan hal berikut:

different numbers of cores
vastly different processing capabilities per core
A generally different systems architecture with eg. different

latensi untuk cache, RAM, dan akses I / O

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.

Nol
sumber