C # gerçek zamanlı oyun sunucusu için uygun mu? [kapalı]


22

Sorunun çoğu başlığında.

Temel olarak, 2B çok oyunculu aksiyon oyunu geliştirmeye başladım. İstemci (muhtemelen) XNA'da olacak ve burada sunucu tarafı gelişimi için C # kullanmanın iyi bir fikir olup olmadığını sormam gerektiğini düşünmüştüm.

Dilin yönetildiği gerçeği, Java'nın MMO oyun sunucularında bile kullanıldığından (eğer hatalıysam düzeltin) düzeltir, bu nedenle C # 'dan kaçınmak için herhangi bir neden var mı? Hızlı ve duyarlı olmasına, TCP üzerinden iletişim kurmasına, bir SQL sunucusuyla sohbet etmesine ihtiyacım var. Ve C # 'dan kaçınmak için bir neden yoksa, nasıl böyle bir web sunucusunu konuşlandırırım, sunucu makinede çalışan bir .NET EXE olur mu?


Yanıtlar:


22

Tecrübelerime göre sadece uygulanabilir değil aynı zamanda gerçekten de iyi. C # kullanarak birkaç MMO sunucusu geliştirdim ve dilden ve platform seçiminden asla pişman olmadığımı söylemeliyim.

Genel olarak C # ve .NET için pek çok harika kütüphane ve araç var - ağ, günlüğe kaydetme, O / R haritalama, vb. )

Bazı insanları korkutan GC "yükü", saniyede milyarlarca tahsisatla kötüye kullanmadığınız sürece, gerçekten bir sorun değildir. Örnek olarak, mevcut sunucumuz ağır yük altında saniyede 50 mb / sn hıza sahiptir ve GC fark edilebilir bir gecikme sağlamamaktadır. Stratejik yerlerde nesne havuzlama kullanmak zorunda kaldık - en önemlisi, ağ paketlerini temsil eden nesneler havuzlanmış ve çöp toplamayanlar. Yine de, havuzlama kapalı olsa bile, GC en büyük sorun değildir.

C # 'ın ne kadar soğuk olduğuna bir örnek olarak, son zamanlarda uyguladığımız şey bu. Sunucumuz, oyun istemcisinin kritik olmayan görevler için kullandığı birçok WCF servisi kullanıyor ve bunları sunucu yönetimi için de kullanıyoruz. Görünüşe göre, oyun nesnelerimizi arayan kişiye geri döndürmek için bir WCF servisi yapmak çok kolaydır. Biz de tam bunu yaptık, sonra sunucumuza bağlanan LINQPad'e küçük bir eklenti yaptık - ve şimdi şu gibi sorguları çalıştırabiliriz:

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

Canlı bir sunucuda, daha az değil! Bunu başka bir platformla yapabileceğini sanmıyorum. En azından birkaç günlük işte değil.


Özellikle LINQ kullanımını seviyorum, bu sunucuyu geliştirmek için çok daha basit ve daha hızlı hale getiriyor.
Thomas

26

Elbette, C # kullanabilirsiniz.

C # veya diğer .NET ekosistemlerinde performans açısından dikkat edilmesi gereken en büyük sorunlardan biri GC'dir - .NET çerçevesi, öğrenmeye değer bir "sunucu" GC de dahil olmak üzere çeşitli GC lezzetleri sağlar . Akıllıca hafıza yönetimi (örneğin havuz yaparak), yönetilen bir ortamda bile hala iyi bir tekniktir.

Temel çerçevenin bir parçası olarak ya da üçüncü taraflar aracılığıyla C # 'da TCP ve C #' da iletişim kurarken, SQL ile etkileşime girmek için çeşitli sağlam API'ler vardır, bu yüzden orada sorun yaşamanız gerekmez.

Sunucunuzun web tabanlı olmasını gerçekten istiyorsanız, ASP.NET veya benzerlerini kullanabilirsiniz; Yalnızca bir işlemi çalıştırmak ve TCP bağlantılarını dinlemek istiyorsanız, sadece bir .exe dosyasını ve sunucuya uygun bağımlılıkları dağıtabilir, uygun bağlantı noktalarını açabilir ve .exe dosyasını çalıştırabilirsiniz.


5

Bence bu harika bir fikir. Dil kesinlikle onun yeteneğine sahip ve özellikle bildiğiniz ise, sadece "daha hızlı" olduğu için yeni bir dil öğrenmek için çok fazla zaman harcamayın. Sunucunuzun gerçek darboğaz ağ gecikmesi olacak; fazladan bir milisaniye veya iki C ++ yerine C # kullandığınız için bir fark yaratmaz.


5
Yönetilen dillerde oyun geliştirme (veya gerçek zamanlı herhangi bir gelişme) riski her şeyin bir ya da iki saniye sürdüğü değil, fakat rastgele karelerin, GC işlemlerini sonuçlandırmaya karar vermesinden dolayı onlarca milisaniyeden daha uzun sürmesidir. "Darboğaz" gibi terimlerle verim odaklı karşılaştırmaları teşvik etmek yanıltıcıdır.

3

Windows'ta dağıtmanız uygun değilse, özellikle istemciniz C # olduğundan kesinlikle öneririm.

Yine de oyun sunucusu gelişimini küçümsemeyin. Sadece basit sohbet eşzamanlı bir sunucu yapmak bile önemsiz bir iş değildir ve yakında eşzamanlılık, kilitleme, performans vb. İle ilgili birçok sorunuz olacak.

Tıpkı bir başlangıç ​​noktası olarak, aynı anda birkaç platformda eşzamanlı soket programlamanın nasıl yapıldığını açıklayan bu sayfaya bir göz atmanızı istiyorum:

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

Bu konuda gerçekten ciddiysen, Stevens'ın Unix Ağ Programcılığını iyice incelemeni öneririm. Unix'teki C soketlerine odaklanmıştır, ancak prensipler .net dahil diğer tüm platformlar için aynıdır.

Düzenleme: Bu, net ağdaki eşzamanlı sunucular için ölçeklenebilirlik ve performansa odaklanan başka bir harika kaynaktır. Artık mevcut değil, ancak geridönüş makinesindeki arkadaşlarımızın bir kopyası var.

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


1

Bir 'dezavantaj', C # ile birden fazla platformda kullanmak istiyorsanız, kodunuzun mono ile çalışacağından emin olmak için çok dikkatli olmanız gerektiğidir. Tek umursadığınız tek bir platformda çalıştırıyorsanız ve pencereler o platformsa, başkalarının söylediği gibi sorun yaşamazsınız.


MONO'nun diğer platformlarda dağıtmak için kullanılabileceğini unutmayın. Second Life'ın bu yaklaşımı kullandığına inanıyorum - iç oyun komut dosyaları aslında .NET IL'ye derlendi, ancak bunlar Linux AFAIK'ta da kullanıldı.
ShadowChaser
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.