Чому лише кілька відеоігор написано на Java? [зачинено]


171

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

Це через продуктивність? Якщо так, чи не все-таки більшість важких підйомів зробить GPU?



1
Re: mmyers; Я дещо в шоці, що ця гра здобула нагороду "найкраща графіка", навіть у 2005 році ...
CloudMusic

2
Так, але більшість "справжніх ігор" не проводиться в керованому .net так? Їх роблять у старій школі c / c ++?
Hardwareguy

14
Runescape написаний на Java.
GameFreak

44
Minecraft написаний на Java!
daGrevis

Відповіді:


155

Світ розвитку ігор є кумедним: з одного боку, вони часто швидко сприймають нові ідеї, а з іншого - вони ще в кам'яному віці.

Правда, рідко виникає такий великий стимул для переходу на .NET / Java / що-небудь інше, ніж C / C ++.

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

Також у C ++ вже існує багато застарілого коду. Якщо код з попередніх проектів можна повторно використовувати (скажімо, якщо ви пишете продовження), це вважає ще більше на користь дотримуватися тієї ж мови, а не переписувати її новою мовою (тим більше, що ви, ймовірно, повторно введіть тонна помилок, які вам потрібно буде витратити час на прасування.

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

Що стосується вивезення сміття, то це може бути проблемою. Проблема не стільки в тому, що вона існує, скільки в тому, як вона працює - сміттєзбірник ОБОВ'ЯЗКОВО не блокує (або принаймні гарантує лише блокування дуже коротко), оскільки просто неприпустимо, щоб гра замерзла на 10 секунд, поки він сканує всю виділену пам'ять, щоб побачити, що можна звільнити. Я знаю, що у GC'ing, як правило, Java задихається, коли це майже не вистачає пам’яті (а для деяких ігор там буде).

Ви також трохи обмежені в тому, що можете робити: ви не можете повною мірою експлуатувати апаратне забезпечення через надмірні витрати часу. Уявіть, що 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
Графіка насправді дуже мало стосується мови. Фізика, AI, так. Графіка, ні.
JulianR

10
@JulianR може бути значна навантаження на підготовку та підтримку сцени для ефективної візуалізації, тому мова та пов’язана з нею мова мають значення для графіки.
KSchmidt

95

Я думаю, що Джон Кармак сказав це найкраще:

Найбільша проблема полягає в тому, що Java справді повільна. На чистому рівні процесора / пам'яті / дисплея / комунікацій більшість сучасних мобільних телефонів повинні бути значно кращими ігровими платформами, ніж ігровий хлопчик Advanced. У системі Java на більшості телефонів вам залишається приблизно потужність процесора оригінального 4,77 МГц IBM PC і невдалий контроль над усім. [... snip ...] Напишіть один раз запустити будь-де. Ха. Хахахахаха. Зараз ми протестуємо лише на чотирьох платформах, і жодна пара не має таких самих примх. Всі комерційні ігри налаштовуються та складаються індивідуально для кожної (найчастіше 100+) платформи. Переносність не є виправданням для жахливих показників.

( джерело )

Зрозуміло, він говорив про мобільні платформи, але я виявив подібні проблеми з Java в цілому, що походить із C ++. Мені не вистачає можливості виділити пам'ять на стек / купу на власних умовах.


60
Ця цитата була з 2005 року. І техніка Java, і потужність мобільних телефонів значно покращилися відтоді. Порівнюючи ігри для мобільних телефонів і комп'ютерних ігор, порівнюємо яблука з апельсинами.
Кріс Дейл

78
Джон Кармак сказав це. Справа закрита.
GuiSim

41
Мені просто стає неспокійно, коли я читаю "Java справді повільна". Це як би сказати, що спортивний автомобіль у $ 50 000 повільний порівняно зі спортивним автомобілем у 100 тисяч доларів. Звичайно, це повільніше, але 90% часу робота, яку вона виконує, все ще велика і з половиною витрат;) Жодна полум'яна війна не передбачалася. Я погоджуюся, що наведені вище причини, чому Crysis та подібні ігри не написані на Java.
Росс

17
@Chris Dail, це підкреслює всю проблему з продуктивністю Java. Чи покращилась продуктивність Java? Ні, мобільні телефони просто стали швидше. Ігри повинні відсунути межі реалізму, а отже, відсунути межі апаратних засобів, а викидання% 30-% 40 своєї продуктивності, перш ніж ви навіть написали рядок коду, неприпустимо.
cgp

8
Я вважаю цю суперечку дуже дивною. Java ME не те саме, що Java в Android, а також не те, що Java на ПК. Java ME зазвичай покладалася на виробників телефонів, щоб придумати JVM. Деякі зробили гарну роботу, інші - не. Недарма Кармак скаржився на них. У Android є власний VM, який не є JVM. І це має деякі серйозні питання (з моєї точки зору). HotSpot VM Oracle повністю відрізняється від обох випадків. Якщо люди порівнюють усі ці речі, єдине, що я можу зробити висновок - це те, що вони не знають, про що говорять.
Малькольм

54

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

Усі вектори множення матриці та афінних векторів, з якими вам потрібно мати справу, набагато простіше прослідкувати, якщо вони мають добре сформовані математичні вирази, а не об'єктно-орієнтовані вирази, як-от

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

Це просто жахливо. Математика не повинна виглядати так.


19
Я пам'ятаю ще в 96 році, я думаю, що це було, деякі дизайнери з Sun проводили презентацію на Java в Берклі. Вільям Кахан ( en.wikipedia.org/wiki/William_Kahan ) надавав їм велику увагу над цим питанням. :)
JP Alioto

13
Я думаю, що є вагомі причини не допустити перевантаження оператором мовою: не дозволяти людям користуватися нею. це потужний інструмент і дуже класний для математики, але небезпечний для всього іншого. ліниві, як кодери, вони, як правило, не використовують його для скорочення коду, і в момент, коли люди починають виконувати карту, помножуючи ітерабельну функцію, або навіть коли всі арифметичні опції визначені для функцій, читабельність коду ось-ось досягне 0 і так, я витратив чимало часу на перенос такого коду. : -S це вибір дизайну. та вибір дизайну завжди є суперечливим.
back2dos

19
Покарайте всіх інших за кілька поганих яблук? Це одна з причин, що я віддаю перевагу C #. Якщо мені справді потрібна перевантаження оператора, вона є.
ChaosPandion

1
В основному, перевантаження оператора реально підходить лише для 2-3 різних ситуацій в дизайні OOP (Вектори, Матриці, Комплексні числа). У більшості інших ситуацій це занадто вільно визначено і призводить лише до неохайного коду, слабкого синтаксису та поганої документації, навіть від людей, які вміють ним користуватися. Я думаю, що тому 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.
Tomas Andrle

@TomA Зараз можна писати моногамні ігри для WP8
Alex Lapa

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 ++ для продуктивності, і навіть це для досить невимогливої ​​гри в сучасних умовах.)


Щойно хотілося додати, EVE Online - це космічне моделювання в Інтернеті, де звичні поєдинки гравців проти гравців проти гравців 1000s проти гравців, що можна вважати складним сценарієм щодо продуктивності. Хоча частини, що займають швидкість, написані на C / C ++, все ще цікаве дослідження проблем використання мови високого рівня (Python) в іграх.
Хакан Деріал

Однак пам’ятайте, що продуктивність у багатокористувацьких іграх на сервері вимірюється дещо різними показниками щодо ефективності в іграх на стороні одного клієнта - перші стосуються пропускної здатності, а останніх - затримки.
Килотан

Так, це правда, але ця битва включає 2000+ кораблів на екрані, з 2000+ снарядами (ракетами, анімацією), вибухами тощо, що вимагає важкої графічної продуктивності. У будь-якому випадку, дякую за детальну відповідь, це все ще відповідає дійсності.
Хакан Деріал

1
Якщо ви думаєте, що синтаксис C & Java є однаковим і тому має певне відношення до продуктивності, ви насправді не розумієте, що відбувається. Як C, можливо, може вирішити під час виконання, що дана функція викликається одними і тими ж параметрами повторно і замінює весь виклик функції постійним, зберігаючи виклик функції, коли є відхилення в параметрах? Я не кажу, що час виконання завжди кращий або завжди гірший, тільки що він не має відношення до синтаксису!
Білл К

1
@BillK - у вас, здається, є нечитання. Я згадав синтаксис лише з посиланням на "продуктивність", а не на "продуктивність". Це правда, що оптимізація JIT може теоретично зробити Java швидшою, але це не відбувається на практиці, принаймні, не в ігровому програмному забезпеченні.
Kylotan

12

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


5
а потім для версії для Mac вони заносять всю річ всередині модифікованої віртуальної машини Wine. Але все ж швидше, ніж це було б у прямому Яві, я думаю :-)
Ben Gotow

10
Вино не є віртуальною машиною, це бібліотека часу виконання, яка імітує поведінку бібліотек часу виконання Windows. Звідси і назва (вино не є емулятором).
Nate CK

2
Це дуже часто зустрічається в іграх, досить часто логіка, яка не є критичною за часом, пишеться якоюсь мовою сценаріїв, як правило, луа або пітон.
KSchmidt

Це не ванільна моно, хоча. EA потребував спеціальної команди, яка працює над власним користувальницьким CLR штатним робочим часом, щоб він працював.
Crashworks

4
Лише збоку зауважимо, що Sims 3 відомий тим, що не працює на відмінних комп'ютерах.
Lotus Notes

12
  • Чи є хороші порти ігрових двигунів / бібліотек?
  • Багато розробників C / C ++, особливо ті, хто працює в Windows (де написано більшість комерційних ігор), знайомі з Visual Studio. Не існує порівняння в IDE.
  • Взагалі, Java продається підприємствам через суцільне введення тексту, і вона має уявлення про відсутність проблем із управлінням пам'яттю.
  • І так, Java все ще страждає від уявлення про те, що вона повільна, і керування пам’яттю є поганим, а для ігор, мабуть, погано відповідає завданням. Як зазначено в деяких інших відповідях, збирання сміття просто не збирається знижувати його, коли ви маєте справу з високими показниками ефективності в реальному часі. Відеоігри підштовхують процесори та графічні процесори до своїх меж.

1
+1 для жирного тексту. Люди, здається, не усвідомлюють, що коли ваша гра працює на 20 кадрів в секунду, вона часто пов'язана з обладнанням у 20 кадрів в секунду. Дуже хочеться отримати 30+ кадрів в секунду .. але це не може.
GuiSim

Я не думаю, що це просто GC, що є проблемою продуктивності, хоча ... навіть навіть не в поєднанні з фазою повільного запуску ... це загальні проблеми продуктивності, але це тільки я.
rogerdpack

2
Я думаю, що на даний момент я швидше погоджуюся, ніж раніше. Оптимізація СВМ покращилась; однак, з огляду на покращення продуктивності таких мов, як JavaScript та інші, продуктивність Java порівняно досить невиправдана. Є багато апологетів для виконання Java. (але в кінцевому підсумку все, що має значення) '
cgp

10

Одна з найбільших причин, що Java та інші мови віртуальної машини не використовуються для ігор, пов’язані зі збиранням сміття. Те саме стосується .NET. Збір сміття пройшов довгий шлях і чудово працює у більшості типів застосувань. Для того, щоб зробити сміття, вам потрібно зробити паузу та перервати додаток, щоб зібрати сміття. Це може спричинити періодичне відставання, коли відбувається збір.

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

Справа не в тому, що Java повільна. Це те, що Java не дуже добре справляється із завданнями в режимі реального часу.


1
Однак ви можете написати власний планувальник для збирання сміття, якщо ви збираєтеся зайти так далеко, щоб перенести Java в нове середовище. Пам'ять має бути відтворена в будь-якому випадку, і в режимі реального часу у вас може бути вибір, коли запланувати свій gc ... кращий з обох світів. Мені потрібно повернутися до того, що не так багато причин переносити Java на архітектуру, щоб робити те, що ти хочеш, коли C / C ++ вже робить це для тебе. Ява сяє в інших місцях.
San Jacinto

5
Це не 1990-ті. Збирачі сміття досить добре зараз, коли налаштовані на невелику паузу.
Том Хотін - тайклін

8

Великою причиною є те, що для відеоігор потрібні прямі знання апаратних засобів, які часто знаходяться під ними, часто, і справді немає великої реалізації для багатьох архітектур. Саме знання основної апаратної архітектури дозволяє розробникам вичавити кожну унцію продуктивності з ігрової системи. Чому б ви витратили час, щоб перенести Java на ігрову платформу, а потім написати гру над цим портом, коли ви могли просто написати гру?

редагувати: це означає, що це більше, ніж "швидкість" або "не мають потрібних бібліотек". Ці дві речі йдуть на руку з цим, але це більше питання "як я змушую систему, як клітина запускати свій код java? Насправді немає хороших компіляторів Java, які могли б керувати трубопроводами та векторами" як мені потрібно .. "


7

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

Впевнені, що можуть бути якісь ігри .NET (які з них? Мені цікаво. Чи є справді інтенсивні CPU / GPU?), Але я думаю, що це більше, тому що багато людей є фахівцями в галузі MS-технологій і слідкують за Microsoft при запуску їх нова технологія.

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


3
"крос-платформа просто не має на увазі компаній, що працюють з відеоіграми" - Тому я повністю поважаю компанії, які займаються цим. :)
Саша Чедігов

Я безумовно вдячний Carmack за те, що він настільки відданий як кросплатформі, так і відкритому коду. Я просто заявив, що думає більшість компаній.
Ксемпак

1
Це правда. Ви не бачите багато популярних відеоігор, перенесених у Linux. :(
Саша Чедигов

Крос-платформа - це не просто кросова ОС. Подумайте про PS3, Xbox 360, Wii.
JulianR

"вони не збираються витрачати свій час на віртуальну машину." en.wikipedia.org/wiki/Quake_III_Arena#Virtual_machine , Carmack створив власну для логіки гри.
Джеймс Макмахон

4

Ви можете запитати, чому веб-додатки теж не записуються на C або C ++. Сила Java полягає в її мережевому стеку та об'єктно-орієнтованому дизайні. Звичайно, це має і C, і C ++. Але на нижній абстракції. Це нічого негативного, але ви не хочете кожен раз винаходити колесо, чи не так?

Java також не має прямого апаратного доступу, а це означає, що ви застрягли з API будь-яких рамок.


Java може зателефонувати до коду через "JNI"
Барт ван Хекелом

4
... і втрачайте портативність, поки ви на цьому!
LiraNuna

1
Ви дійсно не втрачаєте великої портативності, використовуючи JNI. За умови, що ви все ще можете компілювати нативну бібліотеку на платформах, які ви хочете підтримувати, це в основному означає, що вам потрібно лише перенести / перекомпілювати 1% свого коду, а не весь. Ви все ще отримаєте велику користь від переносимості Java.
bgroenks

4

Помилковим уявленням про продуктивність та поганими оптимізаціями JVM можна було б припустити. Я кажу про помилки щодо продуктивності, оскільки є деякі Java-порти ігор C ++, які працюють швидше, ніж їхні C ++ (див. Джейк 2). Справжня проблема, IMHO, полягає в тому, що багато Java-програмістів не так зосереджені на ефективності кровоточивості, як на простоті використання та зрозумілості / ремонтопридатності коду. Що стосується C / C ++ сторони речей, які ви, по суті, кодуєте мовою збірки дещо вищого рівня та її приблизно наближеною до апаратних засобів, яку ви можете отримати, не записуючи в збірку або прямого машинного коду.


Якщо це "приблизно так близько до обладнання, яке ви можете отримати без написання в збірці", Java не зможе його перемогти, якщо тільки ваше кодування не буде жахливим. Чим ближче ви підходите до обладнання, тим швидше ви зможете отримати доступ.
Джош Джонсон

4

Список ігрових двигунів у Вікіпедії перелічує багато ігрових двигунів разом з мовою програмування, якою вони написані.

Перелічено кілька ігрових двигунів Java.

Клацнувши на деяких посиланнях, ви перейдете до прикладів ігор та демонстраційних програм, написаних на Java. Ось пара:

Для певних ігор та ситуацій можливі компроміси на Java.


Я знаю, що існують ігри , написані на Java. Але крім Minecraft та Runescape, для платформи Java написано дуже мало комерційних ігор. Скільки назв AAA було написано на Java? І чому так мало? Звідси моє запитання.
Саша Чедигов

3

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

(... особисто я також думаю, що у них з'явилася нога, коли мова йде про магію між DirectX та .NET)


2
  1. Java повільна, більшість важких підйомів не обробляється GPU. Ще є анімація, фізика та AI, які вражають процесор, і все це забирає багато часу.

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

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

  4. Чужий пункт про проміжне програмне забезпечення вище був хорошим, тому я додаю це до своєї відповіді. Існує багато застарілого коду та програмного забезпечення, написаного спеціально для зв'язку з C / C ++, і останнє, що я перевірив, Java не має хорошої сумісності. Використання Java для більшості компаній передбачає викидання великої кількості коду, значна частина яких оплачена так чи інакше.


3
Ви можете використовувати JavaCL, JOCL або APARAPI, щоб завантажити багато цього в GPU.
bgroenks

2

Насправді, за керованим кодом дуже можливо робити 3d ігри, проблема - це задні двигуни. З .Net протягом короткого періоду з'явилася обгортка Managed DirectX для DirectX 9 від Microsoft. Це було до абстракції, яка зараз є XNA.

Отримавши повний доступ до apx DirectX, ігри .Net - це задоволення. Найкращий приклад, про який я знаю, - це www.entombed.co.uk, написаний у VB.Net.

На жаль, з боку Java це серйозно не вистачає - головним чином з тієї причини, що DirectX недоступний для Java, а ігрові програмісти знають і розуміють програму DirectX api - навіщо вивчати ще один api, коли ви повернетесь до DirectX?


2

Ігровий маркетинг - це комерційний процес; видавці хочуть оцінити рентабельність низьких ризиків від своїх інвестицій. Як наслідок, акцент робиться, як правило, на технологічних приладах (за винятком), які споживачі купуватимуть для отримання надійної віддачі - це, як правило, поверхневі візуальні ефекти, такі як відблиски лінз або більша роздільна здатність. Ці ефекти є надійними, оскільки вони просто використовують збільшення процесорної потужності - вони експлуатують апаратне забезпечення / Закон Мура збільшується. це означає використання C / C ++ - java, як правило, занадто абстрагується від обладнання, щоб використовувати ці переваги.


1

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

PS3 має java, через підтримку синього променя. Перевірте сайт bd-j.


1

Навіть ігри, написані на платформі .Net, часто дуже оптимізовані для такої швидкості, як прямий доступ до пам'яті та шини. .Net дозволяє використовувати C / C ++ та змішувати його з мовами вищого рівня, такими як C #.

Студії розвитку ігор часто співпрацюють з постачальниками апаратних засобів, які забезпечують доступ до інтерфейсів своїх продуктів на низькому рівні. Це світ, де вам потрібно використовувати ASM та C для зв'язку пристроїв. Віртуальне середовище сповільнить ці програмні частини.

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


1

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

Хочеться додати одне, що важко виводити противні хитрощі DRM через віртуальну машину.

Також я думаю, що є компонент hubris, де керівники проектів думають, що вони можуть зробити стабільний / надійний код із C ++ з усіма перевагами, як, наприклад, абсолютний контроль над своїми інструментами та ресурсами, АЛЕ без усіх негативів, які ускладнюють і пригнічують конкуренцію, тому що "ми" re розумніші, ніж вони ".


0

Runescape by 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, не було б жодного комп’ютера в цьому світі, який міг би впоратися з цим ... + Збір сміття працює нормально для віджетів, які щойно знищили зображення але це все ще є кешоване там і його потрібно прибрати, але не для ігор, напевно, у вас буде ще більше відставань від кожної активації збору сміття.

Edit : Тому що хто - то попросив статті, тут, я шукав в веб - архіві , щоб отримати це, я сподіваюся , що ви задоволені ... 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 зазвичай дуже роздутий, обробляючи винятки, зазвичай має застарілі бібліотеки. (Добре це робиться в основному лише на стороні сервера, але решта ...) та часто застаріла документація.
Ліліан А. Морару
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.