Жизнеспособность C # /. NET как новой стандартной игровой платформы для разработчиков? - PullRequest
23 голосов
/ 10 декабря 2008

В течение долгого времени C ++ был доминирующим языком разработки игр. Многие качественные 3D-движки AAA доступны на любой бюджет.

Мой вопрос заключается в том, что с появлением XNA C + и платформа .NET были достаточно хорошо позиционированы, чтобы стать новой стандартной платформой для разработки игр? Очевидно, что кроссплатформенная природа платформы XNA (Windows, Xbox, Zune) имеет свои преимущества, но достаточно ли этих преимуществ, чтобы побудить большие студии разработчиков игр переключать передачи?

Лично я разрываюсь между использованием C # / XNA для нового проекта и использованием Java через jMonkeyEngine. Я очень хочу, чтобы моя игра была переносимой на несколько платформ, и единственные языки, которые я знаю достаточно хорошо для этого, - это C # и Java. Мне бы очень хотелось увидеть реализацию кодовой базы XNA, которая работает на OpenGL и будет работать на Mono, но я думаю, что на данный момент это просто желаемое за действительное.

Мне любопытно услышать, что испытали другие, создавая 3D-игры в чем-то отличном от C ++.

Ответы [ 13 ]

67 голосов
/ 17 декабря 2008

Я думаю, что C ++ выйдет из моды в следующие 10 лет точно так же, как и сборка. Я профессиональный программист игр более 15 лет. В начале 90-х многие говорили, что C недостаточно эффективен для игр. В конце 90-х те же люди говорили, что с C все в порядке, но C ++ слишком медленный для критически важных приложений, таких как игры. Сейчас C ++ является стандартным высокопроизводительным языком, и люди утверждают, что другие языки будут слишком медленными. В то же время в современных играх для логики игры используются языки сценариев, такие как Lua, Python или Unrealscript, которые в десять раз медленнее, чем C # или Java.

C ++ намного быстрее, когда вы занимаетесь математикой в ​​своей игре. Делать линейную алгебру мучительно медленно в C # или Java. Однако это только часть (10 - 25%) игры. Когда речь заходит об игровой логике, узким местом является доступ к памяти, поэтому использование другого языка существенно не снижает производительность. Инструментальная часть игры, которая составляет 50-80% кода, на самом деле не требует никакого C ++. Он успешно работает в C #, что достаточно быстро почти для любого инструмента.

Не следует также забывать, что C ++ является производным от C, который был создан в начале 70-х годов. Так что C ++ устарел во многих отношениях. Самым раздражающим, вероятно, является препроцессор, который убивает прозрачность и приводит к безумно долгому времени компиляции. Среднестатистический игровой движок C ++ компилируется за 30-60 минут. За это время вы можете скомпилировать каждый проект C # и Java, когда-либо созданный людьми. Недостаток саморефлексии и динамического создания кода также является недостатком. Чтобы преодолеть эти недостатки, часто требуется много времени на разработку.

Тем не менее, разработка на C ++ стоит дорого, для игровой студии будет стоить еще больше рискнуть неудачей, переключившись на новую технологию, которая еще не доказана в разработке игр. Также важным фактором является то, что большинство опытных игровых программистов используют только C / C ++, и у них нет опыта работы с другими языками, что определенно увеличит риск переключения. Из-за этого вы, вероятно, не увидите игровых студий в ближайшие пару лет, переходящих на C #. Тем не менее, вполне вероятно, что принадлежащая Microsoft студия в ближайшие 5 лет получит большой успех с игрой на C #, что убедит другие студии в том, что выполнимо создавать AAA-версии на C #, и тогда вы увидите, что все больше и больше студий переходят на C #.

На данный момент мой совет: Если вы хотите создать многоплатформенный заголовок AAA, у вас нет другого выбора, кроме C ++, для части игры во время выполнения. Подумайте об использовании C # для стороны инструмента. Немного сложно эффективно соединить управляемый и неуправляемый код, но в долгосрочной перспективе это стоит потраченных на него усилий. Если вы делаете хобби-проект или титул B, где производительность менее важна, чем затраты / время на разработку, то забудьте C ++ и просто используйте C # для всего и потратьте дополнительное время на оптимизацию математики.

17 голосов
/ 10 декабря 2008

Крупные игровые студии, вероятно, не примут XNA в ближайшее время. Некоторые инди используют его, но, безусловно, потенциально могут быть очень успешными и оставить C ++ позади.

XNA предоставляет множество классов, которые вы можете использовать при разработке игр, но многие другие часто предпочитают использовать полноценный игровой движок. Хотя XNA достаточно хорош для начинающих, чтобы порезаться, если вы новичок в программировании игр.

C # - хороший язык для разработки игр. При разработке игр создаются приложения, требующие звука, продвинутой графики, искусственного интеллекта, физики и т. Д. Все это требует мощной и довольно быстрой языковой среды. В то время как большинство компьютерных и консольных игр высшего уровня написаны на C ++, C # имеет план действий, который, вероятно, оставит C ++ позади. Грядущие изменения в C ++ 0x, без сомнения, на некоторое время оживят C ++, но C # выглядит готовым его обогнать.

Если вы действительно хотите стать разработчиком игр, я призываю вас хотя бы изучить C ++ и написать собственный игровой движок. Использовать готовый игровой движок легко, и вы можете кодировать что-то «хорошо», но вы столкнетесь с множеством ограничений, которые вы не сможете кодировать. Вы будете эффективно ограничены возможностями игрового движка (если у вас нет доступа к источнику, который вы затем можете изменить по своему вкусу).

Изучай C ++ и желательно OpenGL :) Если вы знакомы с OpenGL, вы легко освоите DirectX.

C # это кусок пирога, если вы знаете C ++.

13 голосов
/ 10 декабря 2008

Хотя некоторое время назад было объявлено о выпуске XNA Professional, Microsoft теперь, похоже, сосредоточилась на выпуске Express (хотя в названии он потерял «Express»), и это, похоже, нацелено на рынок любителей, а не на коммерческий рынок. Среди прочего, это в значительной степени приносит пользу сообществу XBox 360, поскольку теперь они позволяют разработчикам-любителям разрабатывать свои игры для Windows и XBox 360, а затем продавать свои игры в сети XBox , и это хорошо .

Мне бы очень хотелось, чтобы XNA набирала обороты в профессиональном мире, но этого не произойдет, если она не будет доступна для других основных игровых платформ (PS3 и Wii). Проблема заключается не только в XNA framework / API, но и в требованиях к языку / framework, поэтому вы даже не можете написать игру на C #, а затем использовать XNA на платформах Microsoft и OpenGL на других платформах.

Профиль производительности XNA также нацелен на рынок любителей, а не коммерческий, хотя производительность кажется довольно хорошей, и в дикой природе есть впечатляющие демонстрации.

Edit:

Если ваш вопрос на самом деле «должен ли я сейчас использовать XNA для своего проекта с бюджетом, значительно меньшим миллиона», мой ответ определенно - да. Попробуй, это бесплатно. И это мощно.

10 голосов
/ 15 февраля 2009

Я не разработчик игр (если не считать игру Реверси, которую я написал на ассемблере Atari 6502 в ~ 1982 г.), но у меня есть большой опыт написания коммерческого прикладного программного обеспечения на ассемблере -> C -> Objective-C (кто-нибудь помнит Next Cube?) -> C ++ -> Java и теперь C #.

Я не могу сравнить игровые библиотеки, но у меня есть некоторые мысли по поводу C ++ и C #.

IMO, аргумент для C ++ по сравнению с C # из-за производительности не так прост, как некоторые могли бы поверить. Программное обеспечение, над которым я работаю, критично для производительности. Мы конкурируем с продуктами, скомпилированными для собственного кода (предположительно написанными на C / C ++ / Assembly), и мы выигрываем в производительности до такой степени, что наши конкуренты даже используют наше программное обеспечение вместо своих для определенных приложений .

Как это может быть, если C ++ быстрее, чем C #? По моему опыту, ответ заключается в том, что для любой сложной системы архитектура и алгоритмы более важны, чем язык (при условии, что потенциальная производительность находится на одном уровне - что, безусловно, с C ++ и C #). Несмотря на то, что я был разработчиком C ++ на полную ставку больше лет, чем использовал C #, я гораздо более продуктивен в C #, чем в C ++. Это означает, что я могу потратить больше времени на рефакторинг и совершенствование своей архитектуры и алгоритмов, чем раньше.

Теперь иногда мне приходится признать, что у меня возникает соблазн переписать основной движок моего приложения на C ++, потому что я знаю, что смогу заставить его работать быстрее и использовать меньше памяти. До сих пор я сопротивлялся этому убеждению, потому что я считаю, что падение производительности означало бы, что это всего лишь вопрос времени, когда моя кодовая база C ++ станет медленнее, чем я был бы, если бы остался с C #.

Я полагаю, что это только вопрос времени, когда разработка игр перейдет на C # и / или Java и / или какой-либо другой язык, более производительный, чем C ++. Пользуясь Java в течение нескольких лет, а теперь и C #, я бы сделал ставку на C #, но это только предположение.

Если бы я начинал разработку игр сегодня, я бы определенно сделал ставку на Silverlight и / или WPF. WPF построен на Direct3D. Microsoft уже объявила, что Silverlight 3 будет поддерживать аппаратную 3D-рендеринг. Silverlight работает на различных браузерах и Mac. С Moonlight он работает на Linux. Это было объявлено для некоторых телефонных платформ. Благодаря тому факту, что Silverlight по сути является облегченной версией WPF (изначально она представлялась как «WPF / E», где «E» означает «Везде»), вы можете использовать обе цели без особых дополнительных усилий. Вы можете иметь облегченную (бесплатную или поддерживаемую рекламой) версию своей игры, используя Silverlight в браузере, и реальную сделку для серьезных геймеров, использующих WPF и работающих в Windows.

А еще лучше: создайте отличную игровую библиотеку, которая позволяет легко ориентироваться как на WPF, так и на Silverlight 3 (или Silverlight 2, если вам не требуется аппаратный 3D-рендеринг).

Хотя я не видел официального объявления, трудно поверить, что следующее поколение XBox не будет поддерживать Silverlight. Конечно, я бы не стал искать его в игровых системах Sony или Nintendo.

10 голосов
/ 02 января 2009

Как уже упоминалось, XNA в настоящее время ограничивается платформами Microsoft, но вы все равно можете использовать C #, .NET и любые языки программирования .NET для кросс-платформенной разработки игр.

Среда выполнения Mono предоставляет кроссплатформенный движок, который можно использовать для запуска вашего C # (или кода .NET) на различных настольных платформах (Windows, MacOS, Linux), а также на игровых консолях (Wii, поддерживаемых Novell). , Скоро выйдет PS3 и Xbox360 "по своему усмотрению").

Существует также коммерческая игровая платформа под названием Unity3D, которая творила чудеса, используя Mono. Это игровая среда разработки, которая превосходит XNA как среду разработки игр: физика, графика, освещение, модели, столкновения обрабатываются в собственном коде C ++, а вся игровая логика (AI, управление камерой, представления и т. Д.) Обрабатывается управляемый код, написанный обычно на C # или UnityScript (строго типизированная реализация Javascript, которая дает вам лучшее из обоих: синтаксис Javascript, но строгие типы, повышающие производительность).

10 голосов
/ 10 декабря 2008

Я работал в месте под названием Newfire в конце 90-х. До того, как финансирование иссякло, у нас был двигатель, который мог создать захватывающий мир размером 10 000 квадратных километров с разрешением 10 см. Вы можете получить огромное количество игроков одновременно и постоянно деформировать ландшафт. Этот двигатель работал с частотой кадров на P200 с картой Voodoo 2.

Большая часть движка была написана на тщательно настроенном C ++. Весь игровой код был написан на C или C ++ или Java. У меня также был прототип кода, который мог определять поведение объекта с помощью автоматов, которые могли делать очень приличный ИИ. Это заняло почти нет процессорного времени. Выполнение игровой логики затмевалось рендерингом.

В какой-то момент у меня была демоверсия игры Конвея «Игра в жизнь», работающей на Java с использованием нашего программного рендерера. Клетки представляли собой кубы, лежащие в плоскости, которая появлялась или исчезала и меняла цвет по мере старения в течение нескольких поколений. В то время как игра работала с фиксированной скоростью генерации 4 поколения в секунду, 3D-дисплей работал на скорости более 20 кадров в секунду, снова на P200 с программным обеспечением .

Так что ответ определенно не C ++. Ответ, как и любая проблемная область, - это язык, который лучше всего работает в этой области. C ++ хорошо работает в этой области для движка рендеринга, но для реальной логики и правил игры хорошо работают многие языки. Python великолепен C # отлично. Ява великолепна.

5 голосов
/ 10 декабря 2008

Просто добавьте к разговору ... C # / .NET, безусловно, доступен на других платформах, не принадлежащих Microsoft.

Между этими двумя прямо здесь вы можете настроить таргетинг на linux, mac, wii ... Я уверен, что если было достаточно финансирования / интереса, они могут заставить Mono работать на PS3. В этот момент вы сможете писать для всех основных игровых платформ, используя C # (хотя, возможно, не с XNA per se).

Кроме того, для всех, кто интересуется производительностью ... в работе много чего интересного, например, новая поддержка Mono для быстрой математики с плавающей запятой с использованием их SIMD-расширений (конечно, только на x86): http://tirania.org/blog/archive/2008/Nov-03.html

5 голосов
/ 10 декабря 2008

Я думаю, что существует своего рода элитарность БС, которая возникает, когда люди говорят о игровых средах XNA, Java, Pygame или о чем-то еще. Да, профессиональные игровые дома будут использовать C ++ очень долго. Но Atmospherian спрашивает о чем-то для его собственного проекта, поэтому я собираюсь предположить, что он любитель (если бы он был генеральным директором Epic или что-то еще, я сомневаюсь, что он будет публиковать на SO)

В любом случае, то, что вы не можете кодировать FarCry, не означает, что это бесполезный фреймворк. Игры уровня студийного уровня требуют миллионов долларов и десятков людей, но XNA / Java / pygame / etc позволили любителям делать довольно удивительные вещи. Любительские игры и игры для крупных студий - два разных зверя и требуют двух разных наборов инструментов.

Чтобы ответить на ваши вопросы, атмосферный:

-Да, XNA может делать довольно классные вещи, и люди использовали это, чтобы делать несколько классных игр.

-Если вы хотите, чтобы XNA была кроссплатформенной и работала с моно, я думаю, что это технически возможно, но я бы не стал задерживать дыхание.

-Если вы хотите получить работу в игровой индустрии, вам нужно будет изучить C ++.

-Я думаю, что путь наименьшего сопротивления для получения работающего кроссплатформенного игрового движка в настоящее время находится в pyglet . Простота использования может быть компромиссной со скоростью по сравнению с Java или C ++.

3 голосов
/ 13 декабря 2008

В качестве продолжения этого вопроса я начал рассматривать некоторые 3D-движки на основе OpenGL, написанные на C ++ (CrystalSpace, Irrlicht, Panda3D), и все они выглядят довольно солидно. Интересное замечание о Panda3D заключается в том, что он написан на C ++, но основной способ его использования - через Python. Мне кажется, что метод дал бы лучшее из обоих миров, поскольку быстрый движок, написанный на C ++, сочетался с простотой программирования на Python. Я задам другой вопрос, сравнивая эти двигатели. Спасибо за ответы.

3 голосов
/ 10 декабря 2008

Удивлен, никто не упомянул возможности для мобильных игр. В ближайшее время я не вижу ни одного управляемого кода, конкурирующего с C ++ для таких игр, как Half-Life и Halo, но для менее интенсивных игр для мобильных устройств кажется, что у него есть ноги.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...