2010-07-23 5 views
17

Мне просто интересно, почему C++ ist является мощным и эффективным для разработки игр. Я написал много игр в C# и delphi, всегда используя компонент таймера, чтобы объекты «двигались». Другим вариантом для движения были петли, но они определенно не являются результативными.Почему C++ - это мощный способ разработки игр?

Какая техника использует C++, чтобы пользователи могли разрабатывать игры-исполнители?

+6

«Всегда использовать компонент таймера» Плохая идея. Измерьте, сколько времени прошло. QueryPerformanceCounter или GetTickCount. Вы знаете, что можно сделать игру delphi, которая производит несколько сотен кадров в секунду ... – SigTerm

+0

Методы, которые вы используете в играх, не диктуются языком.Когда вы знаете и понимаете концепцию, вы можете реализовать ее на любом языке, который вы можете эффективно использовать. –

+2

@ kirk.burleson: «Как только вы знаете и понимаете концепцию, вы можете реализовать ее на любом языке, который вы можете эффективно использовать». Это окончательно не соответствует действительности. Когда требования к сложности, скорости и т. Д. Растут, некоторые языки заставят вас ударить стену. Если вы не попали в эту стену, ваша игра недостаточно сложна :) @ Forlan07: Не столько о методах (хотя даже C++ может медленно работать с плохим кодом). C++ переведен на C, который в конечном итоге скомпилирован в машинный код. C был разработан с нуля, чтобы быть быстрым, и десятилетия тонкой настройки сделали это еще быстрее. – luiscolorado

ответ

26

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

Вы также можете использовать гибридный подход для взлома игры на язык более высокого уровня для сценариев и т. Д., А затем «отбросьте» на землю C++ для частей, требующих скорости и оптимизации.

+2

Являются ли Java и C# действительно языками 4-го поколения? – Niki

+1

Я также имею в виду, что они 3GL. 4GL более конкретно относится к специальной задаче для их использования, например. запрос баз данных -> SQL –

+3

Единственная причина, по которой каждый использует C++, - это та же самая причина, почему все используют WinForms. Потому что все его используют :) – Blub

13

В значительной степени это основано на двух вещах:

  • История
  • Текущие рамочные

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

Даже сегодня большинство фреймворков для игр написаны на C++. XNA действительно разрешает C#, но даже Microsoft продолжает настаивать на C++ как на своем языке выбора.

* да, это субъективное ...

+0

Ну, это не субъективно. На самом деле обычная C во многих ситуациях быстрее, а ручной ассемблер быстрее. Единственный способ ускорить работу - это спроектировать и построить свои собственные специализированные процессоры :) – luiscolorado

+5

@luis: Просто сказать, что C во многих ситуациях быстрее, также не является объективным. –

+6

со всем уважением, XNA сосет! – Vimvq1987

2

OpenGL и DirectX оба очень совместимы с C++. Добавьте в то, что у вас есть более мелкозернистый контроль над памятью, выделение памяти, и вы можете использовать только достаточные возможности C++, чтобы сделать разработку «проще», чем прямой C, чтобы получить некоторые из причин.

11

Итак, какая техника использует C++, что пользователи могут разрабатывать игры-исполнители?

Отсутствует (также) находится на других языках.

Преимущество C++ над другими языками (в зависимости от степени) заключается не в используемых методах.

Это сочетание нескольких факторов, что делает его как низкого уровня достаточно и высокого уровня достаточно для того, что нужно:

  • это детерминированный (вы можете определить, что запускается на выполнение, когда). Это неверно для сборщиков мусора, и оно не является (или частично) истинным для языков, запущенных на виртуальных машинах.

  • он предлагает высокую производительность (вы можете получить C-подобную производительность и даже отказаться от кода сборки, если вам это нравится).

  • Он предлагает достаточно абстракции, чтобы быть выше уровня, чем другие быстрые языки (например, C).

В конце концов, это что-то близко к языкам низкого уровня и языкам высокого уровня.

+0

Раньше было, что лучшие игры были написаны даже в ассемблере, потому что вам приходилось использовать каждую каплю мощности процессора. Сегодня процессоры очень мощные, и относительно простые игры могут быть разработаны с использованием Java, C# или даже BASIC. Но, если вы хотите разработать самые лучшие игры, вы все равно хотите использовать самые быстрые языки, которые вы можете использовать. – luiscolorado

+0

Существует множество других языков, которые не предлагают техники «без мусорного колледжа», «настроенные вручную структуры данных», «встроенная сборка». –

+2

@luiscolorado - взгляд «власть впустую» немного односторонний. Сложность тоже увеличилась, и алгоритмические оптимизации стали более важными, чем подсчет циклов. Язык высокого уровня позволяет вам разрабатывать более сложные алгоритмы и структуры данных в одном и том же масштабе времени, что означает сложный модуль C++. вероятно, будет намного быстрее, чем другой модуль, написанный на ассемблере в одно и то же время. Например, обрезка нескольких циклов на итерацию с вашего коллизионного кода не будет конкурировать с более сложным алгоритмом, и там есть * лот * теории обнаружения столкновений. – Steve314

3

Из того, что я всегда понимал, и это правило относится и к спорту.

Speed kills. 

Все о скорости.

3

Для игр существует целая кодовая база , и это в основном на C++. Большинство игровых движков реализованы в C++, и это потому, что, как уже упоминалось ранее, OpenGL и DirectX реализованы на C++. Кроме того, игры всегда подталкивают пределы аппаратного обеспечения, поэтому код должен быть как можно более быстрым и оптимальным.

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

+0

OpenGL и DirectX написаны на простом C, а не на C++. –

0

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

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

5

C++ обладает сочетанием эффективности и абстракции, что делает его еще единственным практичным выбором для крупномасштабных систем, требующих эффективных откликов [1].

Уровни аппаратного интерфейса, как правило, также находятся на C или C++, что означает, что интерфейс для иностранного языка не должен настраиваться, чтобы разговаривать с уровнями абстракции оборудования.

Кроме того, у этого есть преимущество большого сообщества, имеющего опыт написания игр, а также множество фреймворков.

В личной заметке я использовал игры, написанные на других языках, и у них есть последовательно был медленнее.

[1] Ada или Delphi могут также использоваться в этой области, но их уровень популярности означает, что не так прагматично выбирать их, если у вас нет потребности в нише.

+0

Плюс, оптимизаторы кода C/C++, разработанные Microsoft, невероятны. Я сомневаюсь (но, может быть, и ошибаюсь), что столько же $ usce $ и изобретательность были потрачены на Ada или Delphi. – luiscolorado

+1

@luis: Я слышал, что компилятор 'icc', компилятор Intel C++, удаляет штаны с компилятора Microsoft. –

+0

@Paul: это хорошо знать. Watcom, в какой-то момент, также победил Microsoft. Но, точка одна и та же: компиляторы строятся умнее, чтобы оптимизировать код, и тенденция, вероятно, продолжится (IMHO). – luiscolorado

1

игры является выполнение критического программного обеспечения, которое требует использования пользователем оборудования 100% имеет, и C++ является только популярным языком, который дает такие возможности:

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

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

1

Некоторые другие аспекты, которые я думаю, не были упомянуты:

  • C++ не использует сбор мусора - это может быть неудачным, если игра останавливается на минуту для сбора мусора (в отличие, например, C#.). Для консольной игры, рассчитанной на 30 или 60 кадров в секунду, это может быть проблемой.
  • Разработчики игр часто посвящают время оптимизации кода. Правильные инструменты существуют для этого с C++. Например. большинство компиляторов поддерживают встроенные функции, поэтому можно напрямую использовать инструкции SSE. Другое дело, что программисты часто делают это, проверяя сгенерированную сборку и соответствующим образом настраивая код C, например. для устранения динамических ветвей. Избегание виртуальных функций также может привести к преимуществам скорости (например, многие другие языки имеют только методы с динамическим полиморфизмом - со связанными с ними эксплуатационными расходами).
  • Это на самом деле более кросс-платформенный, чем C# или Java, с точки зрения многих разработчиков игр. Можете ли вы запустить Java или C#, например. PS3? (edit: Mono используется по крайней мере одним популярным кросс-платформенным игровым движком, поэтому C# возможен, но включение Mono может быть барьером, если не использовать этот двигатель)
+0

Java - возможно; C# - возможно, нет. :) – GalacticCowboy

+1

Тогда MS будет использовать Java на Xbox? Нет, идет ваша мобильность;) –

+0

Вы никогда не знаете ... ведь Microsoft не использует C# для разработки своих операционных систем :) ... и сколько детей заботятся о том, что работает на своих консолях :) – luiscolorado

0

Как машины становятся более мощными и более в некоторых случаях рабочая нагрузка переключается на аппаратное обеспечение (графика и даже физика), для выполнения других задач доступно больше системных ресурсов. Таким образом, несмотря на то, что C++ по-прежнему является отраслевым стандартом, оптимизация «вниз к металлу», которую он позволяет, больше не является основной причиной его использования. Основная причина, по которой он используется, заключается в том, что большинство API для разработки игр - это API C++. Вы редко хотите написать свой собственный движок, и даже если вы напишете свой собственный движок, вы, вероятно, повторно используете стандартные низкоуровневые компоненты, такие как NVidia PhysX, DirectX, OpenGL и т. Д. Некоторые из них теперь имеют интерфейсы управляемых кодов, но Ядро API для C++, так как оно так часто используется.

Следует отметить, что многие игры в настоящее время используют языки сценариев, такие как Python или Lua, для управления большей частью логики игры. Это дает разработчикам контента и моддерам гибкость для обеспечения богатого поведения без необходимости кода на C++ или сборки. Сценарий не является сверхвысокой производительностью, но он чрезвычайно удобен, и современные ПК имеют достаточную мощность для обработки сценариев.

+0

«По мере того как машины становятся более мощными, и большая часть рабочей нагрузки переключается на аппаратное обеспечение». Это отчасти верно и сегодня. Это правда, что машины, такие как консоли, ноутбуки и настольные компьютеры, сегодня очень эффективны, но нам также нужно учитывать те менее мощные машины, как смартфоны, которые могут потребовать кодирования «ближе к металлу» в определенных ситуациях. – luiscolorado

+0

@luiscolorado, телефоны - совершенно другая арена, но определенно стоит рассмотреть. Большинство телефонных игр на самом деле либо в Objective C, либо в Java в эти дни, предназначенные для iPhone или Android соответственно. Если телефон Windows 7 получит какую-либо долю на рынке, это откроет дверь для мобильных игр в Silverlight, вероятно, используя C#. –

2

Здесь есть несколько причин.

  1. Переносимость
    ли один действительно думаю, что Sony будет использовать C# в одном из своих консолей? Будет ли Nintendo развертывать JVM на Wii2?

    No.

    Что делать, если Microsoft выходит C# со следующей Xbox? Угадайте, что, они не будут. Это удвоит Codebase для всех сторонних разработчиков, предоставляя новую консоль Microsoft, гораздо менее привлекательную для разработки.

    Таким образом, C++ является очевидным выбором здесь, потому что для компилятора требуется только подходящая архитектура.

  2. Performance
    Также ядро ​​3D двигатели, скорее всего, всегда будет написано на C/C++ с его частью в ASM, просто из-за того, что вы хотите выжать каждый бит производительности на консолях где ваша среда в основном забита камнем.

  3. Времени развития
    Прежде все лицензируемые двигатели пришли, было время, когда кулак поколения программных продуктов взяло очень долго развиваться, только потому, что вам пришлось написать целый новый движок для игры на новой платформы, которая требует времени. С учетом того, что разработка большой игры уже требует много лет, это требует больших денег. Поэтому всегда было проще взять существующий код и «обновить» его для следующего поколения. Затем со временем вы постепенно улучшаете его. Принимая это во внимание, легко понять, что ни один из производителей консоли не хотел, чтобы их разработчики сталкивались с еще большим временем разработки, переключая свою консоль на нечто иное, чем C/C++.

Чтобы обернуть все это. Переносимость, производительность и устаревшие базы кода - это причины, по которым C/C++ по-прежнему является основным игроком в разработке игр.

+0

Вы можете закодировать в рамках XNA на C# и развернуть его до текущего Xbox 360. Фактически, вы уже в течение нескольких лет можете настроить Xbox на C#. Несомненно, это будет и далее поддерживать Xbox следующего поколения. Я также не удивлюсь, если он поддерживает Silverlight для веб-казуальных игр. –

+1

Да, но никто не будет создавать 20 миллионов долларов + Проект с этим, это в основном для небольших игр, которые выпускаются как на Xbox, так и на Windows. Если вы после больших денег, в банкомате C/C++ нет никакого способа. –

0

Единственный метод, который C++ имеет на большинстве других языков высокого уровня, заключается в том, что «вы не платите за то, что не используете». Язык не имеет функций за кулисами, таких как сбор мусора, подсчет ссылок, синхронизация, отражение, интроспекция, проверка границ, проверка времени выполнения, метаклассы и т. Д., Каждый из которых может налагать затраты на общие операция.

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

0

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

Теперь имейте в виду, что это для существующих игровых студий, инди-сцена - небольшая разница, и я думаю, что здесь XNA фактически набирает скорость. Во-первых, это дает вам доступ к трем устройствам (pc, xbox, zune based), и это даже не включает mono xna. Различия в скорости почти никогда не стоит беспокоиться об этом уровне, и это просто более продуктивно.

Надеюсь, я дал вам кое-что, чтобы рассмотреть.