Ответы:
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 ++. Там действительно нет оправдания, чтобы не учиться этому, особенно если вы хотите продолжить свою карьеру в отрасли.
Краткий ответ: C ++ компилируется в собственный код, поэтому производительность зависит от разработчика, а не от времени выполнения или виртуальной машины.
Длинный ответ:
C ++ «быстрее» не имеет ничего общего с C ++. На данный момент это один из немногих доступных языков, которые поддерживаются инструментами, создающими автономный собственный код для нескольких платформ.
Когда-то вы могли использовать C, C ++, BASIC / 2, Delphi и т. Д. И получать эффективные, автономные исполняемые файлы. Выбор языка зависел от личных предпочтений и рыночных сил.
В наши дни предположение о том, что «C ++ быстрее», по сути является самореализующимся пророчеством, хотя LLVM находится в хорошем положении, чтобы изменить это, поскольку оно делает все, что входит в спор парсера, как это было раньше.
У Borland все было правильно: несколько языков были проанализированы, сначала применены оптимизации, а затем переданы общему бэкэнд-компилятору и компоновщику. Что, по сути, является одним из главных достижений LLVM.
Java структурирована таким образом, что было бы очень трудно реализовать без JVM. Как ни странно, C #, обычно и неверно, предполагаемый примерно эквивалентным Java, уже компилируется в нативный код на нескольких платформах, включая iOS.
Вершина моего Рождественского списка? Машина времени, чтобы вернуться и добавить свойства, реальную обработку исключений и реальный РАБОЧИЙ полиморфизм в C ++, и избавиться от дерьмового синтаксического дерьма, которое синтаксический анализатор может выяснить самостоятельно. Я написал препроцессор для этих 10 лет назад, потому что это чертовски глупо.