Почему C / C ++ предпочтительнее для разработчиков игр?

14

Некоторые люди говорят, что он предлагает больше контроля разработчикам, но что именно можно контролировать с помощью C ++, который нельзя контролировать, например, с помощью Java?

Павел
источник

Ответы:

21

Java работает на виртуальной машине, а C ++ запускается непосредственно на оборудовании. Это означает, что у вас больше контроля над тем, куда идет ваша память и что с ней делается в C ++.

Java - это язык для сборки мусора. У вас нет прямого контроля над вашей памятью. Вы можете выделить новые порции памяти, но у вас нет (точного) контроля над тем, когда она удаляется. Сборщик мусора проверяет каждый фрагмент памяти, выделенный вам каждые x кадров, и определяет, является ли он мусором или все еще используется.

Для игр это может иметь катастрофические последствия. Каждые несколько кадров приходит какой-то сборщик мусора, чтобы проверить каждое выделенное вами выделение, чтобы убедиться, что оно все еще используется? Разговор о замедлении!

Во-вторых, большинство используемых нами библиотек были написаны на C или C ++. Я говорю о Scaleform, физическом движке Havok, PhysX, SpeedTree и т. Д. Все профессиональные пакеты, широко используемые в промышленности. Если другой язык хочет быть королем, ему лучше поддержать их.

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

Я не говорю: не используйте Java. Я говорю: подумайте, почему вы используете Java. Minecraft был построен на Java, так что, безусловно, можно создавать игры на Java. Но была бы она лучше, если бы она была построена на C ++? Ну, конечно, было бы не так дешево запустить его на большой тройке (Windows, MacOS, Linux), но даже в этом случае он столкнулся с множеством специфичных для платформы ошибок в своей разработке, ошибок, которые Java не могла сгладить над.

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

knight666
источник
1
Просто придирка, но в большинстве операционных сред нативный код работает на виртуальной машине. Java работает в виртуальной машине внутри виртуальной машины.
Скайлер Салех
1
@RTS: Сложно назвать операционную трансляцию -> микрооперацию виртуальной машиной, если вы к этому стремитесь.
Нет, я говорил о виртуальной машине, в которую все приложения внедряются современными операционными системами для обеспечения безопасной многозадачности. Это происходит в ОС, работающей на архитектурах без микроопераций (RISC). Это включает в себя виртуальную память, программные прерывания, системы для одновременного доступа к оборудованию, планировщик операционных систем и обработку файла реестра.
Скайлер Салех
@ RTS Я не уверен, что изоляция задач действительно квалифицируется как виртуальная машина. Это RM (Real Machine) со встроенной защитой. Между fetch / exec нет очевидного уровня абстракции инструкций. Компиляторы и компоновщики генерируют перемещаемый код как требование. Процессор обеспечивает аппаратную поддержку для большей части этого - что устраняет «виртуальный» аспект.
3Dave
2

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

Длинный ответ:

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

Когда-то вы могли использовать C, C ++, BASIC / 2, Delphi и т. Д. И получать эффективные, автономные исполняемые файлы. Выбор языка зависел от личных предпочтений и рыночных сил.

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

У Borland все было правильно: несколько языков были проанализированы, сначала применены оптимизации, а затем переданы общему бэкэнд-компилятору и компоновщику. Что, по сути, является одним из главных достижений LLVM.

Java структурирована таким образом, что было бы очень трудно реализовать без JVM. Как ни странно, C #, обычно и неверно, предполагаемый примерно эквивалентным Java, уже компилируется в нативный код на нескольких платформах, включая iOS.

Вершина моего Рождественского списка? Машина времени, чтобы вернуться и добавить свойства, реальную обработку исключений и реальный РАБОЧИЙ полиморфизм в C ++, и избавиться от дерьмового синтаксического дерьма, которое синтаксический анализатор может выяснить самостоятельно. Я написал препроцессор для этих 10 лет назад, потому что это чертовски глупо.

3Dave
источник
Вы имеете в виду косвенный доступ к члену (как в h-> x)? Удаление этого сделало бы дескрипторы и умные типы указателей менее полезными. Если вы утверждаете, чтобы изменить его только для необработанных указателей, вы просто сделали язык менее последовательным.
Ларс Виклунд
1
Что не работает с полиморфизмом C ++?
Кейси
@LarsViklund да, это то, что я имею в виду. Но, хотя адрес, разыменование и операторы-члены (&, *, ::, -> ...) имеют разное значение, большую часть времени можно вывести результат из контекста. Вещи могли быть упрощены заранее, как это делается на других языках. Незначительный камень преткновения, но тот, который может увеличить сложность кода (и, следовательно, время разработки и стоимость).
3Dave