Почему только несколько видеоигр написаны на Java?

Почему не так много коммерческих 3D-игр (не случайных 2D-версий с открытым исходным кодом), написанных на Java? Теоретически это имеет большой смысл: вы получаете повышение производительности и кросс-платформенное приложение почти бесплатно, среди прочего, например, огромное количество библиотек Java и встроенную сборку мусора (хотя я допускаю, не уверен, что последнее хорошо). Так почему он редко используется? Я могу только подумать о нескольких популярных коммерческих играх, написанных для платформы Java.

Это из-за производительности? Если это так, не будет ли большая часть тяжелого подъема на GPU в любом случае?

Ответ 1

Мир разработки игр - забавный: с одной стороны, они часто бывают быстрыми, чтобы принимать новые идеи, с другой стороны, они все еще в каменном веке.

По правде говоря, редко бывает много стимулов при переключении на .NET/Java/ничего, кроме C/С++.

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

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

Наконец, редко бывает, что игры должны быть написаны на 100% С++ в любом случае - многое делается с использованием языков сценариев, независимо от того, являются ли они обычным или просто интегрируют существующие языки (Lua является одним из наиболее популярных в наши дни).

Что касается сборки мусора, это может быть проблемой. Проблема заключается не столько в том, что она существует, сколько в том, как она работает - сборщик мусора ДОЛЖЕН быть неблокирующим (или, по крайней мере, гарантировать, что он будет блокироваться очень кратко), так как просто неприемлемо, чтобы игра замерзала в течение 10 секунд он просматривает всю выделенную память, чтобы увидеть, что можно освободить. Я знаю, что Java, как правило, немного задыхается в GC, когда он близок к исчерпанию памяти (и для некоторых игр там будет).

Вы также немного ограничены в том, что вы можете сделать: вы не можете полностью использовать аппаратное обеспечение из-за накладных расходов на выполнение. Представьте, что Crysis написано на Java... даже если это единственное видимое различие, оно просто не будет одинаковым (я также уверен, что вам понадобится Core i7 для его запуска).

Это не означает, что эти языки не имеют места в разработке игр - и нет, я имею в виду не только программирование инструмента. Для большинства игр вам не нужен дополнительный бит производительности, который вы получаете на С++, включая 3D-игры, и, если вы все это пишете с нуля, может иметь смысл использовать что-то вроде XNA - на самом деле, есть Хороший шанс это будет.

Что касается коммерческих игр - делает RuneScape count? Это может быть самой успешной Java-игрой.

Ответ 2

Я думаю, что Джон Кармак сказал, что лучше всего:

Самая большая проблема заключается в том, что Java очень медленный. На чистом уровне cpu/memory/display/communication большинство современных сотовых телефонов должны быть значительно лучше игровых платформ, чем Game Boy Advanced. С Java, на большинстве телефонов вы остаетесь о мощности процессора оригинального 4,77 МГц ПК IBM и паршивом контролируете все. [... чик...] Однократной записи перспективе в любом месте. Ха. Hahahahaha. Сейчас мы тестируем только четыре платформы, и ни одна пара не имеет таких же причуд. Все коммерческие игры настраиваются и собираются отдельно для каждой (часто 100+) платформы. Портативность не является оправданием для ужасной производительности.

(источник)

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

Ответ 3

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

Все матричные умножения и аффинные векторы, с которыми вам нужно иметь дело, намного легче отслеживать, если они находятся в хорошо сформированных математических выражениях, а не в объектно-ориентированных выражениях, таких как

product = vector.multiply(projectionMatrix).dotProduct(otherVector);

Это просто ужасно. Математика не должна выглядеть так.

Ответ 4

Я думаю, что у .NET были (есть) много одинаковых воспринимаемых проблем, которые есть у Java. Microsoft только что сделала лучшую работу по маркетингу для разработчиков с XNA: -)

Ответ 5

Незначительные точки:

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

  • кросс-платформенный "бесплатно" не так хорошо, как вы думаете, потому что мало разработчики хотят использовать OpenGL и на некоторых ключевых платформах, вероятно, не хватает хорошая реализация Java или оболочки для их родных библиотек, независимо от того, для графики, аудио, сети и т.д.

Но в основном проблема заключается в обратной совместимости. Разработчики игр перешли на С++ с C и на C из сборки только потому, что маршрут миграции был плавным. Каждый из них тесно взаимодействует с предыдущим, и все их предыдущие коды можно было использовать на новом языке, часто с помощью одного компилятора. Поэтому миграция была такой же медленной или быстрой, как вам было угодно. Например, некоторые из наших старых заголовков, которые используются сегодня, по-прежнему имеют #ifdef WATCOMC, и я не думаю, что кто-либо использовал компилятор Watcom здесь через десять или более лет. В старых кодах есть огромные инвестиции, и каждый бит заменяется по мере необходимости. Этот процесс замены и обновления бит и частей из одной игры в другую практически не подходит, если вы перешли на язык, который не взаимодействует с вашим существующим кодом. Да, возможно взаимодействие С++/Java, но очень непрактично по сравнению с простое написание "C с небольшим количеством С++" или вложение блоков asm в C.

Чтобы правильно переписать С++ в качестве языка разработчиков игр, он должен сделать одну из двух вещей:

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

Субъективно, я не думаю, что Java соответствует любому из них. Язык более высокого уровня может соответствовать второму, если кто-то достаточно храбр, чтобы стать пионером. (EVE Online, вероятно, лучший пример использования Python, но который использует вилку основного языка Python, многие компоненты С++ для производительности, и даже это для довольно нетребовательной игры в современных условиях.)

Ответ 6

  • Есть ли хорошие порты игровых движков/библиотек?
  • Многие разработчики C/С++, особенно те, что в Windows (где написаны большинство коммерческих игр), знакомы с Visual Studio. В IDE нет сравнения.
  • В целом, Java была продана предприятиям из-за ее сплошной печати, и она имеет представление о том, что у нее нет проблем с управлением памятью.
  • И да, Java по-прежнему страдает от восприятия, что она медленная, а управление памятью плохой, а для игр она, вероятно, плохо подходит для этой задачи. Как указано в некоторых других ответах, сбор мусора просто не собирается сокращать его, когда вы имеете дело с высокими требованиями к производительности в режиме реального времени. Видеоигры подталкивают процессоры и графические процессоры к своим пределам.

Ответ 7

Я играю в Sims 3, и я немного пошутил. Графический движок - С++, а сценарий и механизм поведения - С#/Mono. Поэтому, в то время как С++ существует для критических бит времени, другие вещи, такие как .interaction, логика игры, AI находятся в объектно-ориентированном управляемом языке.

Ответ 8

Одна из главных причин, по которой Java и другие языки виртуальной машины не используются для игр, - это сборка мусора. То же самое касается .NET. Сбор мусора прошел долгий путь и отлично работает в большинстве типов приложений. Однако, чтобы делать сборку мусора, вам нужно приостановить и прервать приложение для сбора мусора. Это может вызвать периодическое отставание при сборе коллекции.

Java имеет ту же проблему для приложений реального времени. Когда задачи должны выполняться в определенное время, трудно выполнить такую ​​автоматическую задачу, как сбор мусора.

Не то, чтобы Java была медленной. Это то, что Java не очень хорошо справляется с задачами реального времени.

Ответ 9

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

edit: это означает, что это больше, чем проблема с "скоростью" или "не имеют правильных библиотек". Эти две вещи идут рука об руку с этим, но это скорее вопрос "как мне заставить систему, такую ​​как ячейка, запускать мой Java-код?" На самом деле нет хороших компиляторов java, которые могут управлять конвейерами и векторами как мне нужно... "

Ответ 10

Проблема с производительностью является первой причиной. Когда вы видите гипер оптимизированный код С++, который находится в двигателях Quake (http://www.codemaestro.com/reviews/9), вы знаете, что они не собираются тратить время с виртуальной машиной.

Конечно, могут быть какие-то .NET-игры (какие из них мне интересны. Есть ли какие-то CPU/GPU-интенсивные?), но я думаю, это больше, потому что многие люди являются экспертами в технологиях MS и следуют Microsoft когда они начали новую технологию.

О, и кросс-платформенный просто не в голове компаний видеоигр. Linux составляет около 1% рынка, Mac OS - на несколько% больше. Они определенно думают, что это не стоит сбрасывать технологии и librairies Windows, такие как DirectX.

Ответ 11

Вы можете спросить, почему веб-приложения не написаны на C или С++. Сила Java лежит в сетевом стеке и объектно-ориентированном дизайне. Конечно, C и С++ тоже есть. Но на более низкой абстракции. Thats ничего отрицательного, но вы не хотите изобретать велосипед каждый раз, не так ли?

Java также не имеет прямого доступа к аппаратным средствам, что означает, что вы застряли в API любых фреймворков.

Ответ 12

Заблуждения относительно производительности и плохих оптимизаций JVM были бы моей догадкой. Я говорю о неправильных представлениях о производительности, потому что есть некоторые Java-порты игр на С++, которые работают быстрее, чем их аналоги С++ (см. Jake 2). Реальная проблема, ИМХО, заключается в том, что многие программисты на Java не так сильно ориентированы на эффективность кровотечения, поскольку они с легкостью использования и понятности/поддерживаемости кода. На стороне C/С++ вы, по сути, кодируете язык ассемблера чуть более высокого уровня и приближаетесь к аппаратным средствам, как вы можете получить, не записывая в сборке или прямом машинный код.

Ответ 13

Список игровых движков в Википедии перечисляет множество игровых движков вместе с языком программирования, на котором они написаны.

Существует несколько движков Java-игр.

Щелчок по некоторым ссылкам приведет вас к примерам игр и демонстраций, написанных на Java. Вот пара:

В некоторых играх и ситуациях компромиссы Java могут быть приемлемыми.

Ответ 14

У .NET определенно есть те же проблемы, что и в Java, когда речь заходит о высокой производительности 3D. Microsoft также инвестировала гораздо больше времени и денег в развитие библиотек, когда дело доходит до работы с тяжелыми 3D-операциями.

(... лично, я также думаю, что у них была нога, когда дело доходило до магии между DirectX и .NET).

Ответ 15

  • Java медленный, большая часть тяжелой работы не обрабатывается GPU. Там все еще анимация, физика и AI поражают процессор, все из которых очень трудоемки.

  • Java не существует на консолях, а консоли - главная цель коммерческих игр. Если вы используете Java на ПК, вы устраняете свою способность переносить на консоль в разумные сроки и в бюджет.

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

  • Кто-то еще упоминал о промежуточном программном обеспечении выше, был хорошим, поэтому я добавляю его к своему ответу. Там много устаревшего кода и промежуточного программного обеспечения, написанных специально для связи с C/С++, и, наконец, я проверил Java, не имеет хорошей интероперабельности. Использование Java для большинства компаний связано с выделением большого количества кода, большая часть которого была оплачена так или иначе.

Ответ 16

Собственно, для управляемого кода очень возможно делать 3D-игры, проблема в обратных двигателях. С .Net на короткое время Microsoft выпустила оболочку Managed DirectX для DirectX 9. Это было до абстракции, которая теперь является XNA.

Получив полный доступ к DirectX api,.Net-игры работают. Лучший пример, который я знаю, - www.entombed.co.uk, который написан на VB.Net.

К сожалению, на стороне Java это серьезно отсутствует - в основном по той причине, что DirectX недоступен для Java, а программисты игр знают и понимают DirectX api - зачем учиться еще одному апи, когда вы вернетесь в DirectX

Ответ 17

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

Ответ 18

Я бы предположил, что скорость все еще остается проблемой. Кросс-платформа будет проблемой, не так ли, потому что вы не знаете, какая 3D-карта доступна, когда вы пишете код? У java есть что-то, что могло бы поддержать автоматическое обнаружение 3D-возможностей? И я бы предположил, что есть инструменты для облегчения портирования игры между wii, xbox и ps3, но, дорогой, я буду держать пари.

ps3 имеет java, через поддержку синего луча. Проверьте сайт bd-j.

Ответ 19

Даже игры, написанные на платформе .Net, часто высоко оптимизированы для скорости, например, прямого доступа к памяти и шине..Net позволяет использовать C/С++ и смешивать его с языками более высокого уровня, такими как С#.

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

В любом случае, современные 3D-игры действительно используют языки более высокого уровня. Часто вы найдете логику игры, написанную на таких языках, как Lua или Python. Но ядро ​​(I/O, потоки, планирование задач) типичной 3D-игры будет написано на языках низкого уровня в течение следующих 25 лет, или как только устройства не позволят себе абстракцию и виртуализацию самим (что придет).

Ответ 20

Я согласен с другими сообщениями об использовании элементов существующей/лицензированной базы кода, производительности и т.д.

Одна вещь, которую я хотел бы добавить, трудно скрыть отвратительные трюки DRM через виртуальную машину.

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

Ответ 21

Runescape by Jagex написан на Java, тег "видеоигр" может не использовать его в качестве онлайн-игры, но у него действительно достойный результат.

Ответ 22

Об этом говорили уже много, и вы можете найти даже по Вики причины...

  • C/С++ для игрового движка и всего интенсивного материала.
  • Lua или Python для написания скриптов в игре.
  • Java - очень-очень плохая производительность, большое использование памяти + она недоступна на игровых консолях (она используется для некоторых очень простых игр (да, Runescape рассчитывает здесь, это не Battlefield или Crysis или что еще есть) просто потому что есть много программистов, которые знают этот язык программирования).
  • С# - использование большой памяти (используется для некоторых очень простых игр только потому, что есть довольно много программистов, которые знают этот язык программирования).

И я слышу все больше и больше программистов на Java, которые пытаются убедить людей в том, что Java не медленный, не слишком медленно рисовать виджет на экране и рисовать некоторые символы ASCII в виджетах, получать и отправлять данные через сеть ( И рекомендуется использовать его в этих случаях (манипуляции с сетевыми данными) вместо C/С++)... Но это чертовски медленно, когда речь идет о серьезных вещах, таких как математические вычисления, распределение памяти/манипуляции и многое из этого хорошего материала.

Я помню статью на сайте MIT, где они показывают, что C/С++ может делать, если вы используете язык и функции компилятора: матричный множитель (2 матрицы), 1 реализация в Java и 1 реализация на C/С++, с C/С++ и соответствующие оптимизаторы компилятора, реализация C/С++ была ~ 296 260 раз быстрее, чем реализация Java.

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

Изменить. Поскольку кто-то попросил статью, здесь я искал в веб-архиве, чтобы получить это, надеюсь, вы удовлетворены... Тематическое исследование MIT

И добавить, нет, Java для игр все еще ужасная идея. Всего несколько дней назад большая компания, которую я не буду называть, начала переписывать свою игру клиент с Java на С++, потому что очень простая игра (с точки зрения графики) отставала и нагревала i7 Ноутбуки с мощным nVidia GT 5xx и 6xx (не только nVidia, то дело в том, что эти мощные карты, которые могут обрабатывать Max в большинстве новых игр и не могут справиться с этой игрой), а потребление памяти было ~ 2,5 - 2,6 ГБ. Для такой простой графики ему нужен зверь машины.