Чи є C # життєздатним для ігрового сервера в реальному часі? [зачинено]


22

Більшість питань - у назві.

В основному я починаю розробляти 2D багатокористувацьку гру. Клієнт (напевно) буде в XNA, і я подумав, що я запитаю тут, чи не дуже добре використовувати C # для розробки на стороні сервера.

Я здогадуюсь, що керованою мовою не є чимось проблематичним, оскільки Java використовується навіть на ігрових серверах MMO (виправте мене, якщо я помиляюся), тож чи є причини для цього уникати C #? Мені потрібно, щоб він був швидким і чуйним, спілкуватися через TCP, спілкуватися в чаті з SQL-сервером. І якщо немає ніяких причин уникати C #, як би я розгорнув такий веб-сервер, чи не буде .NET EXE працює на серверній машині?


2
Ви маєте рацію щодо сервера Java MMO .
Ricket

Відповіді:


22

На моєму досвіді не тільки життєздатний, але й справді хороший. Я розробив кілька серверів MMO, використовуючи C #, і мушу сказати, що ніколи не шкодував про вибір мови та платформи.

Існує велика кількість чудових бібліотек та інструментів для C # і .NET в цілому - мережа, ведення журналів, O / R картування тощо. І, порівняно з Java C #, це більш виразно і менш багатослівно (хоча деякі люди можуть про це сперечатися, хоча .. )

"Накладні витрати" GC, які лякають деяких людей, насправді не є проблемою, якщо ви не зловживаєте цим мільярдами асигнувань в секунду. Як приклад, наш поточний сервер виділяє до 50 мб / секунду під великим навантаженням, а 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 Framework пропонує декілька смаків GC , включаючи "серверний" GC, про який варто дізнатися. Інтелектуальне управління пам’яттю (наприклад, об'єднанням) все ще є хорошою технікою навіть у керованих умовах.

Існує кілька надійних API для взаємодії з SQL, спілкування через TCP та ін. В C #, як частина базової бази, так і через сторонні сторони, тому у вас не повинно виникнути проблем.

Ви можете використовувати ASP.NET або подібне, якщо дійсно хочете, щоб ваш сервер був веб-базі; якщо ви просто хочете запустити процес і прослухати з'єднання TCP, ви можете просто розгорнути .exe та відповідні залежності до серверної машини, відкрити відповідні порти та запустити .exe.


5

Я думаю, що це чудова ідея. Мова, безумовно, здатна на це, і особливо якщо це те, що ви знаєте, не витрачайте купу часу на вивчення нової мови лише тому, що це "швидше". Справжнім вузьким місцем вашого сервера буде затримка мережі; додаткові мілісекунди або дві, тому що ви використовували C # замість C ++, нічого не змінить.


5
Реальний ризик розвитку ігор (або будь-якого розвитку в реальному часі) в керованих мовах полягає не в тому, що все займає мілісекунди або дві довше, а в тому, що випадкові кадри займуть на десятки мілісекунд довше, оскільки GC вирішив доопрацювати речі. Заохочення порівняння, орієнтованого на пропускну здатність, за допомогою таких термінів, як "вузьке місце", вводить в оману.

3

Якщо ви добре розгортаєтесь у Windows, я настійно рекомендую це, тим більше, що ваш клієнт - це C #.

Не варто також недооцінювати розробку ігрового сервера. Навіть створення простого одночасного сервера для чату - це не тривіальна задача, і незабаром у вас виникне багато питань щодо одночасності, блокування, продуктивності тощо.

Як вихідний пункт, я хотів би, щоб ви ознайомилися з цією сторінкою, яка широко пояснює, як робити одночасне програмування сокет на декількох платформах:

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

Якщо ви дійсно серйозно ставитесь до цього, рекомендую вам ретельно вивчити мережеве програмування Stevens Unix. Він орієнтований на C-розетки на Unix, але принципи однакові для всіх інших платформ, включаючи .net.

Редагувати: Це ще один чудовий ресурс, орієнтований на масштабованість та продуктивність для одночасних серверів у .net. Він більше не доступний, але наші друзі на машині зворотного зв'язку мають його копію.

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


1

Один з «недоліків» - це те, що з C #, якщо ви хочете використовувати його на декількох платформах, ви повинні бути дуже обережними, щоб переконатися, що ваш код буде працювати з моно. Якщо все, що вам цікаво, це запустити його на одній платформі, а Windows - це платформа, то у вас не повинно виникнути проблем, як згадували інші.


Не забувайте, що MONO можна використовувати для розгортання на інших платформах. Я вважаю, що Second Life використовує такий підхід - їхні внутрішні сценарії гри фактично компілюються в .NET IL, але вони розгортаються в Linux AFAIK.
ShadowChaser
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.