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

UITextView не имеет методов, которые будут вызываться, когда пользователь нажимает клавишу возврата. Если вы хотите, чтобы пользователь мог добавить только одну строку текста, используйте UITextField. Нажатие на возврат и скрытие клавиатуры для UITextView не соответствует рекомендациям интерфейса.

Даже тогда, если вы хотите сделать это, реализуйте метод textView:shouldChangeTextInRange:replacementText: из UITextViewDelegate и в этой проверке, если текст замены - \n, скройте клавиатуру.

Могут быть и другие пути, но я не знаю ни одного.

170
задан Sasha Chedygov 17 December 2015 в 17:00
поделиться

19 ответов

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

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

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

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

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

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

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

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

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

153
ответ дан 23 November 2019 в 20:45
поделиться

Even games written on the .Net platform are often highly optimized for speed like direct access to memory and bus. .Net allows to use C / C++ and mix it with higher level languages such as C#.

Game development studios often work close together with hardware vendors, which do provide access to low level interfaces of their products. This is a world, where you have to use ASM and C for device communication. A virtual environment would slow down these program parts.

Anyway, modern 3D games in fact do use higher level languages. Often, you'll find the game logic written in languages like Lua or Python. But the core (I/O, threads, task scheduling) of the typical 3D game will be written in low level languages for the next 25 years or as long devices do not allow abstraction and virtualization by themself (which will come).

1
ответ дан 23 November 2019 в 20:45
поделиться

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

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

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

1
ответ дан 23 November 2019 в 20:45
поделиться
  1. Java работает медленно, большая часть тяжелой работы не выполняется GPU. По-прежнему есть анимация, физика и искусственный интеллект, воздействующие на ЦП, и все это требует очень много времени.

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

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

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

2
ответ дан 23 November 2019 в 20:45
поделиться

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

4
ответ дан 23 November 2019 в 20:45
поделиться

Сначала второстепенные моменты:

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

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

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

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

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

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

17
ответ дан 23 November 2019 в 20:45
поделиться

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

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

1
ответ дан 23 November 2019 в 20:45
поделиться

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

0
ответ дан 23 November 2019 в 20:45
поделиться

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

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

3
ответ дан 23 November 2019 в 20:45
поделиться

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

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

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

7
ответ дан 23 November 2019 в 20:45
поделиться

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

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

8
ответ дан 23 November 2019 в 20:45
поделиться

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

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

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

10
ответ дан 23 November 2019 в 20:45
поделиться
  • Есть ли хорошие порты игровых движков / библиотек?
  • Многие разработчики C / C ++, особенно разработчики Windows (где написано большинство коммерческих игр) знакомы с Visual Studio. В IDE нет сравнения.
  • В целом, Java продается компаниям из-за надежной типизации и отсутствия проблем с управлением памятью.
  • И да, Java по-прежнему страдает от восприятия того, что он медленный, и что у него плохое управление памятью, а для игр он, вероятно, не подходит для этой задачи. Как указано в некоторых других ответах, сборка мусора просто не сократит его, когда вы имеете дело с требованиями к высокой производительности в реальном времени. Видеоигры доводят ЦП и ГП до предела своих возможностей.
12
ответ дан 23 November 2019 в 20:45
поделиться

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

12
ответ дан 23 November 2019 в 20:45
поделиться

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

27
ответ дан 23 November 2019 в 20:45
поделиться

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

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

( источник )

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

95
ответ дан 23 November 2019 в 20:45
поделиться

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

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

4
ответ дан 23 November 2019 в 20:45
поделиться

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

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

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

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

53
ответ дан 23 November 2019 в 20:45
поделиться

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

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

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

2
ответ дан 23 November 2019 в 20:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: