Meskipun saya tahu bahwa bahasa fungsional bukan yang paling umum digunakan untuk menulis game, ada banyak manfaat yang dikaitkan dengan mereka yang sepertinya akan menarik dalam konteks pemrograman apa pun. Terutama kemudahan paralelisasi yang saya pikir bisa sangat berguna karena fokus bergerak ke arah lebih banyak prosesor.
Juga, dengan F # sebagai anggota baru dari keluarga .NET, ini dapat digunakan secara langsung dengan XNA, misalnya, yang menurunkan ambang sedikit, dibandingkan dengan menggunakan LISP, Haskell, Erlang, dll.
Jika ada yang punya pengalaman menulis game dengan kode fungsional, apa yang ternyata positif dan negatif? Apa yang cocok untuk itu, apa yang tidak?
Sunting: Sulit untuk memutuskan bahwa ada satu jawaban yang bagus untuk ini, jadi mungkin lebih cocok sebagai pos wiki komunitas.
sumber
Jawaban:
Saat ini saya sedang mengerjakan game di Haskell. Saya tidak dapat berbicara untuk pemrograman fungsional secara umum, tetapi untuk Haskell secara khusus:
Yang baik
Ini adalah hal-hal luar biasa yang membuat Haskell sangat menonjol.
Keburukan
Ini adalah hal-hal yang tidak baik tetapi dapat diselesaikan tanpa terlalu banyak usaha.
Jelek
Ini adalah hal-hal yang perlu upaya besar untuk diatasi.
sumber
Saya menghabiskan tahun lalu mengembangkan mesin permainan komersial di Haskell, dan bagi kami, pengalamannya sangat positif. Dunia permainan kami sangat kompleks, dan Haskell membuatnya mudah untuk memodelkan proses konversi dari format editor ke format mesin game. Saya tidak suka berpikir seperti apa kode itu dalam bahasa imperatif.
Kebocoran antariksa telah muncul pada beberapa kesempatan, dan sementara mereka telah menyebabkan sedikit masalah, dalam skema umum jumlahnya sedikit (misalnya dibandingkan dengan menemukan deadlock di proyek Jawa dengan ukuran yang sama), dan begitu mereka diperbaiki , mereka tetap diam.
Kami menggunakan FRP mirip dengan Yampa, dan tentu saja ada kurva belajar yang terkait dengannya, tapi begitu selesai, pengalamannya sangat positif. Perpustakaan tidak menjadi masalah bagi kami - semua yang kami butuhkan telah tersedia. Penundaan pengumpulan sampah adalah masalah khusus karena itu untuk platform yang disematkan. Kami telah menggunakan beberapa C ++ untuk mengelola animasi. Kinerja juga menjadi masalah dengan ini menjadi platform tertanam (= prosesor lambat). Kami telah melakukan beberapa C dan kami juga melihat teknologi Haskell yang muncul seperti akselerasi. Animator C ++ adalah keputusan desain sejak awal dan tempat-tempat di mana kode terlalu lambat hanya area yang sangat kecil. Dalam jangka panjang, kami ingin menerjemahkan semua C kami ke Haskell.
Haskell telah membuat pekerjaan yang sulit menjadi mudah, dan semua kesulitan yang baru saja saya sebutkan sangat kecil dibandingkan dengan sejumlah besar kode kompleks yang kami hasilkan yang bersih, dapat dipelihara dan cukup banyak yang tidak bisa dipecahkan. Paralelisme akan menjadi masalah dalam pengembangan game segera, dan kami sangat baik ditempatkan untuk menghadapinya. Beberapa dari apa yang saya katakan mungkin tidak berlaku untuk proyek-proyek kecil, karena kita berada di sini untuk jangka panjang, jadi biaya awal seperti kurva belajar, dukungan perpustakaan, dll, jauh lebih sedikit dari masalah.
sumber
Dave menyebutkan beberapa poin bagus, meskipun saya harus menunjukkan bahwa Haskell telah menyelesaikan kedua masalahnya. Statelessness dapat di-bypass menggunakan State monad (EDIT: not really - lihat di bawah untuk detailnya) , dan sequencing dapat ditangani menggunakan IO monad (EDIT: atau monad lainnya, dalam hal ini ...) .
Tantangan yang akan Anda hadapi (dan bahwa saya sudah mencoba mempelajari pemrograman game dan Haskell), lebih sesuai. (Ini semua Haskell-spesifik, karena saya benar-benar belum mendalam dengan bahasa FP lainnya.)
Sisi lain dari ini adalah bahwa segala sesuatunya membaik dengan cepat. Dan itu semua tergantung pada apa yang Anda inginkan dari pengalaman itu. Anda ingin membuat game dan menaruhnya di situs web Anda untuk mencari ketenaran dan kekayaan? Tetap dengan C ++ atau Python. Tetapi jika Anda ingin mempelajari sesuatu yang baru yang mengharuskan Anda berinovasi dalam proses Anda, cobalah bahasa fungsional. Hanya memiliki banyak kesabaran terhadap diri sendiri saat Anda belajar.
Antti Salonen memiliki blog yang menarik yang merinci perselingkuhannya dengan pemrograman Haskell. Itu layak dibaca.
Sunting (satu tahun kemudian): Sekarang saya telah mempelajari Monad negara lebih banyak, saya menyadari itu bukan solusi yang sangat baik bagi negara yang dimaksudkan untuk bertahan di luar fungsi tertentu. Solusi nyata untuk kewarganegaraan ditemukan di Haskell di IOVar, ST, MVar (untuk keamanan utas), atau melalui sesuatu seperti Yampa, yang menggunakan Arrows dan FRP untuk mengelola keadaan internal yang tetap tersembunyi dari pengembang. (Daftar ini dalam urutan kesulitan, meskipun tiga yang pertama tidak terlalu sulit setelah Anda memahami monad.)
sumber
Caml objektif!
Menggunakan bahasa fungsional dapat menjadi keuntungan besar di sebagian besar jenis pengembangan perangkat lunak, terutama karena mereka sangat mengurangi waktu pengembangan. Saya bisa melihat potensi besar untuk menulis server backend ke permainan, atau lapisan AI dan logika pada klien, dalam bahasa fungsional. Dan seperti semua orang tahu, LISP telah digunakan untuk skrip NPC.
Jika saya mencoba untuk menulis garis depan permainan dalam bahasa fungsional, saya pasti akan memilih Objective Caml , yang merupakan bahasa hybrid. Ini adalah keturunan ML, dan memungkinkan untuk mencampur gaya iteratif dan fungsional, memiliki sistem objektif dengan objek stateful. (Caml adalah bahasa tempat F # dimodelkan.)
Binding OpenGL tampaknya bekerja dengan sempurna dan orang-orang telah membuat game di OCaml untuk waktu yang lama. Bahasa dapat dikompilasi dan berpotensi sangat cepat (itu terkenal memenangkan C dalam beberapa tolok ukur di masa lalu, jangan bagaimana keadaan sekarang).
Ada juga banyak perpustakaan. Semuanya, mulai dari ilmu komputer hingga pengikatan ke semua jenis perpustakaan.
sumber
Tidak benar-benar jawaban untuk apa pun, tetapi saya merasa seperti diskusi tentang pemrograman game dalam bahasa fungsional tidak lengkap tanpa menyebutkan Pemrograman Fungsional Reaktif (FRP) - http://www.haskell.org/frp/ - dan implementasinya yang paling umum ( Saya pikir?), YAMPA - http://www.haskell.org/yampa/ .
sumber
Adapun manfaatnya, periksa Clean Game Library (http://cleangl.sourceforge.net/) dan periksa game platformer. Setelah Anda memahami sintaks (saya mendorong Anda untuk mencoba) Anda akan melihat keanggunan semata-mata dari konstruk dan seberapa dekat sumber memetakan ke konsep yang mereka ekspresikan. Sebagai bonus tambahan, abstraksi negara, dan keharusan untuk secara eksplisit melewati keadaan, membuat kode Anda lebih ramah multicore.
Di sisi lain, ini membutuhkan perubahan paradigma besar. Banyak hal yang biasa Anda lakukan tanpa memikirkannya tiba-tiba tidak ada lagi dan Anda akan bingung bagaimana menyelesaikannya, hanya karena Anda berpikir dalam pola yang salah.
sumber
Dari sudut pandang saya, tantangan terbesar adalah:
(begin...
" dalam skema PLT).Jangan ragu untuk memperpanjang daftar ini (dan mungkin menambahkan beberapa poin positif ^^).
sumber
Anda dapat menulis kode dalam C / C ++ dan menggunakan bahasa yang disematkan seperti Embedded Common Lisp untuk skrip Anda. Meskipun mendapatkan ini untuk dikompilasi pada platform yang berbeda mungkin sulit. Anda mungkin melihat Lisp Dalam Potongan Kecil untuk mempelajari cara menulis bahasa skrip Anda sendiri. Ini benar-benar tidak sulit, jika Anda punya waktu.
sumber
Saya telah menulis game sederhana di LISP dan itu menyenangkan tetapi bukan sesuatu yang saya sarankan. Pemrograman fungsional adalah semua tentang hasil akhir. Jadi itu sangat berguna untuk memproses data dan membuat keputusan, tetapi saya merasa sulit untuk melakukan kode bersih sederhana seperti loop kontrol dasar.
Saya belum belajar F # jadi mungkin jauh lebih mudah untuk dikerjakan.
sumber
positif akan kinerja dan portabilitas dan negatif akan mengelola kompleksitas , permainan hari ini sangat kompleks dan membutuhkan alat atau bahasa pemrograman yang dapat mengelola kompleksitas lebih baik, seperti metodologi berorientasi objek atau pemrograman generik yang sulit diimplementasikan dalam pemrograman fungsional bahasa.
sumber