C #은 실시간 게임 서버에 적합합니까? [닫은]


22

질문의 대부분은 제목에 있습니다.

기본적으로 2D 멀티 플레이어 액션 게임을 개발하기 시작했습니다. 클라이언트는 아마도 XNA에있을 것이며 서버 측 개발에도 C #을 사용하는 것이 좋은지 여부를 여기에서 물을 것이라고 생각했습니다.

Java가 MMO 게임 서버에서도 사용되고 있기 때문에 언어가 관리된다는 사실이 문제가되지 않는다고 생각합니다 (잘못된 경우 수정하십시오).이 목적으로 C #을 피해야하는 이유가 있습니까? TCP를 통해 통신하고 SQL 서버와 채팅하려면 빠르고 응답 성이 있어야합니다. 그리고 C #을 피할 이유가 없다면, 그러한 웹 서버를 어떻게 배포합니까? 서버 컴퓨터에서 실행되는 .NET EXE입니까?


2
Java MMO 서버 에 대해 올바른 것 입니다.
Ricket

답변:


22

내 경험에서 실용적 일뿐만 아니라 정말 좋습니다. C #을 사용하여 여러 MMO 서버를 개발했으며 언어 및 플랫폼 선택을 후회하지 않았다고 말해야합니다.

C # 및 .NET에는 네트워크, 로깅, O / R 매핑 등과 같은 훌륭한 라이브러리와 도구가 많이 있습니다. Java C #에 비해 표현력이 뛰어나고 덜 장황합니다 (일부 사람들은 이에 대해 논쟁 할 수 있습니다 ..) )

초당 수십억 개의 할당으로 남용하지 않는 한 일부 사람들을 두려워하는 GC "오버 헤드"는 실제로 문제가되지 않습니다. 예를 들어, 현재 서버는 과부하시 최대 50mb / 초를 할당하며 GC는 눈에 띄는 지연을 일으키지 않습니다. 그러나 전략적 장소에서 객체 풀링을 사용해야했습니다. 가장 중요한 것은 네트워크 패킷을 나타내는 객체가 풀링되고 가비지 수집되지 않습니다. 그래도 풀링을 해제 한 경우에도 GC가 가장 큰 문제는 아닙니다.

C #이 얼마나 멋진 지에 대한 예로서 최근에 구현 한 것입니다. 우리 서버는 게임 클라이언트가 중요하지 않은 작업에 사용하는 몇 가지 WCF 서비스를 실행하고 서버 관리에도 사용합니다. WCF 서비스를 만들어 게임 오브젝트를 호출자에게 반환하는 것은 매우 쉽습니다. 그래서 우리는 그냥 그렇게 한 다음 서버에 연결하는 LINQPad에 작은 플러그인을 만들었습니다. 이제 우리는 다음과 같은 쿼리를 실행할 수 있습니다.

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

라이브 서버에서! 다른 플랫폼에서는이 작업을 수행 할 수 없다고 생각합니다. 적어도 며칠은 일하지 않습니다.


특히 LINQ를 사용하면 서버를 훨씬 간단하고 빠르게 개발할 수 있습니다.
토마스

26

물론 C #을 사용할 수 있습니다.

C # 또는 기타 .NET 에코 시스템의 성능 측면에서 알아야 할 더 큰 문제 중 하나는 GC입니다 . .NET 프레임 워크는 "서버"GC를 포함하여 학습 할 가치가있는 여러 가지 GC를 제공합니다 . 풀링과 같은 지능적으로 메모리 관리는 관리되는 환경에서도 여전히 좋은 기술입니다.

기본 프레임 워크의 일부 또는 타사를 통해 SQL과 상호 작용하고 TCP 등을 통해 통신하는 C #의 강력한 API가 몇 가지 있으므로 문제가 발생하지 않습니다.

서버가 웹 기반이 되길 원한다면 ASP.NET 또는 이와 유사한 기능을 사용할 수 있습니다. 프로세스를 실행하고 TCP 연결을 수신하려는 경우 .exe 및 해당 종속성을 서버 시스템에 배포하고 적절한 포트를 열고 .exe를 실행하면됩니다.


5

좋은 생각이라고 생각합니다. 이 언어는 확실히 그 능력을 가지고 있으며, 특히 당신이 알고있는 언어라면 "빠른"언어 때문에 새로운 언어를 배우는데 많은 시간을 소비하지 마십시오. 서버의 실제 병목 현상은 네트워크 대기 시간입니다. C ++ 대신 C #을 사용했기 때문에 차이가 없습니다.


5
관리되는 언어에서 게임 개발 (또는 모든 실시간 개발)의 실제 위험은 모든 것이 1 밀리 초 또는 2 시간 더 걸리는 것이 아니라 GC가 일을 마무리하기로 결정했기 때문에 임의의 프레임이 수십 밀리 초 더 오래 걸린다는 것입니다. "병목 현상"과 같은 용어로 처리량 중심의 비교를 장려하는 것은 잘못된 것입니다.

3

Windows에 배포해도 괜찮다면, 특히 클라이언트가 C #이기 때문에 강력하게 권장합니다.

게임 서버 개발을 과소 평가하지 마십시오. 간단한 채팅 전용 동시 서버를 만드는 것조차 사소한 일이 아니며 곧 동시성, 잠금, 성능 등에 관한 많은 질문이 있습니다.

시작점으로, 여러 플랫폼에서 동시 소켓 프로그래밍을 수행하는 방법을 광범위하게 설명하는이 페이지를 살펴보고 싶습니다.

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

정말로 진지하다면 Stevens의 유닉스 네트워크 프로그래밍을 철저히 공부하는 것이 좋습니다. 유닉스의 C 소켓에 중점을두고 있지만 원칙은 .net을 포함한 다른 모든 플랫폼에서 동일합니다.

편집 : 이것은 .net의 동시 서버에 대한 확장 성과 성능에 중점을 둔 또 다른 훌륭한 리소스입니다. 더 이상 사용할 수 없지만 웨이 백 머신의 친구에게는 사본이 있습니다.

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


1

하나의 '불이익'은 여러 플랫폼에서 C #을 사용하려면 C #을 사용하면 코드가 모노와 함께 작동하는지주의해야합니다. 관심있는 모든 것이 단일 플랫폼에서 실행되고 Windows가 해당 플랫폼이면 다른 사람들이 언급했듯이 아무런 문제가 없습니다.


MONO를 사용하여 다른 플랫폼에 배포 할 수 있습니다. Second Life는이 접근 방식을 사용한다고 생각합니다. 내부 게임 스크립트는 실제로 .NET IL로 컴파일되었지만 Linux AFAIK에 배포됩니다.
ShadowChaser 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.