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

171

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

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

Саша Чедыгов
источник
10
en.wikipedia.org/wiki/Tribal_trouble
Майкл Майерс
1
Re: mmyers; Я несколько шокирован тем, что эта игра получила награду «лучшая графика» даже в 2005 году ...
CloudyMusic
2
Да, но большинство "настоящих игр" не созданы в управляемом .net, верно? Они сделаны в старой школе с / с ++?
Hardwareguy
14
Runescape написан на Java.
GameFreak
44
Minecraft написан на Java!
daGrevis

Ответы:

155

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

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

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

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

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

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

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

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

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

Майкл Мэдсен
источник
16
Ну, очевидно, вы не будете запускать Crysis на JVM; черт, если вы закодировали эту игру на языке ассемблера, вам все равно понадобился бы суперкомпьютер, чтобы запустить его на полных настройках. Но +1 за отличное понимание, спасибо.
Саша Чедыгов
15
Вы не можете сравнить Unreal Tournament 3 или Crysis с Runescape. Если качество графики является проблемой, вам нужно придерживаться языка низкого уровня с минимальными накладными расходами. Конечно, для Indy или игр, где графика не является основным преимуществом, Java является отличной альтернативой C / C ++.
GuiSim
6
@GuiSim: для большинства игр качество графики НЕ является основным преимуществом. Есть только несколько игр, о которых я могу думать, которые были созданы с учетом графики (я думаю о Crysis, но в то же время и о Half-Life 2). Я не думаю, что большинство разработчиков игр слишком заботятся о графике, если они «достаточно хороши» (то же самое, что и большинство других игр).
Саша Чедыгов
4
Графика действительно имеет мало общего с языком. Физика, ИИ, да. Графика, нет.
JulianR
10
@JulianR может быть значительная рабочая нагрузка для подготовки и поддержания сцены, которая будет эффективно отображаться, поэтому язык и связанные с ним языковые накладные расходы имеют значение для графики.
КШмидт
95

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

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

( источник )

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

Марк
источник
61
Эта цитата была с 2005 года. С тех пор и технология Java, и мощность сотовых телефонов значительно улучшились. Сравнение игр для мобильных телефонов и игр для ПК - это сравнение яблок с апельсинами.
Крис Дейл
78
Джон Кармак сказал это. Дело закрыто.
GuiSim
41
Мне просто становится неловко, когда я читаю «Java очень медленная». Это все равно, что говорить, что спортивная машина стоимостью 50 тысяч долларов медленнее, чем спортивная машина стоимостью 100 тысяч долларов. Конечно, это медленнее, но в 90% случаев, работа, которую он выполняет, все еще велика и стоит половину стоимости;) Никакой пламенной войны не предполагается. Я согласен, что по вышеуказанным причинам Crysis и подобные игры не написаны на Java.
Росс
17
@Chris Dail, это подчеркивает всю проблему с производительностью Java. Улучшена ли производительность Java? Нет, мобильные телефоны стали быстрее. Предполагается, что игры расширяют границы реализма, и, следовательно, расширяют границы аппаратного обеспечения, и недопустимо выбрасывать% 30-% 40 вашей производительности до того, как вы даже написали строку кода.
CGP
8
Я нахожу этот спор очень странным. Java ME - это не то же самое, что Java в Android, а также не то же самое, что Java на ПК. Java ME обычно полагался на производителей телефонов, чтобы придумать JVM. Некоторые сделали хорошую работу, некоторые нет. Неудивительно, что Кармак жаловался на них. У Android есть собственная виртуальная машина, которая не является JVM. И у него есть серьезные проблемы (с моей точки зрения). Oracle HotSpot VM полностью отличается от обоих случаев. Если люди сравнивают все эти вещи, я могу сделать вывод, что они не знают, о чем говорят.
Малкольм
54

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

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

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

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

Welbog
источник
19
Я помню, как в далеком 96-м, некоторые дизайнеры из Sun проводили презентацию по Java в Беркли. Уильям Кахан ( en.wikipedia.org/wiki/William_Kahan ) давал им знать по этому вопросу. :)
JP Alioto
13
я думаю, что есть веская причина не допускать перегрузку операторов на языке: запретить людям использовать его. это мощный инструмент и очень крутой для математики, но опасен для всего остального. Несмотря на то, что кодеры ленивы, они, как правило, используют его для сокращения кода, и в тот момент, когда люди начинают выполнять карту, умножающую итерируемую функцию, или даже когда все арифметические операции определены для функций, читаемость кода должна достичь 0. И да, я потратил значительное количество времени на портирование такого кода. Это выбор дизайна. и выбор дизайна всегда имеет тенденцию быть спорным.
back2dos
19
Наказать всех остальных за несколько плохих парней? Это одна из причин, почему я предпочитаю C #. Если мне действительно нужна перегрузка оператора, она есть.
ChaosPandion
1
По сути, перегрузка операторов действительно подходит только для 2-3 различных ситуаций в дизайне ООП (векторы, матрицы, комплексные числа). В большинстве других случаев он слишком слабо определен и приводит только к небрежному коду, слабому синтаксису и плохой документации, даже от людей, которые знают, как его использовать. Я думаю, именно поэтому Sun решила не использовать его в Java, и я думаю, что это правильное решение.
bgroenks
1
@MMJZ: Как лямбда-выражения связаны с перегрузкой операторов?
Саша Чедыгов
26

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

Джоэл Мартинес
источник
10
XNA также позволяет развертывать ваше .NET-приложение в XBox. Я не видел ничего более гладкого для Java.
StriplingWarrior
Вы также можете развернуть в Zune.
cbeuker
Немного более старый вопрос, но просто для обновления, теперь вы также можете писать игры для XNA для Windows Phone :-)
Джоэль Мартинес
3
@JoelMartinez еще одно обновление: невозможно писать игры для XNA для Windows Phone 8.
Томас Андрле
@TomA Теперь можно писать однопользовательские игры для WP8
Алекс Лапа,
17

Незначительные очки в первую очередь:

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

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

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

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

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

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

Kylotan
источник
Просто хочу добавить, что EVE Online - это «онлайн» космическая симуляция, где обычные сражения между игроками 1000 против 1000 против игрока являются обычным сценарием с точки зрения производительности. Хотя части, требующие высокой скорости, написаны на C / C ++, это все же интересное исследование проблем использования языка высокого уровня (Python) в играх.
Hakan Deryal
Однако следует помнить, что производительность в многопользовательских играх на стороне сервера измеряется слегка отличающимися показателями от производительности в однопользовательских играх на стороне клиента - первая больше связана с пропускной способностью, вторая - с задержкой.
Kylotan
Да, это правда, но это сражение включает в себя более 2000 кораблей на экране, более 2000 снарядов (ракеты, с анимацией), взрывы и т. Д., Которые требуют высокой производительности графики. В любом случае, спасибо за подробный ответ, он все еще остается в силе.
Хакан Дериал
1
Если вы думаете, что синтаксис C & Java одинаков и, следовательно, имеет некоторое отношение к производительности, вы действительно не понимаете, что происходит. Как мог C во время выполнения решить, что данная функция вызывается с одними и теми же параметрами неоднократно, и заменить весь вызов функции константой, сохраняя при этом вызов функции, когда в параметрах есть отклонение? Я не говорю, что время выполнения всегда лучше или всегда хуже, просто это не имеет никакого отношения к синтаксису!
Билл К
1
@BillK - вы, кажется, неправильно прочитали. Я упоминал синтаксис только со ссылкой на «производительность», а не на «производительность». Это правда, что JIT-оптимизация может сделать Java быстрее в теории, но на практике этого не происходит, по крайней мере, в игровом программном обеспечении.
Kylotan
12

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

Джон Саймон
источник
5
а затем для версии Mac они помещают все это в модифицированную виртуальную машину Wine. Я думаю, что все еще быстрее, чем на прямой Java :-)
Бен Готов
10
Wine - это не виртуальная машина, это библиотека времени выполнения, которая имитирует поведение библиотек времени выполнения Windows. Отсюда и название (Wine не эмулятор).
Нейт СК
2
Это очень распространено в играх, довольно часто логика, которая не критична по времени, написана на каком-то языке сценариев, обычно lua или python.
КШмидт
Это не ванильный моно, хотя. ЕА нужна была специальная команда, работающая над собственным КЛР на полную ставку, чтобы она работала.
Crashworks
4
Еще одно замечание: Sims 3 печально известна своей низкой производительностью даже на отличных компьютерах.
Lotus Notes
12
  • Есть ли хорошие порты игровых движков / библиотек?
  • Многие разработчики на C / C ++, особенно разработчики под Windows (где написано большинство коммерческих игр), знакомы с Visual Studio. В IDE нет сравнения.
  • В целом, Java была продана предприятиям из-за ее строгой типизации и восприятия отсутствия проблем с управлением памятью.
  • И да, Java все еще страдает от ощущения, что она медленная, управление памятью плохое, а для игр она, вероятно, не подходит для этой задачи. Как указано в некоторых других ответах, сборка мусора просто не приведет к ее сокращению, когда вы работаете с высокопроизводительными требованиями в реальном времени. Видеоигры расширяют возможности процессоров и графических процессоров.
CGP
источник
1
+1 за жирный текст. Люди, кажется, не понимают, что когда ваша игра работает на скорости 20 кадров в секунду, она часто привязана к оборудованию со скоростью 20 кадров в секунду. Он действительно хочет получить 30+ кадров в секунду ... но не может.
GuiSim
Я не думаю, что проблема с производительностью связана только с GC ... и даже не в сочетании с фазой медленного запуска ... это общие проблемы с производительностью, но это только я.
rogerdpack
2
Я думаю, что в этот момент я скорее согласен, чем в прошлом. Оптимизация JVM улучшена; однако, в свете улучшений производительности в слабо типизированных языках, таких как JavaScript и другие, производительность Java в сравнении довольно непростительна. Есть много апологетов за производительность Java. (но воспринимаемое исполнение в конце концов это все, что имеет значение) '
cgp
10

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

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

Дело не в том, что Java медленная. Дело в том, что Java плохо справляется с задачами в реальном времени.

Крис Дейл
источник
1
Однако вы можете написать свой собственный планировщик для сборщика мусора, если вы собираетесь зайти так далеко, чтобы перенести Java в новую среду. Память должна быть восстановлена ​​в любом случае, и в среде реального времени вы можете выбрать, когда запланировать свой gc ... лучший из обоих миров. Я должен вернуться к тому, что нет особых причин переносить Java на архитектуру, чтобы делать то, что вы хотите, чтобы она делала, когда C / C ++ уже делает это за вас. Ява светит в других местах.
Сан Хасинто
5
Это не 1990-е годы. Сборщики мусора довольно хороши сейчас, когда настроены на малую паузу.
Том Хотин - tackline
8

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

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

Сан Хасинто
источник
7

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

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

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

Ksempac
источник
3
«Кроссплатформенность просто не предназначена для компаний, занимающихся видеоиграми» - вот почему я полностью уважаю компании, которые делают :)
Саша Чедыгов
Я определенно благодарен Кармаку за то, что он так предан как кроссплатформенному, так и открытому исходному коду. Я просто изложил то, что думает большинство компаний.
Ksempac
1
Это правда. Вы не видите много популярных видеоигр, портированных на Linux. :(
Саша Чедыгов
Кроссплатформенность - это не просто кроссовая ОС Подумайте о PS3, Xbox 360, Wii.
JulianR
«они не собираются тратить свое время на виртуальную машину». en.wikipedia.org/wiki/Quake_III_Arena#Virtual_machine , Кармак создал свою собственную для игровой логики.
Джеймс МакМахон
4

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

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

Markus
источник
Java может вызывать нативный код через "JNI"
Барт ван Хейкелом
4
... и потерять мобильность, пока вы на это!
LiraNuna
1
Вы действительно не теряете много переносимости, когда используете JNI. При условии, что вы все еще можете компилировать нативные библиотеки на платформах, которые вы хотите поддерживать, это в основном означает, что вам нужно только портировать / перекомпилировать 1% кода, а не весь. Вы по-прежнему получаете большую выгоду от переносимости Java.
bgroenks
4

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

illvm
источник
Если он «настолько близок к аппаратному обеспечению, насколько это возможно, без написания на ассемблере», то Java не сможет превзойти его, если ваше кодирование не ужасно. Чем ближе вы подходите к оборудованию, тем быстрее вы сможете получить.
Джош Джонсон
4

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

В списке есть несколько игровых движков Java.

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

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

Johnb
источник
Я знаю, что существуют игры , написанные на Java. Но кроме Minecraft и Runescape, очень мало популярных коммерческих игр написано для платформы Java. Сколько названий ААА было написано на Java? А почему так мало? Отсюда и мой вопрос.
Саша Чедыгов
3

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

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

Джастин Нисснер
источник
2
  1. Java работает медленно, большая часть тяжелой работы не обрабатывается графическим процессором. Все еще анимация, физика и ИИ поражают процессор, и все это занимает очень много времени.

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

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

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

Дэн Олсон
источник
3
Вы можете использовать JavaCL, JOCL или APARAPI, чтобы выгрузить большую часть этого в графический процессор.
bgroenks
2

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

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

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

Фос
источник
2

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

Дэниел Колликотт
источник
1

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

PS3 имеет Java, через поддержку Blue Ray. Проверьте сайт bd-j.

lumpynose
источник
1

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

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

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

cafebabe
источник
1

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

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

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

JP772
источник
0

Runescape от Jagex написан на Java, тэг «видеоигры» может и не относиться конкретно к онлайн-игре, но у него есть достойные последователи.

Марк Шультхайс
источник
Извините, но это не совсем отвечает на мой вопрос.
Саша Чедыгов
2
Но слепое изложение вопроса приводит к предположению, что НИКАКИЕ игры не написаны на Java, а просто указывает на успешный случай, когда кто-то находится.
Марк Шультхайс
0

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

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

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

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

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

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

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

Лилиан А. Морару
источник
10
Вы очень мало знаете о современной среде выполнения Java и виртуальной машине. Статья, которую вы упомянули, более чем вероятна десять лет назад или больше, конечно, никто не может знать, потому что вы ее не цитировали. Ваше восприятие Java устарело.
bgroenks
2
Итак, это исследование доказывает, что при крупномасштабном умножении матриц Java проигрывает C, когда для доступа к данным используется доступ к двумерному массиву. Да, я бы тоже об этом догадался. И если это действительно проблема для вас, в чем я сомневаюсь, поэтому у вас есть JNI. Затраты на проверку границ для массивов в этой ситуации складываются, хотя его Java-код мог бы быть оптимизирован для существенного улучшения результатов. Кроме того, я подвергаю сомнению его понимание JIT, когда он заявляет: «более быстрая компиляция = не лучший сгенерированный код». Читайте спецификации IBM, чтобы доказать обратное.
bgroenks
3
Java НЕ является плохим выбором для разработки игр. Есть много успешных игр, которые работают на Java. Как правило, вам нужна небольшая помощь из нативного кода (особенно с LWJGL и тому подобным), чтобы действительно получить наилучшие результаты. Но если мне нужно только перенести и перекомпилировать 1% моего кода, а не 100%, для меня это звучит очень здорово.
bgroenks
1
@bgroenks "100%" - похоже, вы понятия не имеете о C / C ++ ... А при создании игры вы всегда можете использовать кроссплатформенную библиотеку (SDL и множество других) или фреймворк (например, Qt). Например: EA использует Qt абсолютно для каждой игры, которую они имеют ... Qt НАМНОГО более кроссплатформенный, чем Java, и компилируется в нативный код.
Лилиан А. Морару
2
Я не вижу смысла в Java, когда у вас есть Qt. Я нахожу код Qt более понятным, более легким для понимания и сопровождения, чем код Java. Когда я спрашиваю своих друзей, почему они так боятся C ++, они всегда говорят мне, что они ненавидят указатели и стараются освободить память. Похоже, что многие люди не знают о shared_ptr в C ++ ... Для меня Qt и C # .NET / C ++ .NET лучше всего писать. Java-код обычно очень раздутый с обработкой исключений, обычно устаревшие библиотеки (Это хорошо работает в основном только на стороне сервера, но остальное ...) и часто устаревшая документация.
Лилиан А. Морару,