Perangkap apa yang Anda temui ketika menulis game untuk PC dengan Bahasa yang dikelola seperti C # dan bagaimana Anda mengatasinya?
Perangkap apa yang Anda temui ketika menulis game untuk PC dengan Bahasa yang dikelola seperti C # dan bagaimana Anda mengatasinya?
Jawaban:
Saya tidak tahu banyak tentang Java, jadi ini dari sudut pandang pengembang .net.
Yang terbesar sejauh ini adalah sampah. Pengumpul sampah .NET di Windows melakukan pekerjaan yang fantastis, dan Anda dapat pergi tanpa bayi yang paling sering melakukannya. Di Xbox / Windows Phone 7 itu masalah yang berbeda. Jika Anda mendapatkan kios setiap beberapa bingkai, pengumpulan sampah mungkin menyebabkan masalah bagi Anda. Saat ini ia memicu setelah setiap alokasi 1MB.
Berikut ini beberapa kiat untuk menangani sampah. Anda seharusnya tidak perlu khawatir tentang sebagian besar dari ini dalam kenyataan, tetapi mereka mungkin berguna suatu hari.
GC.GetTotalMemory()
ke layar. Ini memberi Anda perkiraan jumlah byte yang dialokasikan yang digunakan game Anda. Jika sulit bergerak, Anda baik-baik saja. Jika naik cepat, Anda memiliki masalah.GC.Collect()
. Jika Anda tahu sebagian besar alokasi besar Anda tidak ada, itu bagus untuk membiarkan sistem mengetahuinya.GC.Collect()
setiap frame. Ini mungkin tampak seperti ide yang bagus, menjaga di atas sampah Anda dan semua itu, tapi ingat satu-satunya yang lebih buruk daripada pengumpulan sampah adalah pengumpulan sampah.StringBuilder
(waspadalah, StringBuilder
bukan peluru ajaib, dan masih dapat menyebabkan alokasi! Ini berarti operasi sederhana seperti menambahkan nomor ke ujung string dapat membuat jumlah sampah yang mengejutkan) atau menggunakan foreach
loop atas koleksi yang menggunakan IEnumerable
antarmuka juga dapat membuat sampah tanpa Anda sadari (misalnya, foreach (EffectPass pass in effect.CurrentTechnique.Passes)
adalah yang umum)IDisposable
kelas yang berisi sumber daya yang tidak dikelola. Anda dapat menggunakan ini untuk membersihkan memori GC tidak dapat membebaskan dirinya sendiri.Hal lain yang perlu dipikirkan adalah kinerja floating point. Meskipun .NET JITer melakukan cukup banyak optimasi khusus prosesor, ia tidak dapat menggunakan SSE atau set instruksi SIMD lainnya untuk mempercepat matematika floating point Anda. Ini dapat menyebabkan perbedaan kecepatan yang cukup besar antara C ++ dan C # untuk game. Jika Anda menggunakan mono, mereka memiliki beberapa perpustakaan matematika SIMD khusus yang dapat Anda manfaatkan.
Jebakan kinerja tipical tidak mempertimbangkan pengumpul sampah dalam desain / pengembangan game. Memproduksi terlalu banyak sampah dapat menyebabkan "cegukan" dalam permainan, yang terjadi ketika GC berjalan untuk waktu yang cukup lama.
Untuk C #, menggunakan objek nilai dan pernyataan "menggunakan" dapat mengurangi tekanan dari GC.
using
pernyataan tidak ada hubungannya dengan pengumpulan sampah! Ini untuk IDisposable
objek - yang untuk melepaskan sumber daya yang tidak dikelola (yaitu: yang tidak ditangani oleh pemulung ).
Saya akan mengatakan masalah terbesar yang saya temui dalam menulis game di C # adalah kurangnya perpustakaan yang layak. Sebagian besar yang saya temukan adalah port langsung, tetapi tidak lengkap, atau dibungkus dengan pustaka C ++ yang menghasilkan penalti performa yang berat untuk marshaling. (Saya berbicara secara khusus tentang MOgre dan Axiom untuk perpustakaan OGRE, dan BulletSharp untuk perpustakaan fisika Bullet)
Bahasa yang dikelola (berbeda dari yang Diartikan - baik Java maupun C # tidak benar-benar ditafsirkan lagi) dapat secepat bahasa asli jika Anda memiliki pemahaman yang baik tentang apa yang sebenarnya membuatnya lambat (mengelompokkan, mengumpulkan sampah). Masalah sebenarnya, saya pikir, adalah pengembang perpustakaan belum menyadarinya.
Seperti yang dikatakan orang lain, jeda pengumpulan GC adalah masalah terbesar. Menggunakan kolam objek adalah salah satu solusi khas.
C # dan Java tidak diartikan. Mereka dikompilasi ke bytecode menengah yang, setelah JIT , menjadi secepat kode asli (atau cukup dekat untuk menjadi tidak signifikan)
Jebakan terbesar yang saya temukan adalah membebaskan sumber daya yang secara langsung memengaruhi pengalaman pengguna. Bahasa-bahasa ini tidak secara otomatis mendukung finalisasi deterministik seperti yang dilakukan C ++, yang jika Anda tidak mengharapkannya dapat menyebabkan hal-hal seperti jerat melayang di tempat kejadian setelah Anda berpikir mereka dihancurkan. (C # menyelesaikan finalisasi deterministik melalui IDisposable , saya tidak yakin apa yang dilakukan Java.)
Selain itu, bahasa yang dikelola benar-benar jauh lebih mampu menangani jenis kinerja yang dibutuhkan game daripada yang mereka dapatkan. Kode yang dikelola dengan baik jauh lebih cepat daripada kode asli yang ditulis dengan buruk.
IDisposable
memungkinkan pembersihan deterministik dari sumber daya waktu-kritis dan tidak dikelola, tetapi tidak secara langsung mempengaruhi finalisasi atau pengumpul sampah.
Baik Java maupun C # tidak ditafsirkan. Keduanya dikompilasi ke dalam kode mesin asli.
Masalah terbesar dengan mereka berdua dan permainan adalah harus kode sedemikian rupa sehingga mereka tidak pernah mengumpulkan sampah selama bermain game. Jumlah lingkaran yang harus Anda lewati untuk mencapai yang hampir melebihi manfaat dari menggunakannya di tempat pertama. Sebagian besar fitur yang membuat bahasa tersebut menyenangkan untuk digunakan untuk aplikasi atau pemrograman server harus dihindari untuk pemrograman game, jika tidak Anda akan mendapat jeda lama selama bermain game saat mereka pergi dan mengumpulkan sampah.
Satu perangkap besar yang saya lihat dari membuat game dengan bahasa seperti ini (atau menggunakan alat seperti XNA, mesin TorqueX, dll.) Adalah bahwa Anda akan kesulitan menemukan tim orang-orang baik dengan keahlian yang dibutuhkan untuk membuat game yang setara dengan apa akan cukup mudah untuk menemukan orang-orang di C ++ dan OpenGL / DirectX.
Industri game dev masih sangat mendalami C ++ karena sebagian besar alat dan jalur pipa yang digunakan untuk mendorong game kecil besar atau terpoles dengan baik ditulis dalam C ++, dan sejauh yang saya tahu SEMUA kit dev resmi yang Anda bisa dapatkan untuk XBox, PS3, dan Wii dirilis hanya dengan kompatibilitas untuk C ++ (XBox toolset mungkin lebih dikelola saat ini, ada yang tahu lebih banyak?)
Jika Anda ingin mengembangkan gim untuk konsol saat ini, Anda cukup banyak mendapatkan XNA dan C # di XBox dan kemudian hanya di bagian samping perpustakaan gim yang disebut XBox Live Indie Games. Beberapa yang memenangkan kontes dll. Dipilih untuk memport game mereka ke XBox Live Arcade asli. Selain itu berencana membuat game untuk PC.