Dlaczego tylko kilka gier wideo jest napisanych w języku Java? [Zamknięte]


171

Dlaczego wiele komercyjnych gier wideo 3D (a nie losowych gier 2D typu open source) nie jest napisanych w języku Java? W teorii ma to wiele sensu: dostajesz wzrost produktywności i aplikację wieloplatformową prawie za darmo, między innymi, taką jak ogromna liczba bibliotek Java i wbudowane czyszczenie pamięci (chociaż przyznaję, że ' nie jestem pewien, czy to drugie jest dobre). Dlaczego więc jest rzadko używany? Przychodzi mi na myśl tylko kilka popularnych gier komercyjnych napisanych na platformę Java.

Czy to z powodu wydajności? Jeśli tak, to czy i tak większość ciężkiego podnoszenia nie zostałaby wykonana przez GPU?



1
Re: mmyers; Jestem trochę w szoku, że TA gra zdobyła nagrodę za "najlepszą grafikę", nawet w 2005 roku ...
CloudyMusic

2
Tak, ale większość „prawdziwych gier” nie jest tworzona w zarządzanej witrynie .net, prawda? Są wykonane w starej szkole c / c ++?
Hardwareguy

14
Runescape jest napisany w języku java.
GameFreak

44
Minecraft jest napisany w Javie!
daGrevis

Odpowiedzi:


155

Świat tworzenia gier jest zabawny: z jednej strony często szybko akceptują nowe pomysły, z drugiej strony wciąż są w epoce kamienia łupanego.

Prawda jest taka, że ​​rzadko istnieje taka zachęta do przejścia na .NET / Java / cokolwiek innego niż C / C ++.

Większość firm produkujących gry licencjonuje części silnika gry od innych firm. Te części są napisane w C ++ i chociaż możesz mieć dostęp do źródła, aby móc je przenieść, wymaga to dużo wysiłku (i oczywiście licencja musi na to zezwolić).

Ponadto wiele starszego kodu istnieje już w C ++. Jeśli kod z poprzednich projektów można ponownie wykorzystać (powiedzmy, jeśli piszesz sequel), liczy się to jeszcze bardziej na korzyść trzymania się tego samego języka, zamiast przepisywania go w nowym języku (tym bardziej, że prawdopodobnie ponownie wprowadzisz mnóstwo błędów, które będziesz musiał poświęcić na ich naprawianie.

Wreszcie, i tak rzadko zdarza się, aby gry były pisane w 100% C ++ - wiele się robi przy użyciu języków skryptowych, niezależnie od tego, czy są one niestandardowe, czy po prostu integrują istniejące języki (Lua jest obecnie jednym z bardziej popularnych).

Jeśli chodzi o odśmiecanie, może to być trochę problem. Problem nie polega na tym, że istnieje, chodzi raczej o to, jak to działa - garbage collector MUSI być nieblokujący (lub przynajmniej mieć gwarancję, że blokuje się tylko na bardzo krótko), ponieważ po prostu niedopuszczalne jest zawieszanie gry na 10 sekund, podczas gdy skanuje całą przydzieloną pamięć, aby zobaczyć, co można zwolnić. Wiem, że Java ma tendencję do dławienia się podczas GC, gdy kończy się pamięć (aw przypadku niektórych gier tak się stanie).

Jesteś również nieco bardziej ograniczony w tym, co możesz zrobić: nie możesz w pełni wykorzystać sprzętu z powodu narzutu czasu wykonania. Wyobraź sobie, że Crysis jest napisany w Javie ... nawet jeśli to jedyna widoczna różnica, po prostu nie byłaby taka sama (jestem również pewien, że do uruchomienia potrzebny byłby Core i7).

Nie oznacza to, że te języki nie mają swojego miejsca w tworzeniu gier - i nie, nie mówię tylko o programowaniu narzędzi. W przypadku większości gier nie potrzebujesz dodatkowej wydajności, jaką zapewnia C ++, w tym gry 3D, a jeśli piszesz wszystko od zera, może mieć sens użycie czegoś takiego jak XNA - w rzeczywistości istnieje duża szansa, że ​​tak się stanie.

Jeśli chodzi o gry komercyjne - czy RuneScape się liczy? To może być najbardziej udana gra Java na świecie.


16
Oczywiście nie uruchomiłbyś Crysisa na JVM; do diabła, gdybyś zakodował tę grę w języku asemblera, nadal potrzebujesz superkomputera, aby uruchomić ją na pełnych ustawieniach. Ale +1 za doskonały wgląd, dziękuję.
Sasha Chedygov

15
Nie możesz porównać Unreal Tournament 3 lub Crysis z Runescape. Jeśli zależy Ci na jakości grafiki, musisz trzymać się języka niskiego poziomu z jak najmniejszym narzutem. Oczywiście dla Indy lub gier, w których grafika nie jest głównym punktem sprzedaży, Java jest doskonałą alternatywą dla C / C ++.
GuiSim

6
@GuiSim: W przypadku większości gier jakość grafiki NIE jest głównym punktem sprzedaży. Jest tylko kilka gier, o których mogę pomyśleć, które zostały stworzone z myślą o grafice (myślę o Crysisie, ale w tamtym czasie też o Half-Life 2). Wydaje mi się, że większość twórców gier nie interesuje się tak bardzo grafiką, o ile są one „wystarczająco dobre” (podobnie jak większość innych gier).
Sasha Chedygov

4
Grafika naprawdę ma niewiele wspólnego z językiem. Fizyka, sztuczna inteligencja, tak. Grafika, nie.
JulianR

10
@JulianR przygotowanie i utrzymanie sceny w celu wydajnego renderowania może wymagać dużego nakładu pracy, więc język i związany z nim narzut językowy mają znaczenie dla grafiki.
KSchmidt

95

Myślę, że John Carmack powiedział to najlepiej z:

Największym problemem jest to, że Java działa bardzo wolno. Na czystym poziomie procesora / pamięci / wyświetlacza / komunikacji większość nowoczesnych telefonów komórkowych powinna być znacznie lepszymi platformami do gier niż Game Boy Advanced. Dzięki Javie w większości telefonów masz mniej więcej moc procesora oryginalnego IBM PC 4,77 MHz i kiepską kontrolę nad wszystkim. [... snip ...] Napisz-raz-uruchom-gdziekolwiek. Ha. Hahahahaha. Obecnie testujemy tylko na czterech platformach i żadna para nie ma takich samych dziwactw. Wszystkie gry komercyjne są modyfikowane i kompilowane indywidualnie dla każdej (często ponad 100) platform. Przenośność nie jest usprawiedliwieniem dla okropnej wydajności.

( źródło )

To prawda, mówił o platformach mobilnych, ale znalazłem podobne problemy z Javą jako całością wywodzącą się z C ++. Brakuje mi możliwości przydzielania pamięci w stosie / stercie na własnych warunkach.


60
Ten cytat pochodzi z 2005 r. Zarówno technologia Java, jak i moc telefonów komórkowych znacznie się poprawiły od tego czasu. Porównanie gier na telefon komórkowy z grami na komputerze to porównanie jabłek do pomarańczy.
Chris Dail

78
John Carmack to powiedział. Sprawa zamknięta.
GuiSim

41
Po prostu czuję się nieswojo, kiedy czytam „Java jest naprawdę wolna”. To tak, jakby powiedzieć, że samochód sportowy za 50 000 USD jest wolny w porównaniu do samochodu sportowego za 100 000 USD. Jasne, jest wolniejszy, ale w 90% przypadków praca, którą wykonuje, jest nadal świetna i za połowę ceny;) Nie planowano wojny z płomieniami. Zgadzam się, że powyższe powody są powodem, dla którego Crysis i podobne gry nie są napisane w Javie.
Ross

17
@Chris Dail, to podkreśla cały problem z wydajnością Java. Czy poprawiła się wydajność Java? Nie, telefony komórkowe właśnie stały się szybsze. Gry mają przesuwać granice realizmu, a zatem przekraczać granice sprzętu, a odrzucanie 30-% 40 wydajności, zanim jeszcze napiszesz linię kodu, jest nie do przyjęcia.
cgp

8
Uważam ten spór za bardzo dziwny. Java ME to nie to samo, co Java w systemie Android, a także nie to samo, co Java na komputerach PC. Java ME zwykle polegała na producentach telefonów przy opracowywaniu maszyny JVM. Niektórzy odwalili kawał dobrej roboty, inni nie. Nic dziwnego, że Carmack narzekał na nich. Android ma własną maszynę wirtualną, która nie jest maszyną JVM. I ma kilka poważnych problemów (z mojego punktu widzenia). Oracle HotSpot VM różni się całkowicie od obu przypadków. Jeśli ludzie porównają te wszystkie rzeczy, jedyne, co mogę stwierdzić, to to, że nie wiedzą, o czym mówią.
Malcolm,

54

Po pierwsze, brak przeciążenia operatorów w Javie sprawia, że ​​cała matematyka, z jaką musisz się uporać, aby uzyskać działający potok graficzny, jest bardzo, bardzo denerwująca i trudna do odczytania.

Wszystkie mnożenia macierzy i wektory afiniczne, z którymi musisz sobie poradzić, są o wiele łatwiejsze do zrozumienia, jeśli są w dobrze sformułowanych wyrażeniach matematycznych, a nie w wyrażeniach zorientowanych obiektowo, takich jak

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

To po prostu straszne. Matematyka nie powinna tak wyglądać.


19
Pamiętam, że w 1996 roku, jak sądzę, niektórzy projektanci z Sun prowadzili prezentację o Javie w Berkeley. William Kahan ( en.wikipedia.org/wiki/William_Kahan ) robił im gówno na ten temat. :)
JP Alioto

13
Myślę, że jest dobry powód, aby nie dopuścić do przeciążenia operatora w języku: aby ludzie nie używali go. jest to potężne narzędzie i bardzo fajne do matematyki, ale jest niebezpieczne dla wszystkiego innego. Jakkolwiek koderzy są leniwi, zwykle nie używają go do skracania kodu, a w momencie, gdy ludzie zaczynają wykonywać mapę mnożąc iterowalną funkcję z funkcją, lub nawet gdy wszystkie operacje arytmetyczne są zdefiniowane dla funkcji, czytelność kodu osiągnie 0 i tak, spędziłem dużo czasu na przenoszeniu kodu w ten sposób. : -S to wybór projektu. a wybory projektowe zawsze są dyskusyjne.
back2dos

19
Ukarać wszystkich za kilka złych jabłek? Jest to jeden z powodów, dla których wolę C #. Jeśli naprawdę potrzebuję przeciążenia operatora, to jest.
ChaosPandion

1
Zasadniczo przeciążanie operatorów jest naprawdę odpowiednie tylko w 2-3 różnych sytuacjach w projektowaniu OOP (wektory, macierze, liczby zespolone). W większości innych sytuacji jest on zbyt luźno zdefiniowany i prowadzi jedynie do niechlujnego kodu, słabej składni i słabej dokumentacji, nawet od osób, które wiedzą, jak z niego korzystać. Myślę, że dlatego Sun zdecydował się nie używać go w Javie i myślę, że to słuszna decyzja.
bgroenks

1
@MMJZ: Co mają wspólnego wyrażenia lambda z przeciążaniem operatorów?
Sasha Chedygov

26

Myślę, że .NET miał (ma) wiele takich samych postrzeganych problemów, jak Java. Microsoft właśnie wykonał lepszą robotę w marketingu programistów za pomocą XNA :-)


10
XNA umożliwia również wdrażanie aplikacji .NET na XBox. Nie widziałem nic tak płynnego dla Javy.
StriplingWarrior

Możesz również wdrożyć się do Zune.
cbeuker

Trochę starsze pytanie, ale tylko po to, aby zaktualizować, możesz teraz pisać gry XNA również na Windows Phone :-)
Joel Martinez

3
@JoelMartinez kolejna aktualizacja: nie można pisać gier XNA na Windows Phone 8.
Tomas Andrle

@TomA Możliwe jest teraz pisanie gier typu monogame na WP8
Alex Lapa.

17

Drobne punkty najpierw:

  • jakikolwiek wzrost produktywności z Java jest hipotetyczny. Składnia jest prawie identyczna jak w C ++, więc tak naprawdę liczy się tylko na oszczędności wynikające z zarządzania pamięcią i standardowych bibliotek. Biblioteki mają niewiele do zaoferowania twórcom gier, a zarządzanie pamięcią jest spornym problemem ze względu na zbieranie śmieci.

  • międzyplatformowe „za darmo” nie jest tak dobre, jak myślisz, ponieważ niewielu programistów chce używać OpenGL, a kilka kluczowych platform prawdopodobnie nie ma dobrej implementacji Java lub opakowań dla ich natywnych bibliotek, czy to do grafiki, audio, sieci itp.

Ale przede wszystkim chodzi o kompatybilność wsteczną. Twórcy gier przeszli do C ++ z C i do C z asemblera wyłącznie dlatego, że trasa migracji była płynna. Każdy z nich ściśle współpracuje z poprzednim, a cały ich poprzedni kod był możliwy do wykorzystania w nowym języku, często za pośrednictwem jednego kompilatora. Dlatego migracja przebiegała tak wolno lub tak szybko, jak chcesz. Na przykład niektóre z naszych starych nagłówków, które są obecnie używane, nadal mają #ifdef WATCOMCin, i nie sądzę, aby ktokolwiek używał tutaj kompilatora Watcom od dekady lub więcej. Stary kod wymaga ogromnych inwestycji, a każdy bit jest wymieniany tylko w razie potrzeby. Ten proces zastępowania i ulepszania bitów i elementów z jednej gry do następnej nie jest tak praktyczny, jeśli zmienisz język na język, który nie współpracuje natywnie z istniejącym kodem. Tak, interoperacyjność C ++ / Java jest możliwa, ale bardzo niepraktyczna w porównaniu do prostego pisania „C z odrobiną C ++” lub osadzania bloków asm w C.

Aby właściwie zastąpić C ++ jako język wybrany przez twórców gier, musi zrobić jedną z dwóch rzeczy:

  1. Łatwo współdziałaj z istniejącym kodem, zachowując w ten sposób inwestycje i zachowując dostęp do istniejących bibliotek i narzędzi LUB
  2. W oczywisty sposób pokaż na tyle z góry, że wzrost produktywności jest wystarczający, że koszt przepisania całego własnego kodu (lub przeróbki interfejsów na komponenty wielokrotnego użytku, które mogą być używane z tego języka) jest więcej niż pokryty.

Subiektywnie uważam, że Java nie spełnia żadnego z nich. Język wyższego poziomu może spotkać się z drugim, jeśli ktoś jest na tyle odważny, aby być pionierem. (EVE Online jest prawdopodobnie najlepszym przykładem użyteczności Pythona, który wykorzystuje rozwidlenie głównego języka Python, wiele komponentów C ++ do zwiększenia wydajności, a nawet to jest dla dość mało wymagającej gry w nowoczesnych terminach.)


Chciałem tylko dodać, że EVE Online to `` internetowa '' symulacja kosmiczna, w której powszechne są bitwy między graczami 1000 vs 1000, co można zaliczyć jako wymagający scenariusz pod względem wydajności. Chociaż jego części wymagające dużej szybkości są napisane w C / C ++, nadal jest to interesujące badanie dotyczące wyzwań związanych z używaniem języka wysokiego poziomu (Python) w grach.
Hakan Deryal,

Należy jednak pamiętać, że wydajność w grach dla wielu graczy po stronie serwera jest mierzona za pomocą nieco innych wskaźników niż w grach jednoosobowych po stronie klienta - ta pierwsza dotyczy przepustowości, a druga opóźnień.
Kylotan,

Tak, to prawda, ale bitwy obejmują ponad 2000 statków na ekranie, ponad 2000 pocisków (pociski, animacje), eksplozje itp., Które wymagają dużej wydajności graficznej. W każdym razie, dzięki za szczegółową odpowiedź, nadal jest prawdą.
Hakan Deryal,

1
Jeśli myślisz, że składnia C i Java jest taka sama, a zatem ma to jakiś związek z wydajnością, naprawdę nie rozumiesz, co się dzieje. W jaki sposób C może zdecydować w czasie wykonywania, że ​​dana funkcja jest wywoływana wielokrotnie z tymi samymi parametrami i zastąpić całe wywołanie funkcji stałą, zachowując wywołanie funkcji, gdy występuje odchylenie parametrów? Nie mówię, że środowisko wykonawcze jest zawsze lepsze lub gorsze, po prostu nie ma żadnego związku ze składnią!
Bill K

1
@BillK - wydaje się, że źle odczytałeś. Wspomniałem o składni tylko w odniesieniu do „produktywności”, a nie „wydajności”. To prawda, że ​​optymalizacje JIT mogą teoretycznie przyspieszyć Javę, ale w praktyce tak się nie dzieje, przynajmniej nie w oprogramowaniu do gier.
Kylotan

12

Gram w The Sims 3 i trochę poszperałem. Silnik graficzny to C ++, a silnik skryptów i zachowania to C # / Mono. Tak więc, podczas gdy C ++ jest dostępny dla bitów krytycznych czasowo, inne rzeczy, takie jak interakcja, logika gry, sztuczna inteligencja są w języku zarządzanym obiektowo.


5
a następnie w wersji na Maca włożyli całość do zmodyfikowanej maszyny wirtualnej Wine. Myślę, że jeszcze szybciej niż
Ben Gotow

10
Wine nie jest maszyną wirtualną, jest biblioteką wykonawczą, która naśladuje zachowanie bibliotek wykonawczych systemu Windows. Stąd nazwa (Wino nie jest emulatorem).
Nate CK

2
Jest to bardzo powszechne w grach, dość często logika, która nie jest krytyczna czasowo, jest napisana w jakimś języku skryptowym, zwykle lua lub python.
KSchmidt

Ale to nie jest waniliowe Mono. EA potrzebowało specjalnego zespołu pracującego w pełnym wymiarze godzin nad własnym, niestandardowym środowiskiem CLR, aby to działało.
Crashworks

4
Na marginesie uwaga, gra The Sims 3 jest notorycznie gorsza nawet na doskonałych komputerach.
Lotus Notes

12
  • Czy są jakieś dobre porty silników / bibliotek gier?
  • Wielu programistów C / C ++, szczególnie ci na Windows (gdzie napisana jest większość gier komercyjnych), zna Visual Studio. W IDE nie ma porównania.
  • Ogólnie rzecz biorąc, Java została sprzedana firmom ze względu na solidne pisanie i ma wrażenie, że nie ma problemów z zarządzaniem pamięcią.
  • I tak, Java nadal cierpi z powodu wrażenia, że ​​jest powolna, a jej zarządzanie pamięcią jest słabe, a w przypadku gier prawdopodobnie nie nadaje się do tego zadania. Jak stwierdzono w niektórych innych odpowiedziach, wyrzucanie elementów bezużytecznych po prostu nie wystarczy, gdy masz do czynienia z wymaganiami dotyczącymi wysokiej wydajności w czasie rzeczywistym. Gry wideo przekraczają granice możliwości procesorów i układów GPU.

1
+1 za pogrubiony tekst. Wydaje się, że ludzie nie zdają sobie sprawy z tego, że gdy twoja gra działa z prędkością 20 fps, często jest to sprzęt związany z 20 fps. Naprawdę chce osiągnąć 30+ fps ... ale nie może.
GuiSim

Nie sądzę, że to tylko GC jest problemem pod względem wydajności ... ani nawet w połączeniu z powolną fazą uruchamiania ... to ogólne problemy z wydajnością, ale to tylko ja.
rogerdpack

2
Myślę, że w tym momencie bardziej się zgodzę niż w przeszłości. Poprawiła się optymalizacja JVM; Jednak w świetle ulepszeń wydajności w językach luźno pisanych, takich jak JavaScript i inne, wydajność Javy w porównaniu z nimi jest raczej niewybaczalna. Jest wielu apologetów wydajności Javy. (ale ostatecznie postrzegana wydajność jest wszystkim, co się
liczy

10

Jednym z największych powodów, dla których Java i inne języki maszyn wirtualnych nie są używane w grach, jest Garbage Collection. To samo dotyczy .NET. Zbieranie śmieci przeszło długą drogę i działa świetnie w większości typów aplikacji. Aby jednak wyczyścić śmieci, musisz wstrzymać i przerwać aplikację, aby zebrać śmieci. Może to powodować okresowe opóźnienia podczas zbierania.

Java ma ten sam problem z aplikacjami czasu rzeczywistego. Gdy zadania muszą być uruchamiane w określonym czasie, trudno jest mieć zautomatyzowane zadanie, takie jak czyszczenie pamięci, które to uszanuje.

Nie chodzi o to, że Java jest powolna. Chodzi o to, że Java nie radzi sobie dobrze z zadaniami w czasie rzeczywistym.


1
Możesz jednak napisać własny harmonogram dla garbage collectora, jeśli masz zamiar posunąć się do przeniesienia Javy do nowego środowiska. Pamięć musi zostać odzyskana tak czy inaczej, aw środowisku czasu rzeczywistego możesz mieć opcję, kiedy zaplanować gc ... najlepsze z obu światów. Muszę wrócić do punktu, w którym nie ma powodu, aby przenosić Javę na architekturę, aby robić to, co chcesz, kiedy C / C ++ już robi to za Ciebie. Java błyszczy w innych miejscach.
San Jacinto

5
To nie są lata 90. Zbieracze śmieci są teraz całkiem nieźli, gdy są nastawieni na małą pauzę.
Tom Hawtin - tackline

8

Dużym powodem jest to, że gry wideo często wymagają bezpośredniej wiedzy na temat sprzętu znajdującego się pod spodem, i tak naprawdę nie ma doskonałej implementacji dla wielu architektur. To znajomość podstawowej architektury sprzętowej pozwala programistom wycisnąć z systemu do gier każdą uncję wydajności. Dlaczego miałbyś poświęcić czas na przeniesienie Javy na platformę do gier, a następnie napisać grę na tym porcie, skoro można po prostu napisać grę?

edit: to znaczy, że jest to coś więcej niż kwestia „szybkości” lub „braku odpowiednich bibliotek”. Te dwie rzeczy idą w parze z tym, ale bardziej jest to kwestia tego, „jak sprawić, by system taki jak komórka uruchamiał mój kod java? Tak naprawdę nie ma żadnych dobrych kompilatorów java, które mogłyby zarządzać potokami i wektorami tak jak potrzebuję… ”


7

Problem z wydajnością jest pierwszym powodem. Kiedy zobaczysz rodzaj hiperoptymalizowanego kodu C ++, który znajduje się w silnikach Quake ( http://www.codemaestro.com/reviews/9 ), wiesz, że nie będą tracić czasu na maszynę wirtualną.

Pewnie, że mogą istnieć gry .NET (które? Jestem zainteresowany. Czy są jakieś gry mocno obciążające procesor / GPU?), Ale wydaje mi się, że jest to więcej, ponieważ wiele osób jest ekspertami w technologiach MS i podążało za Microsoftem po uruchomieniu ich nowa technologia.

Aha, firmy zajmujące się grami wideo po prostu nie myślą o wielu platformach. Linux to tylko około 1% rynku, Mac OS kilka% więcej. Zdecydowanie uważają, że nie warto porzucać technologii i bibliotek działających tylko w systemie Windows, takich jak DirectX.


3
„Firmy zajmujące się grami wideo po prostu nie myślą o wielu platformach” - dlatego w pełni szanuję firmy, które to robią. :)
Sasha Chedygov

Jestem zdecydowanie wdzięczny Carmack za to, że jestem tak zaangażowany zarówno w cross-platform, jak i open-source. Po prostu powiedziałem, co myśli większość firm.
Ksempac

1
To prawda. Nie widzisz wielu popularnych gier wideo przeniesionych na Linuksa. :(
Sasha Chedygov

Wieloplatformowość to nie tylko wiele systemów operacyjnych. Pomyśl o PS3, Xbox 360, Wii.
JulianR

„nie będą tracić czasu na maszynę wirtualną”. en.wikipedia.org/wiki/Quake_III_Arena#Virtual_machine , Carmack stworzył własną logikę gry.
James McMahon

4

Możesz zapytać, dlaczego aplikacje internetowe nie są również napisane w C lub C ++. Siła Java polega na stosie sieciowym i projektowaniu obiektowym. Oczywiście C i C ++ też to mają. Ale na niższej abstrakcji. To nic negatywnego, ale nie chcesz za każdym razem odkrywać koła na nowo, prawda?

Java nie ma również bezpośredniego dostępu do sprzętu, co oznacza, że ​​utknąłeś z interfejsem API jakichkolwiek frameworków.


Java może wywoływać kod natywny przez „JNI”
Bart van Heukelom

4
... i stracić przenośność, gdy jesteś na tym!
LiraNuna

1
Używając JNI, naprawdę nie tracisz dużo przenośności. Zakładając, że nadal możesz skompilować natywne biblioteki na platformach, które chcesz obsługiwać, oznacza to po prostu, że musisz tylko przenieść / ponownie skompilować tylko 1% swojego kodu, a nie całość. Nadal możesz czerpać wiele korzyści z przenośności języka Java.
bgroenks

4

Domyślam się, że błędne przekonania dotyczące wydajności i słabych optymalizacji JVM. Mówię nieporozumienia na temat wydajności, ponieważ istnieją porty Java gier C ++, które działają szybciej niż ich odpowiedniki w C ++ (patrz Jake 2). Prawdziwym problemem, IMHO, jest to, że wielu programistów Java nie koncentruje się tak bardzo na wydajności, jak na łatwości użytkowania i zrozumiałości / konserwacji kodu. Po stronie C / C ++ rzeczy, które zasadniczo kodujesz w języku asemblera nieco wyższego poziomu i jest tak blisko sprzętu, jak to tylko możliwe, bez pisania w asemblerze lub prostym kodzie maszynowym.


Jeśli jest „tak blisko sprzętu, jak tylko można uzyskać bez pisania w asemblerze”, to Java nie będzie w stanie go pokonać, chyba że kodowanie jest okropne. Im bliżej sprzętu, tym szybciej będziesz w stanie się dostać.
Josh Johnson

4

Lista silników gier w Wikipedii zawiera wiele silników gier wraz z językiem programowania, w którym zostały napisane.

Na liście znajduje się kilka silników gier Java.

Kliknięcie niektórych linków prowadzi do przykładów gier i wersji demonstracyjnych napisanych w języku Java. Oto kilka:

W przypadku niektórych gier i sytuacji kompromisy w Javie mogą być dopuszczalne.


Wiem , że istnieją gry napisane w Javie. Ale oprócz Minecrafta i Runescape bardzo niewiele popularnych gier komercyjnych jest napisanych na platformę Java. Ile tytułów AAA zostało napisanych w Javie? A dlaczego tak mało? Stąd moje pytanie.
Sasha Chedygov

3

NET z pewnością ma te same problemy, co Java, jeśli chodzi o wysoką wydajność 3D. Microsoft zainwestował również dużo więcej czasu i pieniędzy w rozwój bibliotek, jeśli chodzi o pracę z ciężkimi operacjami 3D.

(... osobiście uważam też, że mieli przewagę, jeśli chodzi o magię między DirectX i .NET)


2
  1. Java jest powolna, większość ciężkiego podnoszenia nie jest obsługiwana przez procesor graficzny. Wciąż jest animacja, fizyka i sztuczna inteligencja uderzające w procesor, z których wszystkie są bardzo czasochłonne.

  2. Java nie istnieje na konsolach, a konsole są głównym celem gier komercyjnych. Jeśli używasz Javy na PC, eliminujesz możliwość przenoszenia się na konsole w rozsądnym czasie i budżecie.

  3. Wielu bardziej doświadczonych programistów w branży gier używało C i C ++ na długo przed upowszechnieniem się Java. Dwa powyższe punkty mogą się do tego przyczynić, ale spodziewam się, że wielu profesjonalnych programistów gier po prostu nie zna dobrze Javy.

  4. Ktoś inny na temat oprogramowania pośredniczącego powyżej był dobry, więc dodaję go do mojej odpowiedzi. Istnieje wiele starszego kodu i oprogramowania pośredniego napisanego specjalnie do łączenia z C / C ++, a ostatnio sprawdziłem, że Java nie ma dobrej interoperacyjności. Korzystanie z Javy przez większość firm wymagałoby wyrzucenia dużej ilości kodu, za który w dużej mierze zapłacono w taki czy inny sposób.


3
Możesz użyć JavaCL, JOCL lub APARAPI, aby przeładować dużą część tego na GPU.
bgroenks

2

W rzeczywistości jest bardzo możliwe, że kod zarządzany może wykonywać gry 3D, problemem są tylne silniki. W przypadku .Net przez krótki czas istniało opakowanie Managed DirectX do DirectX 9 firmy Microsoft. To było przed abstrakcją, która jest teraz XNA.

Mając pełny dostęp do interfejsów API DirectX, gry .Net działają wspaniale. Najlepszym przykładem, jaki znam, jest www.entombed.co.uk, który jest napisany w VB.Net.

Niestety, po stronie Javy poważnie go brakuje - głównie z tego powodu, że DirectX nie jest dostępny dla Javy, a programiści gier znają i rozumieją interfejs API DirectX - po co uczyć się kolejnego interfejsu API, skoro wrócisz do DirectX?


2

Marketing gier to proces komercyjny; wydawcom zależy na wymiernych zwrotach z inwestycji o niskim ryzyku. W rezultacie zwykle koncentruje się na sztuczkach technologicznych (z wyjątkami), które konsumenci kupują, aby uzyskać niezawodny zwrot - są to zazwyczaj powierzchowne efekty wizualne, takie jak odblask obiektywu lub wyższa rozdzielczość. Efekty te są niezawodne, ponieważ po prostu wykorzystują wzrost mocy obliczeniowej - wykorzystują sprzęt / wzrost prawa Moore'a. oznacza to używanie C / C ++ - java jest zwykle zbyt oderwana od sprzętu, aby wykorzystać te zalety.


1

Domyślam się, że szybkość nadal jest problemem. Wieloplatformowość będzie problemem, prawda, skoro nie wiesz, jaka karta 3D jest dostępna, kiedy piszesz kod? Czy Java ma coś do obsługi automatycznego wykrywania funkcji 3D? Sądzę, że istnieją narzędzia ułatwiające przenoszenie gry między Wii, Xbox i PS3, ale założę się, że są drogie.

PS3 ma Javę, dzięki obsłudze Blue Ray. Sprawdź witrynę bd-j.


1

Nawet gry napisane na platformie .Net są często wysoce zoptymalizowane pod kątem szybkości, na przykład bezpośredniego dostępu do pamięci i magistrali. .Net pozwala na używanie C / C ++ i mieszanie go z językami wyższego poziomu, takimi jak C #.

Studia tworzenia gier często współpracują blisko z dostawcami sprzętu, którzy zapewniają dostęp do niskopoziomowych interfejsów swoich produktów. To świat, w którym do komunikacji urządzeń trzeba używać ASM i C. Wirtualne środowisko spowolniłoby te części programu.

W każdym razie, współczesne gry 3D używają języków wyższego poziomu. Często znajdziesz logikę gry napisaną w językach takich jak Lua czy Python. Ale rdzeń (I / O, wątki, planowanie zadań) typowej gry 3D będzie napisany w językach niskiego poziomu przez następne 25 lat lub tak długo, jak urządzenia nie pozwolą same na abstrakcję i wirtualizację (co nadejdzie).


1

Zgadzam się z innymi postami dotyczącymi wykorzystania elementów istniejącej / licencjonowanej bazy kodu, wydajności itp.

Jedną z rzeczy, które chciałbym dodać, jest to, że trudno jest wykonywać paskudne sztuczki DRM za pośrednictwem maszyny wirtualnej.

Myślę też, że istnieje komponent pychy, w którym kierownicy projektów myślą, że mogą stworzyć stabilny / niezawodny kod w C ++ z wszystkimi korzyściami, takimi jak absolutna kontrola nad swoimi narzędziami i zasobami, ALE bez wszystkich negatywów, które komplikują i blokują ich konkurencję, ponieważ „my” są mądrzejsi niż oni ”.


0

Runescape by Jagex jest napisany w Javie, tag „gra wideo” może nie oznaczać, że jest grą online, ale ma przyzwoitą liczbę fanów.


Przepraszam, ale to wcale nie odpowiada na moje pytanie.
Sasha Chedygov

2
Ale ślepe sformułowanie pytania prowadzi do założenia, że ​​ŻADNE gry nie są napisane w Javie, wskazując tylko udany przypadek, w którym się znajduje.
Mark Schultheiss

0

Dużo o tym już mówiono, nawet na Wiki można znaleźć powody ...

  • C / C ++ dla silnika gry i wszystkich intensywnych rzeczy.
  • Lua lub Python do tworzenia skryptów w grze.
  • Java - bardzo, bardzo zła wydajność, duże zużycie pamięci + nie jest dostępna na konsolach do gier (jest używana w niektórych bardzo prostych grach (tak, Runescape się tutaj liczy, nie jest to Battlefield ani Crysis lub cokolwiek innego) tylko dlatego, że są wielu programistów znających ten język programowania).
  • C # - duże zużycie pamięci (jest używane w niektórych bardzo prostych grach tylko dlatego, że jest wielu programistów znających ten język programowania).

Słyszę coraz więcej programistów Javy, którzy próbują przekonać ludzi, że Java nie jest powolna, nie jest wolna przy rysowaniu widżetu na ekranie i rysowaniu na widżecie znaków ASCII, odbieraniu i wysyłaniu danych przez sieć (i tak jest zaleca się używanie go w tych przypadkach (manipulacja danymi sieciowymi) zamiast C / C ++) ... Ale jest cholernie powolny, jeśli chodzi o poważne rzeczy, takie jak obliczenia matematyczne, alokacja / manipulacja pamięcią i wiele innych dobrych rzeczy.

Pamiętam artykuł na stronie MIT, w którym pokazują, co C / C ++ może zrobić, jeśli używasz języka i funkcji kompilatora: mnożnik macierzy (2 macierze), 1 implementacja w Javie i 1 implementacja w C / C ++, z funkcjami C / C ++ i aktywowano odpowiednie optymalizacje kompilatora, implementacja C / C ++ była ~ 296 260 razy szybsza niż implementacja Java.

Mam nadzieję, że rozumiesz teraz, dlaczego ludzie używają C / C ++ zamiast Javy w grach, wyobraź sobie Crysis w Javie, nie byłoby na tym świecie żadnego komputera, który by sobie z tym poradził ... + Zbieranie śmieci działa dobrze dla Widżetów, które właśnie zniszczyły obraz ale nadal jest tam przechowywany w pamięci podręcznej i musi zostać wyczyszczony, ale nie dla gier, na pewno będziesz miał jeszcze więcej opóźnień przy każdej aktywacji czyszczenia pamięci.

Edycja : Ponieważ ktoś poprosił o artykuł, przeszukałem tutaj archiwum internetowe, aby go znaleźć, mam nadzieję, że jesteś zadowolony ... Studium przypadku MIT

I dodać, nie, Java do gier to wciąż okropny pomysł. Zaledwie kilka dni temu duża firma, której nie wymienię, zaczęła przerabiać swojego klienta gry z Java na C ++, ponieważ bardzo prosta gra (pod względem grafiki) była opóźniona i podgrzewała laptopy i7 z potężnymi kartami graficznymi nVidia GT 5xx i 6xx ( nie tylko nVidia, chodzi o to, że te potężne karty, które radzą sobie z ustawieniami Max w większości nowych gier i nie radzą sobie z tą grą), a zużycie pamięci wynosiło ~ 2,5 - 2,6 GB Ram. Do tak prostej grafiki potrzebna jest bestia z maszyny.


10
Niewiele wiesz o nowoczesnym środowisku wykonawczym Java i maszynie wirtualnej. Artykuł, o którym wspomniałeś, prawdopodobnie pochodzi sprzed dziesięciu lat lub więcej, oczywiście nikt nie może wiedzieć, ponieważ go nie zacytowałeś. Twoje postrzeganie języka Java jest przestarzałe.
bgroenks

2
OK, to badanie dowodzi, że w przypadku mnożenia macierzy na dużą skalę Java przegrywa z C, gdy dostęp do danych uzyskuje się przy użyciu dwuwymiarowej tablicy. Tak, też bym się tego domyślił. A jeśli to naprawdę jest dla ciebie problem, w co wątpię, to właśnie dlatego masz JNI. Obciążenia związane ze sprawdzaniem granic dla tablic sumują się w tej sytuacji, chociaż jego kod Java mógł zostać zoptymalizowany, aby znacznie poprawić wyniki. Podobnie kwestionuję jego zrozumienie JIT, kiedy stwierdza: „szybsza kompilacja = nie najlepszy wygenerowany kod”. Przeczytaj specyfikację IBM, aby udowodnić, że jest inaczej.
bgroenks

3
Java NIE jest złym wyborem do tworzenia gier. Istnieje wiele gier, które odniosły sukces, wykorzystując Javę. Zazwyczaj potrzebujesz trochę pomocy ze strony kodu natywnego (szczególnie z LWJGL i tym podobnymi), aby naprawdę uzyskać najlepsze wyniki. Ale jeśli muszę tylko przeportować i ponownie skompilować 1% mojego kodu, a nie 100%, brzmi to dla mnie bardzo dużo.
bgroenks

1
@bgroenks "100%" - wygląda na to, że nie masz pojęcia o C / C ++ ... A podczas tworzenia gry zawsze możesz skorzystać z biblioteki wieloplatformowej (SDL i kilka innych) lub frameworka (na przykład Qt). Na przykład: EA używa Qt do absolutnie każdej gry, którą ma ... Qt jest DUŻO bardziej wieloplatformowa niż Java i kompiluje się do kodu natywnego.
Lilian A. Moraru,

2
Naprawdę nie widzę sensu w Javie, kiedy masz Qt. Uważam, że kod Qt jest bardziej przejrzysty, łatwiejszy do zrozumienia i utrzymania niż kod Java. Kiedy pytam znajomych, dlaczego tak bardzo boją się C ++, zawsze mi mówią, że nienawidzą wskaźników i upewniają się, że zwalniają pamięć. Wygląda na to, że wiele osób nie wie o shared_ptr w C ++ ... Dla mnie Qt i C # .NET / C ++ .NET są najładniejsze do pisania. Kod Java jest zwykle bardzo rozdęty i ma obsługę wyjątków, zwykle ma przestarzałe biblioteki (Dobrze sobie radzi głównie tylko po stronie serwera, ale reszta ...) i często nieaktualna dokumentacja.
Lilian A. Moraru,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.