Жизнеспособна ли Java для серьезной разработки игр? [закрыто]

64

Я искал в Интернете, но ресурсов для разработки игр на Java не так много, не так много, как на C ++. На самом деле, большинство движков написаны на C ++. Я пытался играть в игру, созданную с помощью jMonkeyEngine, но игра была очень медленной, до того момента, когда мой компьютер завис. У меня не было никаких других приложений Java, и ничего слишком ресурсоемкого. Напротив, мой компьютер может играть в большинство современных 3D-игр с легкостью. Если я продолжу изучать и улучшать Java сейчас, и окажется, что позже мне потребуется изучить C ++, переключение может быть затруднено.

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

tehtros
источник
25
Разве Minecraft не построен с Java? Или в основном OpenGL? О, и посмотрите C #, если вы не настроены на 100% на Java, так как это здорово.
Aralox
7
Почему бы вам не зайти в чат Stack Overflow C ++? Мы любим C ++, мы думаем, что он может быть использован правильно, и мы знаем, как это сделать, и мы были бы рады поделиться.
DeadMG
12
Minecraft - это java + LWJGL + навыки кодирования Notch, поэтому с точки зрения производительности это ужасно.
MLProgrammer-CiM
3
Независимо от того, пишите ли вы в игры или что-то еще, привязка к одному языку не поможет вам в будущем. Немного разветвитесь, C ++ или что-то еще, например, Python. Это требует времени, но делает тебя лучшим разработчиком.
loganfsmyth
4
Вы получите много дезинформации, потому что войны Java / C ++ ярко горят, будьте готовы попросить конкретные примеры, прежде чем принимать мнение, а также исследовать больше самостоятельно =) При этом я согласен с @loganfsmyth, что вам нужно будет знать много языков, потому что только тогда вы сможете выбрать правильный инструмент для любой задачи. В ближайшем будущем, если вы просто хотите изучить «программирование в стиле игры», используйте то, что вам удобно (Java), а затем изучите C ++. Черт, позже вы, возможно, будете делать конвейеры контента в C # и игры в Java ME, трудно предсказать =)
Патрик Хьюз,

Ответы:

54

Да, проверьте этот список для доказательства. Это некоторые игры, созданные на Java с использованием Облегченной библиотеки игр Java (LWJGL). Это низкоуровневая структура, которая обеспечивает OpenGL для высококачественной графики и OpenAL для звуков. Он также предоставляет API ввода. С их помощью вы можете легко начать серьезную разработку игр на Java.

В настоящее время я пишу свою вторую 3D-игру в качестве хобби-проекта на Java, и мне это просто нравится. Раньше я писал свои игры на C ++, но после перехода на Java пути назад не было. Поддержка нескольких операционных систем с Java может быть очень простой, например, моя предыдущая Java-игра, которую я разрабатывал в течение года, работала в Linux сразу и в OS X с одной ошибкой без необходимости что-либо компилировать на этих платформах.

С другой стороны, с Java у вас есть пара проблем.

  1. Уборщик мусора. Как уже говорили другие, недетерминированное управление памятью является проблемой, и вы должны это учитывать.
  2. Отсутствие сторонних библиотек. Большинство доступных библиотек не поддерживают Java. С другой стороны, у вас всегда есть возможность вызывать эти нативные библиотеки из Java, но это еще не все. Есть также порты Java или готовые оболочки, доступные для популярных библиотек, например, я использую JBullet - порт Java библиотеки Bullet Physics . С другой стороны, в Java встроена огромная библиотека классов, что уменьшает потребность в сторонних библиотеках, не связанных с игрой. Отсутствие библиотек не было проблемой для меня, но я могу представить, что это может быть для других.
  3. Java не поддерживается популярными игровыми консолями, и, насколько я знаю, нелегко перейти на те из Java. С другой стороны, Android, популярная мобильная платформа, использует ту или иную форму Java. Это также вариант, но не исключая, что один и тот же код Java работает как на ПК, так и на устройстве Android.
  4. Меньшее сообщество. Большинство программистов игр используют C ++ и, по моему опыту, часто не любят Java. Не ожидайте, чтобы получить как можно больше помощи от других. Не ожидайте получить работу в разработке игр без навыков C ++.
msell
источник
40

На самом деле, нет. Дело в том, во-первых, существует очень мало с точки зрения существующих библиотек для Java по сравнению с практически всем, что для C ++.

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

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

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

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

Геймплей над графикой - жизнеспособный выбор, и вы можете увидеть это в успехе таких игр, как Terarria и Minecraft. Но если вы намереваетесь создать графику srs, то это не будет выполнимо в Java.

DeadMG
источник
6
+1, поскольку он указал тяжелую графику, быстрая игра без лагов.
Джошуа Дрейк
1
Отсутствие в Java типов данных без знака также противостоит этому. Да, вы можете обойти это, но это не идеально, и вы будете использовать код, который на самом деле не отражает правильные данные.
Максимус Минимус
@deadmg Случай заблокирован и разблокирован , вы имеете в виду некоторые функции DirectX API? & Можете ли вы сказать мне, что плохого в недетерминированном GC.
Quazi Irfan
Недетерминированный сборщик мусора может приравниваться к отбрасыванию кадров, если вы получили плохую остановку, остановите мир, и он блокирует вещи дольше, чем требуется для рендеринга кадра. На практике это не часто случается часто / никогда, если вы планируете использовать память, коллекторы JVM могут быть настроены на низкую паузу (в пределах безопасных пределов для пропуска кадров). Тем не менее, это не забавная вещь, с которой приходится иметь дело. В конечном итоге вам придется вернуть значительную часть производительности, которую вы получили, когда вышли из C ++.
Майкл
2
Для начала вам придется полностью переписать.
DeadMG
25

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

Если ваша причина выбора Java в том, что вы не понимаете C ++, ваши Java-программы не будут достаточно быстрыми для высококачественной графики. Использование языка более высокого уровня должно быть потому, что оно делает вас более продуктивным, а не потому, что вы не могли понять язык более низкого уровня.

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

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

  1. Тяжелая графика: возможно, но вы будете делать в Java / LWJGL то же самое, что и в C ++ / GL: запись байтов в буферы GPU и / или использование устаревших списков отображения, как это делает Minecraft. Если вы не понимаете управление памятью, вы не будете делать это правильно.

  2. Быстрая игра без задержек: задача не из легких на любом языке, и вы с большей вероятностью будете стрелять себе в ногу, не задумываясь.

  3. Нет, Java не будет доступна на консолях.

Джимми
источник
В качестве дополнительного вопроса, что заменило списки отображения, когда они устарели?
Суд
@Suds: Программируемый конвейер, я полагаю.
DeadMG
ха! уже покрыл это. VBOs: gamedev.stackexchange.com/questions/22170/…
Джимми
Мобильные платформы можно считать консолями. Я понимаю, что он, вероятно, говорил о большой тройке, но Android использует Java, и для этого создано множество игр.
Amplify91
1
@ Amplify91 да, несколько игр написаны на Java для Android. Но большинство хороших игр и, вероятно, все графические или мультиплатформенные игры написаны на C ++ с использованием Android NDK.
Койот
15

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

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

Я бы посоветовал вам сейчас придерживаться Java (или переключиться на C #, если вы предпочитаете это). Это позволит вам сделать все быстрее, чем при использовании C ++, и производительность на ПК не должна быть проблемой.

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

Обратите внимание, что за исключением того, что C # / XNA для получения игры, которую вы записали на консоль, как минимум, требуют, чтобы вы создали компанию с офисом и располагали большим бюджетом на разработку оборудования и другие расходы.

Адам
источник
Это также исключительно верно, потому что другие языки помимо C ++ дадут вам чувство выполненного долга. C ++ может занять сотни часов, на что ничего не похоже. Изучение других языков в первую очередь позволяет вам промокнуть.
Даркенор
Ваши комментарии об отсутствии обработки ошибок на самом деле касаются C (и так называемого кода C ++, который на самом деле является C). C ++ имеет стандартные библиотеки (и стандартные библиотеки шаблонов), которые намного лучше обрабатывают ошибки, чем то, что вы описываете. C ++ также имеет предоставленные поставщиком библиотеки (такие как MFC), которые обеспечивают достойную обработку ошибок.
Джаспер
9

Отказ от ответственности: это не совсем отвечает на ваш вопрос. Тем не менее, я попытался (кратко) упомянуть некоторые моменты, которые могут вас заинтересовать.

Причина, по которой вы так много видите о C ++, заключается в том, что C ++ по-прежнему является отраслевым стандартом - наиболее распространенным языком для консолей и т. Д.

Ява не часто используется. Minecraft - довольно популярная игра, которая стала популярной благодаря Java; но это не так здорово графически. Spiral Knights неплохо - тоже сделано на Java, со значительной графикой.

Если вам нравится Java, C # очень похож по синтаксису, с тем преимуществом, что он может взаимодействовать с C ++, поэтому в C ++ при необходимости можно выполнять низкоуровневые вещи. Unity может использовать C # для написания скриптов, а XNA - отличный выбор.

Опять же, Java широко не используется. Если вам нравится стиль и синтаксис, я думаю, вы обнаружите, что C # очень похож, очень приятен при программировании.

Я надеюсь, что твои мечты осуществятся, по пути будет очень весело :)

ashes999
источник
8
Много-много неточностей в этих постах. Майнкрафт "плохая" графика не (сильно) связана с языком. Плохая производительность MC напрямую связана с тем, что Java является плохим языком для игр из-за огромных проблем с производительностью, а LWJGL является неподходящей библиотекой для больших проектов кодирования по той же причине. Но самым большим фактором было плохое кодирование и реализация Notch, которая исправляется ... медленно. C # дает вам все подъемы управляемой памяти без большинства проблем с производительностью Java. Недостатком является то, что C # сильно ориентирован на Microsoft как для игр, так и для приложений.
MLProgrammer-CiM
2
@EfEs: Я не хочу рассказывать вам об этом, но управляемая память ужасна для игр, и людям, которые пишут игры в XNA, приходится тратить больше времени на управление памятью, чем людям, которые пишут на C ++. Недетерминированная природа GC означает, что вы должны объединять практически все и избегать распределения, как чумы, а не так, как предполагалось использовать язык.
DeadMG
Этот ответ не должен был быть точным на 100%; Я привел только примеры, о которых я смутно знаю. Не стесняйтесь DV.
ashes999
2
@DeadMG Я знаю, что C ++ - это путь, я просто пытался объяснить, что C # лучше, чем Java для игр.
MLProgrammer-CiM
5
Будучи долгое время разработчиком C # (а не разработчиком игр), я считаю, что пул и управление памятью - большие проблемы для любой плохо спроектированной системы. Люди с менталитетом C / C ++ и способами разработки, которые я знаю, с трудом понимают, что нужно использовать управляемую память, шаблоны проектирования и архитектуры, и используют их на таких языках, как Java / C #. То, что я пытаюсь сказать, заключается не в том, что методы или продукты C / C ++ плохие, а в том, что даже если вы используете более простые языки с точки зрения синтаксиса (такие как Java и C #), вам все равно понадобится большой опыт для разработки правильной игры. путь.
Ивайло Славов
3

Это не отвечает на ваш вопрос; Проблемы с графикой и консолью, похоже, очень важны. Также GC влияет на производительность. Но о чем я пишу:

Если вы пишете большие, сложные OO-программы, вы будете писать их в 5 раз быстрее на Java, чем на C ++. Кроме того, обслуживание будет значительно проще. Я переключился (по общему признанию для неигрового программного обеспечения), и моя производительность взлетела до небес. C #, еще одна хорошая альтернатива, сложнее в изучении, чем Java, потому что ее гораздо больше. Когда вы знаете это, вы можете писать код даже быстрее, чем в Java; он предлагает вам много хитростей. Тем не менее, я считаю, что эти приемы могут затруднить техническое обслуживание. И еще есть Java doc, который помогает с библиотеками Sun и вашим собственным старым кодом. C # не имеет ничего подобного.

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

RalphChapin
источник
3

Послушай, чувак, простой ответ на вопрос «Является ли Java жизнеспособным для разработчика игр» - очевидное да. Вы можете использовать любой язык программирования для создания игр. Это не значит, что ты должен .

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

Java делает некоторые вещи (например, проверку границ массива), которые просто заставляют его работать медленнее. В этом оптимизированном примере кода Java Perlin noise автор прокомментировал «(доступ к массиву намного медленнее, чем доступ к элементу)». Подобные вещи довольно противоречивы из опыта C ++. Но на Java такие вещи есть.

Я говорю, прекратите уворачиваться от пули, изучите C ++ и используйте его.

bobobobo
источник
1

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

Современные JVM, даже те, что принадлежат Oracle, имеют множество функций для решения проблем, поднятых здесь людьми. Вы можете использовать разные сборщики мусора, чтобы получить более детерминированное поведение сборщика мусора. У меня нет большого опыта работы с 3D-библиотеками - только немного с Java3D - но никто здесь, кажется, не жаловался на них. Анализ побега теперь позволяет исключить блокировку и намного быстрее / незначительно распределить объекты с очень коротким сроком службы.

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

Мутант Утконос
источник
5
Формальное образование в CS стоит дерьма за практические навыки программирования в любой дисциплине. Я бы знал, я на третьем курсе.
DeadMG
4
Определенно не согласен с DeadMG. Окончив и выбрав курсы, которые мне нравятся, CS поднял свои навыки разработки игр с 10% до 100%. Это не научило меня UI, иконографии и т. Д., А фактическому, настоящему кодированию.
ashes999
2
@ ashes999: Тогда тебе повезло. Мой курс бесполезен, и я знаю, что есть много других, которые чувствуют то же самое.
DeadMG
2
@DeadMG трудно увидеть, когда ты учишься. Как только вы проработаете пару лет F / T и изучите другие дополнительные навыки, вы увидите. Я сделал. Но, может быть, я просто уделил много внимания и попытался применить все к своему хобби для разработчиков игр.
ashes999
1
Я бы сказал, что это зависит от школы и профессора. У меня было несколько отличных уроков программирования, где я выучил много; и у меня было несколько, где я действительно чувствовал, что потерял знание, посещая. Все дело в том, чтобы иметь хорошего профессора или нет. ИМО.
Нейт