Прежде всего, я хотел бы получить реальный ответ, я всегда пытаюсь получить больше из различных источников и статей, и когда я читаю такие вещи, как C ++, медленный, потому что он имеет виртуальные функции, и из-за этого C лучше , я действительно не знаю, что сказать и думать как человек с мозгом. Поэтому, пожалуйста, избегайте достижения этого уровня в своих ответах.
Мой вопрос о массовом переходе на C ++, который был более или менее завершен с Doom 3.
Для меня интересно то, что до этого рубежа большинство игровых движков и сами игры были написаны на C, как это было со времен Quake . Также интересно отметить, что программное обеспечение ID решает полностью переписать кодовую базу для IdTech 4 в C ++, огромный объем работы, который, честно говоря, я не могу понять без действительно хорошего списка причин.
Я сосредоточен на Doom 3, потому что я в основном заинтересован в мире OpenGL и в своем путешествии я стараюсь сосредоточиться на этой теме, поэтому я много читал об этом, но я думаю, что такой вопрос может быть render-API -агностика без особых проблем.
Почему в определенный момент индустрия массово переключилась на C ++? Каковы причины выбора, который сделал ID?
Последнее, что я хотел бы сказать, - это то, что язык C намного проще в реализации и обеспечивает меньшее количество функций, потому что у него гораздо меньше шансов быть «фрагментированным» по частям, в отличие от того, что C ++ действительно часто делает. Проще говоря, у меня гораздо больше шансов найти действительно хороший компилятор C, а не хороший компилятор C ++ со всеми хорошо реализованными функциями.
Например, NDK для Android до сих пор не имеет хорошей поддержки C ++ (с выпуском r8b) со всеми последними и лучшими функциями, и это родной набор инструментов для самой популярной мобильной ОС в мире!
Если бы я написал свой код на современном C ++, мне, наверное, сейчас было бы больно, потому что одна из самых популярных ОС в мире была бы для меня запрещенной. И, как и Android, многие другие компиляторы не так хороши.
Я должен написать код C ++, ссылаясь на версию C ++, которая 2-3 лет выпуска?
Ответы:
C ++ делает все, что делает C. Вы можете тривиально смешивать C и C ++ в тех случаях, когда преимущества C перевешивают преимущества C ++. Это очень намеренное дизайнерское решение C ++.
C ++ делает то, что не делает C. Это включает в себя легкий полиморфизм, а также легкую генерацию временного кода компиляции с помощью шаблонов. Это действительно удобно для таких вещей, как контейнеры, которые являются самой большой слабостью С. Он также допускает определяемые пользователем типы, похожие на указатели (умные маркеры), которые экономят много времени, а также определяемые пользователем типы, похожие на примитивы, такие как векторы и матрицы, с поддержкой операторов (также экономит много времени).
Виртуальные функции работают медленнее, чем не виртуальные. Тем не менее, вы должны включить виртуальные функции, и компетентный программист делает это только тогда, когда они полезны. Программисты на C имеют указатели на функции и часто хранят коллекции из них в структуре, на которую ссылаются другие структуры; Другими словами, они проходят дополнительную работу, чтобы воссоздать то же самое, что и таблицы виртуальных функций. В случаях, когда требуется только один указатель на функцию и таблица не требуется, C ++ по-прежнему полностью это допускает и эквивалентно C. С современным компилятором C ++ только медленнее, чем C, в определенных случаях программист выбирает функцию , Кроме того, виртуальные служебные функции на практике очень малы на модемных процессорах. В настоящее время аппаратное обеспечение разработано для моделей использования C ++ и даже все чаще предназначено для потребностей интерпретируемых языков высокого уровня.
Исключения C ++ исторически накладывают большие накладные расходы, делая C ++ медленнее, даже если вы их не используете. Исключения было ужасно добавить в C ++, если только по какой-то другой причине, кроме огромного увеличения сложности, связанного с написанием кода, безопасного для исключений, и на самом деле в некоторых конструкциях контейнеров буквально невозможно сделать исключение безопасным. Программисты игр часто игнорируют существование исключений и даже отключают их в компиляторе. Современные компиляторы имеют исключения с нулевыми накладными расходами (то есть вы платите за них только тогда, когда фактически используете их).
С проще выучить все правила. C ++ - очень большой, сложный язык. C ++ позволяет писать код более высокого уровня, создавая более простые и простые API. Некоторые люди хотят легче понимать язык, другие хотят проще писать расширенный код. Это компромисс между простотой понимания того, что делает компилятор с определенным фрагментом кода, и простотой написания больших сложных взаимосвязанных приложений. Некоторые люди ценят одного гораздо больше, чем другого, по разным причинам.
В конце концов, C ++ является надмножеством C. На мой взгляд, такого высококвалифицированного не существует. программиста C ++, который не является также проходимым программистом C, не существует (хотя есть много программистов на C ++, которые опускаются ниже моей планки, которые быть потерянным в чистом C). В то время как C ++ добавляет средства, чтобы изолировать программиста от большей части C, нетривиальный код C ++ часто должен использовать C для достижения цели. Это одно из основных различий между C ++ и Java и C #. В конце концов, есть причина, по которой вы часто видите "C / C ++" вместе.
Мое личное убеждение, которое разделяют большинство других профессионалов игровой индустрии, с которыми я общался, заключается в том, что расширенная выразительность и возможности программирования высокого уровня в C ++ перевешивают возросшую сложность языка по сравнению с C, и большинство других Заявления против C ++ просто устарели в современных технологиях.
источник
Id Software не является "индустрией". Они одна компания. Хотя они могут быть влиятельными, они не все.
Я работал над парой игровых движков, которые датируются 1999 годом, и они использовали C ++.
Основными причинами принятия C ++ «примерно в это время» являются:
Это было стандартизировано . C ++ 98 назван так потому, что он был выпущен в качестве стандарта ISO в 1998 году. До этого было несколько диалектов C ++ без четкой идеи, которая была бы «реальной» или «правильной». Как только он был стандартизирован, и компиляторы начали внедрять стандарт, разработчики игр могли положиться на действующий стандарт.
Помните старую шутку: парень заходит в кабинет врача и говорит: «Больно, когда я так поднимаю руку». Итак, доктор говорит: «Так что не поднимай руку так».
Если виртуальные функции работают медленно, C ++ не заставляет их использовать. Все в C ++ является обязательным. Вы решаете использовать каждую конкретную функцию. Если вы работаете с кодом, критичным к производительности, и вам не нужны виртуальные издержки, вы не используете виртуальные функции. Точно так же, как если вы находитесь в критичном для производительности коде на C, вы не используете указатели на функции.
Действительно, это привело к тому, что многие игры на C ++ были не идиоматическими C ++ (по крайней мере, не современными идиоматическими C ++), а просто «C с классами». И это совершенно функциональный способ программирования на C ++. Черт, просто возможность не печатать
typedef struct
при создании нового типа - это преимущество.C ++ - это большой набор функций, и вы можете выбрать, какие из них вам нужны.
Ваша точка зрения? Google едва терпит людей, использующих NDK; Понятно, что они хотят, чтобы все использовали Java. Единственная причина, по которой существует NDK, заключается в том, что есть некоторые важные разработчики, которые просто не будут использовать платформу без нее. Таким образом, NDK существует для обслуживания их и их потребностей в функциях.
Да, C ++ - это более сложная для реализации спецификация. Так же и Java. Как и любой язык, кроме C.
Кроме того, что вы имеете в виду "все последние и лучшие функции"? Если вы говорите о C ++ 11, ну, никто еще полностью не реализует это. Спекуляции едва исполнился год. Кроме того, я не знаю, поддерживает ли NDK C11; да, C также имеет «новейшие и лучшие функции», которые не поддерживаются повсеместно.
В связи с этим возникает важный момент: если вы хотите, чтобы ваше приложение на чистом C компилировалось в Visual Studio, то оно должно соответствовать C89, и ничего выше этого. Таким образом, фрагментация с C уже существует. Некоторые платформы поддерживают только C89. Некоторая поддержка С99. Некоторые поддерживают C11, в той или иной степени. И т.п.
Если вы хотите использовать C, а затем использовать C . Тот факт, что другие люди не сделали этот выбор, не означает, что ваш выбор неправильный или что их выбор неправильный. Вам не нужно оправдываться перед ними, и они не должны оправдываться перед вами.
источник
Для них характерно переписывать практически весь движок для каждого выпуска (по крайней мере, до недавнего времени - я не знаю много о последних нескольких играх), и, поскольку популярность C ++ растет, имеет смысл использовать это, а не придерживаться с C. Со временем все меньше и меньше людей будут компетентны с C.
Потому что он дает вам много функциональных возможностей более высокого уровня, будучи почти полностью обратно совместимым с C-кодом.
Google ответил бы за вас: http://fabiensanglard.net/doom3/interviews.php
«... у половины программистов действительно был фон C ++ вначале. У меня был фон C и Objective-C, и я как бы« скользнул в C ++ », просто взглянув на код, который писали ребята из C ++. Оглядываясь назад, я Жаль, что я не планировал время тщательно исследовать и изучать язык, прежде чем начать его использовать.
Вы все еще можете сказать, что код рендерера был в основном разработан на C, а затем скинов в C ++.
Сегодня я твердо верю, что C ++ является правильным языком для крупных проектов с участием нескольких разработчиков с критическими требованиями к производительности, а Tech 5 намного лучше для работы с Doom 3 ».
Почему вы заботитесь об этом? Не попадайтесь в погоню за новейшей вещью. Если бы это было достаточно хорошо 5 лет назад, сейчас не стало бы хуже.
источник
Что ж, C ++ существует с 80-х годов, поэтому, если компилятор его не поддерживает, возможно, вам следует использовать другой компилятор. Кроме того, C ++ на самом деле не намного медленнее, чем C. Он действительно медленнее, если вы загружаете его виртуальными функциями и другими абстракциями. Тем не менее, C ++ сегодня широко используется в не-Unix-мире из-за своей гибкости и новых функций, которых нет у C. Написание модульного кода на C ++ намного проще, чем на C, и помогает вам писать более переносимый код. Возвращаясь к теме компиляторов, я не знаю ни одного компилятора, который не поддерживает C ++ (может быть, не полностью C ++ 11, но любой наполовину приличный компилятор должен поддерживать C ++).
источник