Czy C # nadaje się do serwera gier w czasie rzeczywistym? [Zamknięte]

22

Większość pytań znajduje się w tytule.

Zasadniczo zaczynam opracowywać wieloosobową grę akcji 2D. Klient będzie (prawdopodobnie) w XNA i pomyślałem, że zapytam tutaj, czy dobrym pomysłem jest używanie C # również do programowania po stronie serwera.

Myślę, że zarządzanie językiem nie jest problematyczne, ponieważ Java jest używana nawet na serwerach gier MMO (popraw mnie, jeśli się mylę), więc czy są jakieś powody, aby unikać C # w tym celu? Potrzebuję, aby był szybki i elastyczny, komunikował się przez TCP, rozmawiał z serwerem SQL. A jeśli nie ma powodu, aby unikać C #, w jaki sposób wdrożyłbym taki serwer sieciowy, czy byłby to plik .NET EXE działający na serwerze?

Zaky German
źródło
2
Masz rację co do serwera Java MMO .
Ricket

Odpowiedzi:

22

Z mojego doświadczenia nie tylko wykonalne, ale naprawdę dobre. Opracowałem kilka serwerów MMO przy użyciu C # i muszę powiedzieć, że nigdy nie żałowałem wyboru języka i platformy.

Istnieje wiele świetnych bibliotek i narzędzi dla C # i .NET w ogóle - sieć, logowanie, mapowanie O / R itp. A w porównaniu do Java C # jest bardziej ekspresyjny i mniej gadatliwy (niektórzy mogą się o to kłócić .. )

„Narzut” GC, który przeraża niektórych ludzi, nie jest tak naprawdę problemem, chyba że zdarzy się, że wykorzystasz go miliardami przydziałów na sekundę. Na przykład nasz obecny serwer przy dużym obciążeniu przydziela do 50 Mb / s, a GC nie wprowadza zauważalnego opóźnienia. Musieliśmy jednak korzystać z pulowania obiektów w strategicznych miejscach - co najważniejsze, obiekty reprezentujące pakiety sieciowe są łączone w puli, a nie gromadzone w pamięci. Mimo to, nawet przy wyłączonym poolingu, GC nie jest największym problemem.

Jako przykład tego, jak fajne jest C #, właśnie to niedawno wdrożyliśmy. Nasz serwer obsługuje kilka usług WCF, z których korzysta klient gry do zadań niekrytycznych czasowo, a my używamy ich również do administrowania serwerem. Okazuje się, że bardzo łatwo jest zrobić usługę WCF, aby po prostu zwrócić nasze obiekty gry do osoby dzwoniącej. Właśnie to zrobiliśmy, a następnie stworzyliśmy małą wtyczkę do LINQPad, która łączy się z naszym serwerem - a teraz możemy uruchamiać zapytania takie jak

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

Na serwerze na żywo, nie mniej! Nie sądzę, że możesz to zrobić na jakiejkolwiek innej platformie. Przynajmniej nie w pracy na kilka dni.

Nieważne
źródło
Szczególnie podoba mi się użycie LINQ, dzięki czemu serwer jest o wiele prostszy i szybszy w rozwoju.
Thomas
26

Jasne, możesz użyć C #.

Jednym z większych problemów, o których należy pamiętać, jeśli chodzi o wydajność w C # lub innych ekosystemach .NET, jest GC - platforma .NET zapewnia kilka odmian GC , w tym GC „serwerową”, o których warto się dowiedzieć. Inteligentne zarządzanie pamięcią (na przykład poprzez pule) jest nadal dobrą techniką nawet w zarządzanym środowisku.

Istnieje kilka niezawodnych interfejsów API do interakcji z SQL, komunikowania się przez TCP i tak dalej w języku C #, albo jako część podstawowej struktury, albo za pośrednictwem stron trzecich, więc nie powinieneś mieć żadnych problemów.

Możesz użyć ASP.NET lub podobnego oprogramowania, jeśli naprawdę chcesz, aby twój serwer był oparty na sieci; jeśli chcesz tylko uruchomić proces i nasłuchiwać połączeń TCP, możesz po prostu wdrożyć plik .exe i odpowiednie zależności na serwerze, otworzyć odpowiednie porty i uruchomić plik .exe.


źródło
5

Myślę, że to świetny pomysł. Język jest z pewnością do tego zdolny, a zwłaszcza jeśli wiesz, nie marnuj czasu na naukę nowego języka tylko dlatego, że jest „szybszy”. Prawdziwym wąskim gardłem twojego serwera będzie opóźnienie sieci; dodatkowa milisekunda lub dwie, ponieważ użyłeś C # zamiast C ++ nie zrobi różnicy.

Ricket
źródło
5
Prawdziwe ryzyko rozwoju gry (lub dowolnego rozwoju w czasie rzeczywistym) w zarządzanych językach nie polega na tym, że wszystko zajmuje milisekundę lub dwie dłużej, ale że losowe klatki potrwają kilkadziesiąt milisekund dłużej, ponieważ GC postanowiła sfinalizować. Zachęcanie do zorientowanych na wydajność porównań z terminami takimi jak „wąskie gardło” jest mylące.
3

Jeśli możesz wdrożyć w systemie Windows, zdecydowanie polecam, zwłaszcza, że ​​twój klient to C #.

Nie lekceważ jednak rozwoju serwerów gier. Nawet stworzenie prostego serwera współbieżnego tylko do czatu nie jest łatwym zadaniem, a wkrótce będziesz mieć wiele pytań dotyczących współbieżności, blokowania, wydajności itp.

Na początek chciałbym, abyś spojrzał na tę stronę, która szeroko wyjaśnia, jak wykonywać współbieżne programowanie gniazd na kilku platformach:

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

Jeśli naprawdę podchodzisz do tego poważnie, poleciłbym gruntownie przestudiować programowanie sieciowe Unixa Stevensa. Koncentruje się na gniazdach C w systemie Unix, ale zasady są takie same dla każdej innej platformy, w tym .net.

Edycja: to kolejny świetny zasób, skoncentrowany na skalowalności i wydajności dla współbieżnych serwerów w .net. Nie jest już dostępny, ale nasi znajomi z przydrożnej maszyny mają jego kopię.

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


źródło
1

Jedną „wadą” byłoby to, że z C #, jeśli chcesz używać go na wielu platformach, musisz bardzo uważać, aby upewnić się, że Twój kod będzie działał w trybie mono. Jeśli zależy Ci tylko na uruchomieniu go na jednej platformie, a Windows to właśnie ta platforma, nie powinieneś mieć problemów, jak wspominali inni.

Kyle C.
źródło
Nie zapominaj, że MONO można wykorzystać do wdrożenia na innych platformach. Wierzę, że Second Life korzysta z tego podejścia - ich wewnętrzne skrypty gier są w rzeczywistości kompilowane do .NET IL, ale są wdrażane na Linux AFAIK.
ShadowChaser