2011-01-25 7 views
17

Ostatnio zajmowałem się rozwojem gier, a moim pierwszym językiem programowania jest Java. Po graniu wielu oszałamiających gier opracowanych w C++ zastanawiałem się, dlaczego Java nie jest mocno wykorzystywana w branży gier. Spojrzałem na jMonkeyEngine 3 i kilka innych środowisk gier, ale zrzuty ekranu, które widziałem, są znacznie mniej oszałamiające. Tytuły takie jak Need for Speed ​​Hot pogoń EA i Assassins Creed z ubisoft przekazują taki realizm. Dlaczego Java nie może produkować takich gier o sile w branży? Czy to dzieło sztuki?Java Game Engines

Java i C# ma automatyczne usuwanie śmieci, a C++ nie. Programista musi zwracać baczniejszą uwagę na wykorzystanie pamięci, aby wyświetlać zwisające wskaźniki i tak dalej.

Dzięki chłopaki.

+0

Spróbuj spojrzeć na LWJGL, jego wspaniałą bibliotekę graficzną Java. Jest całkiem niedawno, jeśli pamięć służy. –

Odpowiedz

19

Java i C# ma automatyczne śmieci kolekcja i C++ nie. Programator musi zwracać baczniejszą uwagę: na użycie pamięci, aby uzyskać zwisające wskaźniki i tak dalej.

Sam odpowiedziałeś na swoje pytanie.

W grach programowanie zbierania śmieci nie jest zaletą. Nawet jeśli wydajność Java jest mniej więcej odpowiednikiem C++ dla większości zadań, a JIT może nawet wykonywać bardzo agresywne optymalizacje, które pokonują te, które można wykonać podczas analizy statycznej; odśmiecanie może spowodować spadek liczby klatek w najgorszym momencie.

Ponadto w przypadku zadań wymagających dużej intensywności grafiki Java nie jest bardzo odpowiednia, ponieważ wiele rzeczy jest uznanych za niebezpieczne przez środowisko wykonawcze, a zatem są one zabronione (np. Wskaźniki rzutowania reinterpretują dane).

Inną ważną sprawą jest już ustalone know-how w branży. Bezwładność C++ w branży gier jest ogromna. Wszyscy twórcy gier znają dziś C i C++. Posiadanie dużej puli deweloperów do wynajmu od zmniejszenia jednego z zagrożeń związanych z zarządzaniem, które są kluczowymi osobami opuszczającymi firmę.

Ale mimo to istniały pewne udane gry z niektórymi częściami napisanymi w Javie, takimi jak Vampire: The Masquerade - Redemption.

Nowsza gra taka jak Minecraft jest napisana całkowicie w Javie; ale nie ma najnowocześniejszej grafiki, ponieważ nacisk kładzie się bardziej na dynamiczną naturę środowiska wirtualnego.

Wiele innych gier i silników ma środowisko wykonawcze obsługujące język skryptowy zarządzany (bezpieczny automatyczny przydział i gromadzenie pamięci) zbudowany na platformie renderowania o wysokiej wydajności i sieci (napisanej w języku C/C++), na przykład Unreal Engine, na przykład .

+0

Naprawdę? Zdecydowałeś nie wspominać o Minecrafcie? EDYCJA: Właśnie zdałem sobie sprawę, że mogło to być przed jego wzrost popularności ... Przepraszam. –

+1

@NickHartley nie martw się, zdarza się cały czas ... – fortran

+3

:) Wciąż czuję się opóźniony ... Ale możesz edytować swoją odpowiedź na Minecraft! –

1

To nie do końca prawda, że ​​odśmiecanie nie jest wykorzystywane w branży gier. Unreal Engine 3 ma zaśmiecanie zaimplementowane dla klas "Script". Dla nich wydajność jest do przyjęcia, gdy jest używana lekko; ciężkie podnoszenie odbywa się za pomocą kodu C/C++, który zarządza własną pamięcią.

Jak powiedział Fortran, Java nie jest tak naprawdę używana w branży gier ze względu na obawy związane z szybkością (Java uruchamia kod na VM, a nie natywnie ... przez większość czasu) i ponieważ istnieje już duża liczba utalentowanych programistów gier, którzy napisali dużo często używanego kodu w językach C i C++. Nie oznacza to, że nie można używać Javy do tworzenia gier, ponieważ jest tam kilka gier Java, ale "główny nurt" branży gier mocno zainwestował w backend C/C++.

+3

Trochę korekty: nowoczesny kod JVM uruchamiany z natywnymi prędkościami. JVM jest dostarczany z kompilatorem JIT, który śledzi, jak często fragment kodu został uruchomiony i gdy licznik odwołań osiągnie określone progi, kompiluje ten kod do natywnego kodu maszynowego. Właśnie dlatego kilka benchmarków Java zawiera wyrzucanie, które "napędzają" silnik, zmuszając JIT do kompilacji kodu. – jeckhart

0

Fortran i James opisali to już całkiem dobrze, ale jeszcze jedną rzeczą, o której chciałbym wspomnieć, jest to gigantyczna pula bibliotek dostępnych w języku C++. Posiadanie wielu bibliotek C++ dla niemal wszystkiego, co można sobie wyobrazić, jest ogromnym powodem, aby nie przełączać się na Javę. Nie oznacza to, że obecnie nie ma tam bibliotek Java, ale te w C++ są już dojrzałe i mają duże społeczności doświadczonych twórców. Brak konieczności przepisywania tego samego, co zrobiłeś wcześniej 1000 razy, oszczędza dużo czasu.

+1

Myślę, że to trochę mylące określenie, że nie ma dostępnych dojrzałych bibliotek Java. Chociaż w świecie Javy może być mniej bibliotek specyficznych dla gier, istnieje niezliczona ilość dojrzałych bibliotek dostępnych dla prawie wszystkich rzeczy Java. – jeckhart

19

Generalnie wszystko, co tu napisano, było powodem, dla którego nie wolno przenosić się do Javy w celu tworzenia gier; był. Branża gier uderza obecnie w przesunięcie paradygmatu . Trzy rzeczy zostały zmienione lub są obecnie zmianę branży gier:

  • piractwa
  • klient-serwer modele programowe
  • Modułowe-networking modele programowe

Gra nie jest całkowicie zależne od siebie już . Kluczowe zalety, które istniały w poprzednich wersjach (języki niskiego poziomu), są spowalniane i nie są ważone przez zalety języków takich jak C# i Java (języki wysokiego poziomu). Dwa proste, ale niezaprzeczalne przykłady to gry działające pod Facebook i zdalnych mediów, takich jak telefony, tablety itp..

Ważne jest, aby stwierdzić, że we wszystkich dwóch scenariuszach wszystkie trzy powyższe problemy zostały rozwiązane. Gra, która nie może działać bez serwera, nie musi martwić się o to, że zostanie naruszona kopia (nie obejmuje prywatnego hostingu za pomocą inżynierii odwrotnej). Zapotrzebowanie na gry zależne od sieci wymaga języka, który może zrównoważyć wydajność systemu z wydajnością sieci (zwykle impas między Java i C/C++, faworyzując C/C++ ściśle ze względu na obfitość wcześniej istniejących bibliotek). Jednak gra zaprojektowana w module programowym do tworzenia sieci modułowych byłaby niepraktyczna w językach niskopoziomowych, takich jak C/C++. Firma, która byłaby zainteresowana zaprojektowaniem gry w C/C++ dla modelu programowego Modular-networking, musiałaby stworzyć wirtualną maszynę całkowicie poświęconą tej jednej grze lub przeprogramować/zrekompilować grę kilka razy zbyt szaloną, by myśleć. IMO, chociaż może być zbyt wcześnie, by określić, który język jest preferowany, stawiam swoje zakłady na Javie z trzech kluczowych powodów.

  • 1) JVM pozwala aplikacjom Java, aby uruchomić praktycznie na każdej platformie , czy firmy Apple, Android, Windows 8 lub Linux/UNIX pochodzi (praktycznie podtrzymujące na dowolnej platformie sprzętowej, jak również).

  • 2) Java używa OpenJL (pochodna OpenGL, która będzie działać jako klient na OpenGL - jMonkey jest silnikiem zaprojektowanym w OpenJL). Ważne jest, aby pamiętać, że tylko Microsoft Windows używa DirectX, jako dobry , jak to możliwe, ma tylko jeden rewers. Praktycznie każdy system operacyjny, który może uruchamiać gry, będzie mógł renderować w OpenGL, a modułowa konstrukcja będzie działać tak, jak nigdy dotąd. (Uwaga: Microsoft próbuje odejść od tego problemu poprzez monopolizację dystrybucji Windows 8).

  • 3) Java obsługuje wątków wewnętrznie w JVM, który pozwala aby w pełni wykorzystać możliwości procesorów wielordzeniowych bez użycia dowolnej biblioteki strona trzecia. Obecnie jest to utrudnienie dla wszystkich innych języków (szczególnie tych opracowanych dla telefonów).

Podczas gdy JVM stwarza problem związany z opóźnieniem, należy zauważyć, że takie obawy można wyeliminować poprzez gwintowanie. Nie martwiłbym się też zbytnio o Windows 8 i push Microsoftu. Google ma udział 720 USD na akcję, Apple ma 526 USD na akcję, a Microsoft na 27 USD. Podczas gdy Apple prawdopodobnie zostanie zrealizowany przez Microsoft, głównie z powodu użycia C#, Google z drugiej strony prawdopodobnie skorzysta z niego. Microsoft nigdy nie miał szczęścia, gdy konkurował z Google, a Google/Android intensywnie korzysta z Javy. Angry Birds został pierwotnie zaprojektowany w Java FYI i przeniesiony do C# na iPhone'a. Jeśli Google/Android wymusi standaryzację, Microsoft spadnie jak mucha, zabierając ze sobą Apple.

+0

"C# na iPhone" - masz na myśli cel C, prawda? –

+1

Nie jestem pewien, co ma z tym wspólnego cena akcji. Kryzys rynkowy może być nieco bardziej istotny, ale nadal nie ma z nim wiele wspólnego. –

3

Chciałem rozwiązać tylko jeden wątek tego pytania, ale zbieranie nie jest konieczne do stworzenia niskiego poziomu, krytycznych pod względem wydajności aspektów silnika gier AAA. W rzeczywistości omijanie tego rodzaju systemu odwołań i gromadzenia obiektów jest pomocne. Chcesz, aby nawet typy zdefiniowane przez użytkownika były ciągłe w pamięci i pasowały do ​​sąsiednich obiektów w pamięci podręcznej, itp.

Oprócz problemów z wydajnością zbierania śmieci w okresowych odstępach czasu i rozpraszania obiektów w pamięci, gry nie mogą sobie pozwolić być nieszczelnym z ich większymi zasobami, a odśmiecacz śmieci przeszkadza w tym. Tak, właśnie powiedziałem, że GC utrudnia zdolność do unikania wycieków.

Zbieranie śmieci nie jest srebrną kulą przeciwko wyciekom zasobów.

Wbrew pozorom intuicyjności, spójrz na najodleglejsze aplikacje tam obecnie: te, w których im dłużej ich używasz, tym bardziej rośnie zużycie pamięci. Zazwyczaj nie są to aplikacje C lub C++. Aplikacje C/C++ mogą być znane z awarii, ale nie tyle z powodu przecieków. Te nieszczelne są znacznie częściej programowane w językach z funkcją zbierania śmieci.

Weźmy na przykład gry Flash. Jest wiele takich programów, a nie tylko kompletne amatorskie oprogramowanie, które wykorzystuje coraz więcej zasobów, a wolniej i wolniej, im dłużej grasz, co zmusza do restartowania przeglądarki, aby ponownie uzyskać szybką grę. Jednak są one kodowane w języku ActionScript, języku, który ma odśmiecanie.

Teoretycznie wywóz śmieci powinien zmniejszyć nieszczelności. W praktyce często eliminuje tańsze i łatwiejsze do naprawienia i zauważenia fizyczne przecieki (whoops zapomniałem usunąć ten ciąg) w zamian za dużo droższe i trudniejsze do wyodrębnienia logiczne wycieki (whoops, logika system powoduje, że duże zasoby pozostają w pobliżu, dopóki cała gra nie zostanie zamknięta).

Dzieje się tak, ponieważ w języku GC, jeśli chcesz utworzyć wspólną własność nowego zasobu, R, wszystko, co musisz zrobić, to przechować uchwyt/odniesienie do niego w innym obiekcie, A. B i C może również przechowywać uchwyt do R, a teraz R ma trzech właścicieli i zostanie zwolniony tylko wtedy, gdy wszyscy trzej właściciele zwolnią odniesienie. Użytkownik widzi i pracuje tylko z tym, co A przechowuje, więc logika gry polega na okresowym usuwaniu R z A, ale odniesienia do niej pozostają w milczeniu w kodzie, o którym zapomniał napisać kod: B i C.W C/C++ zwisający wskaźnik w tym przypadku może być w rzeczywistości preferowany, ponieważ prowadziłoby to do natychmiastowego wykrycia i usunięcia problemu podczas testowania gry, w którym programista korzystający z debuggera bardzo szybko wykryje i naprawi problem. W języku GC jest on niezwykle trudny do wykrycia i podczas gdy program się nie zawiesza, może zacząć tracić czas.

Więc GC zdecydowanie unika wiszących wskaźników, ale gdyby coś wisiało w C/C++ i nie zwisałoby w języku GC, to jest to logiczny przeciek zasobów w języku GC i segfault w C/C++ . Innymi słowy, GC wymienia zwisające wskaźniki dla zwisających zasobów, które pozostają na zawsze. Wymienia to, co może być rażącym wypadkiem w cichy wyciek, który może być koszmarem, który można odkryć (i może nawet pozostać niezauważonym długo po zwolnieniu produktu). Tak więc dla czegoś takiego jak gra, która tworzy masywne, dynamiczne światy, obiekty graficzne i fizyki i tak dalej i być może w każdej klatce, logiczne przecieki zasobów są wielką sprawą.

Zbieranie śmieci jest najlepsze, gdy wycieki zasobów nie stanowią wielkiego problemu.

Ten poprzedni scenariusz jest niestety zbyt powszechny w środowisku zespołowym na dużą skalę przy użyciu GC, zwłaszcza, jeśli każdy programista nie jest bardzo ostrożny wobec pułapek wyrzucania śmieci i silnej potrzeby słabych referencji. Więc GC niekoniecznie jest czymś, co można przytoczyć jako zaletę przy tworzeniu gier, chyba że mówisz tylko o logice ludzkiej najwyższego poziomu. Niższa, delikatna logika systemu, która musi nieustannie tworzyć i uzyskiwać dostęp do zasobów oraz niszczyć je, z reguły będzie lepsza, nawet jeśli chodzi o unikanie przecieków, bez niego.

4

Odpowiedź na pytanie to grafika i zasoby finansowe. Oryginalna Minecreft została opracowana przez jedną osobę w języku Java. Podczas gdy tittle jako AC lub NFS są tworzone z zespołów tysięcy ludzi. Porównaj zasoby. Ponadto Ubisoft używa silnika gry custrom. Jeśli jesteś jedynym programistą, powinieneś skupić się na tym pomyśle z powodu braku zasobów. A jeśli masz pomysł, kolekcjoner garbege nie działa w zwykłych grach dla programistów. Jako jedyny programista powinieneś wybrać najszybszą technologię programistyczną.

-2

Możesz znaleźć gry napisane w języku Java (silnik jmonkey napisany całkowicie w języku Java).

Tutaj -> "http://www.indiedb.com/engines/jmonkeyengine/games".

Świat 1-gwiazdkowy.

2.minraft.

3.mynthurana.

wszystko w silniku jmonkey. Jakość ich grafiki jest wysoka, a wyzwania są dobre.

Powiedziałbym, że warunkiem rozwoju gry jest posiadanie co najmniej dwóch osób. Java jest w porządku.

Powiązane problemy