Czy Java nadaje się do poważnego tworzenia gier? [Zamknięte]

64

Przeszukałem internet, ale nie ma zbyt wielu zasobów do tworzenia gier Java, nie tak blisko jak C ++. W rzeczywistości większość silników jest napisanych w C ++. Próbowałem zagrać w grę stworzoną przez jMonkeyEngine, ale gra była strasznie wolna, do tego stopnia, że ​​mój komputer zamarł. Nie miałem uruchomionych żadnych innych aplikacji Java i nic nie wymaga zbyt dużych zasobów. Natomiast mój komputer może z łatwością grać w większość nowoczesnych gier 3D. Jeśli nadal będę się uczyć i ulepszać Javę, a okaże się, że później będę musiał nauczyć się C ++, co może być trudne.

Czy Java jest językiem dopuszczalnym do poważnego tworzenia gier? Mówiąc poważnie, mam na myśli grafikę wysokiej jakości, bez większych opóźnień na nowoczesnych komputerach. Chcę też rozważyć tworzenie gier na konsole.

tehtros
źródło
25
Czy Minecraft nie jest zbudowany z Javą? A może głównie OpenGL? Aha i sprawdź C #, jeśli nie jesteś w 100% nastawiony na Javę, ponieważ jest niesamowity.
Aralox
7
Dlaczego nie przyjdziesz na Czat Przepełnienie stosu C ++? Uwielbiamy C ++, uważamy, że można go absolutnie dobrze wykorzystać i wiemy, jak to zrobić, i chętnie się z nim podzielimy.
DeadMG
12
Minecraft to kodowanie java + LWJGL + Notch, więc pod względem wydajności jest straszne.
MLProgrammer-CiM
3
Niezależnie od tego, czy grasz w kodowanie, czy coś innego, zamknięcie się w jednym języku nie pomoże ci w przyszłości. Rozgrzej się trochę, albo C ++, albo coś innego jak Python. To wymaga czasu, ale czyni cię lepszym twórcą.
loganfsmyth
4
Dostaniesz dużo dezinformacji, ponieważ wojny Java / C ++ płoną jasno, bądź przygotowany na zapytanie o konkretne przykłady przed zaakceptowaniem opinii, a także na samodzielne zbadanie =) To powiedziawszy, zgadzam się z @loganfsmyth, że musisz znać wiele języków, ponieważ tylko wtedy możesz wybrać odpowiednie narzędzie do każdego zadania. W najbliższej przyszłości, jeśli chcesz nauczyć się „programowania w stylu gry”, skorzystaj z tego, na czym ci wygodnie (Java), a następnie naucz się języka C ++ później. Heck, później możesz robić potoki treści w C # i gry w Java ME, trudne do przewidzenia =)
Patrick Hughes

Odpowiedzi:

54

Tak, sprawdź tę listę, aby uzyskać dowód. Oto niektóre gry wykonane w Javie przy użyciu The Lightweight Java Game Library (LWJGL). Jest to struktura niskiego poziomu, która zapewnia OpenGL dla wysokiej jakości grafiki i OpenAL dla dźwięków. Zapewnia również wejściowy interfejs API. Dzięki nim możesz łatwo zacząć poważnie rozwijać gry w Javie.

Obecnie piszę swoją drugą grę 3D jako projekt hobby w Javie i po prostu ją uwielbiam. W przeszłości pisałem swoje gry w C ++, ale po przejściu na Javę nie ma już powrotu. Obsługa wielu systemów operacyjnych w Javie może być bardzo łatwa, na przykład moja poprzednia gra Java, którą opracowałem w Windows przez rok, działała od razu w Linuksie i w OS X z jednym błędem, bez potrzeby kompilacji czegokolwiek na tych platformach.

Z drugiej strony z Javą masz kilka problemów.

  1. Śmieciarz. Jak stwierdzili inni, niedeterministyczne zarządzanie pamięcią jest problemem i należy to kodować.
  2. Brak bibliotek stron trzecich. Większość dostępnych bibliotek nie obsługuje Java. Z drugiej strony zawsze masz możliwość wywoływania tych rodzimych bibliotek z Javy, ale jest to więcej pracy. Istnieją również porty Java lub gotowe opakowania dla popularnych bibliotek, na przykład używam JBullet - portu Java Bullet Physics Library . Z drugiej strony Java ma wbudowaną bibliotekę ogromnych klas, co zmniejsza zapotrzebowanie na biblioteki stron trzecich niezwiązane z grą. Brak bibliotek nie był dla mnie problemem, ale mogę sobie wyobrazić, że może być dla innych.
  3. Java nie jest obsługiwana przez popularne konsole do gier i o ile wiem, nie ma łatwego przejścia na te z Java. Z drugiej strony Android, który jest popularną platformą mobilną, korzysta z jakiejś formy Java. Jest to również opcja, ale nie wyłączaj tego samego kodu Java do pracy zarówno na komputerze PC, jak i urządzeniu z Androidem.
  4. Mniejsza społeczność. Większość programistów używa C ++ i z mojego doświadczenia często nie lubię Javy. Nie oczekuj, że dostaniesz tyle pomocy od innych. Nie oczekuj, że dostaniesz pracę w tworzeniu gier bez umiejętności C ++.
sprzedać
źródło
40

Nie całkiem. O to chodzi - po pierwsze, jest bardzo mało pod względem istniejących bibliotek dla Java w porównaniu z praktycznie wszystkim , co jest dla C ++.

Po drugie, Java jako język po prostu nie nadaje się do tworzenia gier - mam na przykład na myśli, że jeśli masz do czynienia z buforami GPU, Java nie zapewnia funkcji językowej, która pomoże ci upewnić się, że są one poprawnie zablokowane i odblokowane lub zutylizowane, co robi C ++. Ponadto występuje problem z wydajnością - a GC jest niedeterministyczna, co jest bardzo złe dla gry.

Nigdy nie widziałem żadnej gry niezależnej, która spędzała dużo czasu w języku, który nie został skompilowany z kodem natywnym przed wykonaniem, a nawet gry indie, które to robią, są rzadkością. Tak więc obecnie uważam, że po prostu nie da się tego zrobić.

Ponadto, jeśli nadal będę się uczyć i ulepszać Javę i okaże się, że później będę musiał nauczyć się C ++, czy utrudni to przejście?

Tak, absolutnie tak będzie. Java i C ++ są bardzo różne, pomimo ich powierzchownych podobieństw składniowych. Doświadczenie w Javie nie ma praktycznie żadnego znaczenia podczas nauki C ++.

Rozgrywka nad grafiką jest realnym wyborem i widać to w sukcesach takich gier jak Terarria i Minecraft. Ale jeśli zamierzasz tworzyć grafiki srs, nie będzie to możliwe w Javie.

DeadMG
źródło
6
+1, ponieważ określił ciężką grafikę, szybką grę bez opóźnień.
Joshua Drake
1
Przeciwko temu stoi również brak niepodpisanych typów danych w Javie. Tak, możesz obejść ten problem, ale nie jest to idealne rozwiązanie i będziesz używać kodu, który tak naprawdę nie odzwierciedla poprawnie danych bazowych.
Maximus Minimus
@deadmg Czy przypadek zablokowania i odblokowania dotyczy funkcji API DirectX? Czy możesz mi powiedzieć, co jest tak złego w niedeterministycznym GC.
Quazi Irfan
Niedeterministyczny GC może zrównać się z upuszczaniem klatek, jeśli źle się zatrzymasz, świat się zatrzyma i zablokuje to na dłużej, niż potrzeba do renderowania ramki. W praktyce tak naprawdę nie zdarza się to często / nigdy, jeśli planujesz wykorzystanie pamięci, kolektory JVM można skonfigurować na małą pauzę (w granicach bezpiecznych limitów pomijania klatek). Mimo wszystko nie jest to fajna sprawa. W końcu musisz oddać znaczną część wydajności, którą zyskałeś po opuszczeniu C ++.
Michael
2
Na początek będziesz musiał całkowicie napisać od nowa.
DeadMG
25

Tak więc naprawdę poważnie podchodzę do tworzenia gier, czy Java jest nadal dobrym wyborem? Próbowałem wiele razy nauczyć się C ++, ale tak naprawdę nie lubię tego języka. Naprawdę nie wiem, dlaczego, ale zwykle, gdy próbuję się uczyć, nigdy nie rozumiem tematów.

Jeśli powodem wyboru Javy jest to, że nie rozumiesz C ++, twoje programy Java nie będą wystarczająco szybkie, aby uzyskać wysokiej jakości grafikę. Używanie języka wyższego poziomu powinno wynikać z tego, że zwiększa on produktywność, a nie dlatego, że nie można zrozumieć języka niższego poziomu.

Nie sądzę, aby pisanie gry w Javie było złym pomysłem, zwłaszcza jeśli gra jest prosta, ale od razu napotkasz problemy z wydajnością w Javie, jeśli używasz jej jako kuli.

Krótko mówiąc, można poważnie potraktować Javę, jeśli chodzi o poważny rozwój gier. Obejmuje to ciężką grafikę, szybką grę bez opóźnień i ewentualnie łatwą zmianę na konsole?

  1. Ciężka grafika: Możliwe, ale będziesz robić to samo w Javie / LWJGL, jak w C ++ / GL: zapisywanie bajtów do buforów GPU i / lub używanie przestarzałych list wyświetlania, jak robi to Minecraft. Jeśli nie rozumiesz zarządzania pamięcią, nie zrobisz tego poprawnie.

  2. Szybka gra bez opóźnień: nie jest to łatwe zadanie w żadnym języku, a bardziej prawdopodobne jest, że i tak postrzelisz się w nogę bez zastanowienia.

  3. Nie, Java nie będzie dostępna na konsolach.

Jimmy
źródło
Jako pytanie poboczne, co zastąpiło listy wyświetlania, gdy były przestarzałe?
Suds
@Suds: Myślę, że programowalny potok.
DeadMG
ha! już to pokryłem. VBO: gamedev.stackexchange.com/questions/22170/…
Jimmy
Platformy mobilne można uznać za konsole. Zdaję sobie sprawę, że prawdopodobnie mówił o wielkiej trójce, ale Android używa Javy i stworzono dla niej mnóstwo gier.
Amplify91
1
@ Amplify91 tak, kilka gier jest napisanych w Javie dla Androida. Ale większość dobrych gier i prawdopodobnie wszystkie gry intensywne graficznie lub wieloplatformowe są napisane w C ++ przy użyciu Androida NDK.
Coyote
15

Doświadczony programista na ogół zna wiele języków programowania - nauka dodatkowych języków programowania nie jest zbyt trudna, jeśli znasz dobrze jeden. Jednak zdecydowanie zalecałbym, aby C ++ nie był twoim pierwszym językiem, a prawdopodobnie również drugim.

Wynika to z faktu, że C ++ uzyskuje dużą wydajność, nie wykonując żadnych znaczących kontroli błędów w czasie wykonywania. Na przykład uzyskanie dostępu do elementu poza końcem tablicy w Javie zawsze spowoduje zgłoszenie wyjątku informującego programistę, co jest nie tak. W C ++ możesz mieć szczęście i natychmiast się zawiesi, ale bardzo często po cichu usunie inne dane, a błąd nie pojawi się dużo później .

Sugeruję, abyś na razie trzymał się Javy (lub przerzucił się na C #, jeśli wolisz). Pozwoli ci to zrobić wszystko szybciej niż przy użyciu C ++, a wydajność na komputerze nie powinna być problemem.

Pomyśl o nauce języka C ++ po ukończeniu kilku projektów w bezpieczniejszych językach. C ++ jest tym, czego potrzebujesz do większości profesjonalnych prac związanych z tworzeniem gier.

Zauważ, że z wyjątkiem C # / XNA, aby przynajmniej gra napisana na konsolę wymagała co najmniej założenia firmy, biura i dużego budżetu na sprzęt programistyczny i inne wydatki.

Adam
źródło
Jest to również wyjątkowo prawdziwe, ponieważ inne języki poza C ++ dają poczucie spełnienia. C ++ może zająć setki godzin, co może wydawać się niczym. Najpierw nauka innych języków pozwala zmoczyć stopy.
Darkenor,
Twoje komentarze na temat obsługi błędów nie dotyczą tak naprawdę C (i tak zwanego kodu C ++, który tak naprawdę jest C). C ++ ma standardowe biblioteki (i standardowe biblioteki szablonów), które mają znacznie lepszą obsługę błędów niż to, co opisujesz. C ++ ma również biblioteki dostarczone przez dostawcę (takie jak MFC), które zapewniają przyzwoitą obsługę błędów.
Jasper
9

Oświadczenie: To nie odpowiada dokładnie na twoje pytanie. Próbowałem jednak (krótko) wspomnieć o niektórych kwestiach, które mogą Cię zainteresować.

Powodem, dla którego tak często widzisz C ++, jest to, że C ++ wciąż jest standardem branżowym - najpopularniejszym językiem dla konsol itp.

Java nie jest często używana. Minecraft to dość popularna gra, która zrobiła duży sukces dzięki Javie; ale nie jest tak świetny graficznie. Spiral Knights nie jest zły - również w Javie, ze znaczną grafiką.

Jeśli lubisz Javę, C # jest bardzo podobna pod względem składni, z tą zaletą, że może współpracować z C ++ - więc w razie potrzeby można wykonywać czynności niskopoziomowe w C ++. Unity może używać C # do pisania skryptów, a XNA jest doskonałym wyborem.

Znowu Java nie jest powszechnie używana. Jeśli podoba Ci się styl i składnia, myślę, że znajdziesz C # jako bardzo podobne, bardzo przyjemne doświadczenie kodowania.

Mam nadzieję, że dzięki twoim marzeniom po drodze będzie dużo zabawy :)

ashes999
źródło
8
Dużo niedokładności w tych postach. „Zła” grafika Minecrafta nie jest (mocno) związana z językiem. Zła wydajność MC jest bezpośrednio związana z tym, że Java jest złym językiem gier, ponieważ OGROMNE problemy z wydajnością, a LWJGL jest nieodpowiednią biblioteką dla dużych projektów kodowania z tego samego powodu. Ale największym czynnikiem było złe kodowanie i implementacja Notcha, które jest naprawiane ... powoli. C # zapewnia wszystkie zasoby pamięci zarządzanej bez większości problemów z wydajnością Java. Minusem jest to, że C # jest silnie skoncentrowany na Microsoft zarówno w grach, jak i aplikacjach.
MLProgrammer-CiM
2
@EfEs: Nie chcę ci tego łamać, ale pamięć zarządzana jest straszna dla gier, a ludzie kodujący gry w XNA muszą poświęcać więcej czasu na zarządzanie pamięcią niż ludzie, którzy kodują w C ++. Niedeterministyczny charakter GC oznacza, że ​​musisz zebrać praktycznie wszystko i uniknąć alokacji jak zarazy - nie w sposób, w jaki miał być używany język.
DeadMG
Ta odpowiedź nie miała być w 100% dokładna; Podałem tylko przykłady, o których wiem niejasno. Zapraszam do DV.
ashes999
2
@DeadMG Wiem, że C ++ jest drogą, po prostu próbowałem wyjaśnić, że C # jest lepszy niż Java dla gier.
MLProgrammer-CiM
5
Jako programista C # od dawna (nie sądzę, że twórca gier) uważam, że pula i zarządzanie pamięcią to świetne problemy dla każdego źle zaprojektowanego systemu. Ludzie o sposobie myślenia C / C ++ i sposobach rozwoju, które znam, prawie nie wdychają zarządzanej pamięci, wzorców projektowych i architektonicznych, które muszą być użyte i wykorzystują je w języku takim jak Java / C #. To, co próbuję powiedzieć, to nie to, że techniki lub produkty C / C ++ są złe, ale nawet jeśli używasz prostszych języków pod względem składni (takich jak Java i C #), wciąż potrzebujesz dużego doświadczenia, aby zaprojektować grę we właściwy sposób droga.
Ivaylo Slavov
3

To nie odpowiada na twoje pytanie; problemy z grafiką i konsolą wydają się bardzo ważne. Również GC wpływa na wydajność. Ale o czym piszę:

Jeśli piszesz duże, złożone programy OO, napiszesz je 5 razy szybciej w Javie niż C ++. Ponadto konserwacja będzie znacznie łatwiejsza. Zmieniłem (co prawda na oprogramowanie inne niż gry), a moja wydajność gwałtownie wzrosła. C #, kolejna dobra alternatywa, jest trudniejsza do nauczenia się niż Java, ponieważ jest jej znacznie więcej. Znając go, możesz pisać kod nawet szybciej niż w Javie; oferuje wiele sztuczek. Uważam jednak, że te sztuczki mogą utrudniać konserwację. A potem jest dokument Java, który pomaga w bibliotekach Sun i twoim własnym starym kodzie. C # nie ma nic podobnego.

Zrobiłem dużą owłosioną grę w Javie i znalazłem język idealny, ale moja grafika była podstawowa i nie była to strzelanka, w której jedna dziesiąta sekundy była wiecznością dla graczy. Spodziewam się również, że w późniejszym czasie wiele do niego dodam, podczas gdy myślę, że większość ludzi po prostu idzie i pisze zupełnie nową grę.

RalphChapin
źródło
3

Słuchaj, prosta odpowiedź na „Czy Java nadaje się dla twórców gier” jest oczywistym twierdzeniem. Do tworzenia gier możesz używać dowolnego języka programowania. To nie znaczy, że powinieneś .

Prawdopodobnie te rzeczy, które wyłączają cię z C ++ (zarządzanie pamięcią niskiego poziomu, brak śmieciarza, zwracanie uwagi na wskaźniki, struktury jako tablice itp.) To te rzeczy, których powinieneś się nauczyć, jeśli chcesz najbardziej efektywnie wykorzystywać zasoby komputera . Twoje gry będą działały najlepiej, jeśli najbardziej efektywnie wykorzystujesz zasoby komputera.

Java wykonuje pewne czynności (takie jak sprawdzanie granic tablic), które powodują, że działa wolniej. W tym zoptymalizowanym przykładowym kodzie szumu Java Perlin autor skomentował „(dostęp do tablicy jest znacznie wolniejszy niż dostęp do członka)”. Ten rodzaj rzeczy jest dość sprzeczny z intuicją pochodzący z tła C ++. Ale w Javie takie są.

Mówię: przestań unikać pocisku, naucz się C ++ i używaj go.

Bobobobo
źródło
1

Powinieneś to robić w języku, który znasz najlepiej, dopóki nie stać Cię na formalne wykształcenie (Bachelor's of Science?) W dziedzinie informatyki, kładąc nacisk na projektowanie gier. Możesz użyć swojej gry, aby uzyskać stypendium, zwłaszcza jeśli możesz powiedzieć „Zrobiłem to bez formalnego szkolenia w Javie”

Współczesne maszyny JVM, nawet te z Oracle, mają wiele, wiele funkcji pozwalających odpowiedzieć na obawy, o których ludzie tu mówili. Możesz użyć różnych śmieciarek, aby uzyskać bardziej deterministyczne zachowanie śmieciarza. Nie mam dużego doświadczenia z bibliotekami 3D - tylko trochę z Jav3D - ale wydaje się, że nikt tutaj nie narzekał. Analiza ucieczki umożliwia teraz eliminację blokady i znacznie szybsze / nieznaczne przydzielanie bardzo krótkotrwałych obiektów.

Problem polega na tym, że niezależnie od tego, czy wybierzesz Javę C ++, musisz nauczyć się, jak prawidłowo używać współbieżności i dobrze rozumieć zarządzanie pamięcią. W końcu możesz tak łatwo zepsuć, mallocjak możesz new. Nie wiem, jakie są narzędzia dla C ++, ale narzędzia do profilowania dla Javy są dość łatwe w użyciu, darmowe i zintegrowane z IDE. Możesz ich użyć do śledzenia problemów z wydajnością i uczenia się .

Mutant Platypus
źródło
5
Formalne wykształcenie w zakresie CS jest warte gówna, jeśli chodzi o umiejętności programowania w każdej dyscyplinie. Wiedziałbym, że jestem na trzecim roku.
DeadMG
4
Zdecydowanie nie zgadzam się z DeadMG. Po ukończeniu i wybraniu kursów, które lubię, CS zwiększyło moje możliwości tworzenia gier z 10% do 100%. Nie nauczył mnie interfejsu użytkownika, ikonografii itp., Ale rzeczywiste kodowanie.
ashes999
2
@ ashes999: Masz szczęście. Mój kurs jest bezwartościowy i wiem, że jest wielu innych, którzy czują to samo.
DeadMG,
2
@DeadMG trudno jest zobaczyć, kiedy się uczysz. Gdy przepracujesz kilka lat F / T i nauczysz się innych bezpłatnych umiejętności, zobaczysz. Zrobiłem. Ale może po prostu poświęciłem dużo uwagi i starałem się zastosować wszystko do mojego hobby twórców gier.
ashes999
1
Powiedziałbym, że to zależy od szkoły i profesora. Miałem kilka świetnych zajęć z programowania, w których nauczyłem się tony; i miałem kilka, w których czułem, że straciłem wiedzę poprzez uczestnictwo. Wszystko zależy od dobrego profesora, czy nie. IMO.
Nate