Apakah C # layak untuk server game waktu-nyata? [Tutup]


22

Sebagian besar pertanyaan ada di judul.

Pada dasarnya, saya mulai mengembangkan game aksi multipemain 2D. Klien (mungkin) akan berada di XNA, dan saya pikir saya akan bertanya di sini tentang apakah itu ide yang baik untuk menggunakan C # untuk pengembangan sisi server juga.

Saya kira fakta bahwa bahasa tersebut dikelola bukanlah sesuatu yang bermasalah karena Java bahkan digunakan di server game MMO (koreksi saya jika saya salah), jadi apakah ada alasan untuk menghindari C # untuk tujuan ini? Saya membutuhkannya untuk cepat dan responsif, untuk berkomunikasi melalui TCP, untuk mengobrol dengan server SQL. Dan jika tidak ada alasan untuk menghindari C #, bagaimana saya menyebarkan server web seperti itu, apakah itu akan menjadi .NET EXE yang berjalan di mesin server?


2
Anda benar tentang server Java MMO .
Ricket

Jawaban:


22

Tidak hanya layak, tetapi benar-benar bagus, dalam pengalaman saya. Saya telah mengembangkan beberapa server MMO menggunakan C #, dan saya harus mengatakan saya tidak pernah menyesali pilihan bahasa dan platform.

Ada banyak perpustakaan besar dan alat untuk C # dan. NET secara umum - jaringan, logging, pemetaan O / R, dll. Dan, dibandingkan dengan Java C # lebih ekspresif dan kurang bertele-tele (beberapa orang mungkin berdebat tentang ini, meskipun .. )

"Overhead" GC yang membuat takut beberapa orang sebenarnya bukan masalah, kecuali jika Anda menyalahgunakannya dengan miliaran alokasi per detik. Sebagai contoh, server kami saat ini mengalokasikan hingga 50 mb / detik di bawah beban berat, dan GC tidak memperkenalkan kelambatan yang terlihat. Kami memang harus menggunakan pengumpulan objek di tempat-tempat strategis, namun - yang paling penting, objek yang mewakili paket jaringan dikumpulkan dan tidak dikumpulkan oleh sampah. Namun, bahkan dengan pooling dimatikan, GC bukan masalah terbesar.

Sebagai contoh betapa kerennya C #, inilah yang baru-baru ini kami terapkan. Server kami menjalankan beberapa layanan WCF, yang digunakan klien game untuk tugas-tugas non-waktu-kritis, dan kami juga menggunakannya untuk administrasi server. Ternyata, sangat mudah untuk membuat layanan WCF untuk hanya mengembalikan objek permainan kami ke pemanggil. Jadi kami melakukan hal itu, lalu membuat plugin kecil untuk LINQPad yang terhubung ke server kami - dan sekarang kita dapat menjalankan kueri seperti

from character in Service.GetOnlineCharacters()
where character.LocationManager.LocationId==5 && character.Attributes.Level<10
select new { character.Id, character.Nick }

Di server langsung, tidak kurang! Saya tidak berpikir Anda bisa melakukan ini dengan platform lain. Setidaknya tidak dalam pekerjaan beberapa hari.


Saya terutama menyukai penggunaan LINQ, ini membuat server jauh lebih sederhana dan lebih cepat untuk dikembangkan.
Thomas

26

Tentu, Anda bisa menggunakan C #.

Salah satu masalah yang lebih besar untuk diperhatikan dalam hal kinerja dalam C # atau ekosistem .NET lainnya adalah GC - kerangka .NET memberikan beberapa rasa GC , termasuk "server" GC, yang patut dipelajari. Mengelola memori secara cerdas (misalnya, dengan menyatukan) masih merupakan teknik yang baik bahkan dalam lingkungan yang dikelola.

Ada beberapa API yang kuat untuk berinteraksi dengan SQL, berkomunikasi melalui TCP, dan lain-lain di C #, baik sebagai bagian dari kerangka dasar atau melalui pihak ketiga, jadi Anda seharusnya tidak mengalami kesulitan di sana.

Anda dapat menggunakan ASP.NET atau serupa jika Anda benar-benar ingin server Anda berbasis web; jika Anda hanya ingin menjalankan suatu proses dan mendengarkan koneksi TCP Anda bisa menggunakan .exe dan dependensi yang sesuai ke mesin server, buka port yang sesuai, dan jalankan .exe.


5

Saya pikir ini adalah ide yang hebat. Bahasa ini tentu mampu, dan terutama jika itu yang Anda tahu, jangan menghabiskan banyak waktu untuk belajar bahasa baru hanya karena "lebih cepat". Hambatan nyata server Anda adalah latensi jaringan; satu atau dua milidetik tambahan karena Anda menggunakan C # bukannya C ++ tidak akan membuat perbedaan.


5
Risiko nyata pengembangan game (atau pengembangan waktu nyata) dalam bahasa yang dikelola bukanlah bahwa semuanya membutuhkan satu atau dua milidetik lebih lama, tetapi kerangka acak akan memakan waktu puluhan milidetik lebih lama karena GC memutuskan untuk menyelesaikan beberapa hal. Mendorong perbandingan yang berfokus pada keluaran dengan istilah seperti "bottleneck" menyesatkan.

3

Jika Anda boleh menggunakan Windows, saya sangat merekomendasikannya, terutama karena klien Anda adalah C #.

Jangan meremehkan pengembangan server game. Bahkan membuat server konkuren khusus obrolan sederhana bukanlah tugas sepele, dan Anda akan segera memiliki banyak pertanyaan tentang konkurensi, penguncian, kinerja, dll.

Sama seperti titik awal, saya ingin Anda melihat halaman ini yang secara luas menjelaskan bagaimana melakukan pemrograman socket bersamaan di beberapa platform:

http://geekswithblogs.net/quension/archive/2006/06/30/83760.aspx

Jika Anda benar-benar serius tentang hal itu, saya sarankan Anda mempelajari Pemrograman Jaringan Unix Stevens secara menyeluruh. Ini berfokus pada soket C di Unix, tetapi prinsipnya sama untuk setiap platform lainnya, termasuk .net.

Sunting: Ini adalah sumber yang bagus, berfokus pada skalabilitas dan kinerja untuk server bersamaan di .net. Tidak lagi tersedia, tetapi teman-teman kami di mesin wayback memiliki salinannya.

http://replay.waybackmachine.org/20080405220143/http://www.coversant.net/dotnetnuke/Coversant/Blogs/tabid/88/EntryID/10/Default.aspx


1

Satu 'kerugian' adalah bahwa dengan C # jika Anda ingin menggunakannya pada banyak platform, Anda harus sangat berhati-hati untuk memastikan bahwa kode Anda akan bekerja dengan mono. Jika yang Anda pedulikan adalah menjalankannya pada satu platform dan windows adalah platform itu, maka Anda seharusnya tidak memiliki masalah seperti yang disebutkan orang lain.


Jangan lupa bahwa MONO dapat digunakan untuk digunakan di platform lain. Saya percaya Second Life menggunakan pendekatan ini - skrip permainan internal mereka sebenarnya dikompilasi untuk .NET IL namun mereka gunakan di Linux AFAIK.
ShadowChaser
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.