왜 소수의 비디오 게임만 자바어로 쓰여져 있는 거죠?
왜 상용 3D 비디오 게임(랜덤 오픈 소스 2D 게임이 아님)이 Java로 작성되지 않는가?이론상으로는 생산성 향상과 크로스 플랫폼 애플리케이션을 거의 무료로 이용할 수 있습니다.예를 들어 방대한 자바 라이브러리와 내장된 가비지 컬렉션(후자가 좋은지는 잘 모르겠지만) 등이 있습니다.그럼 왜 거의 사용하지 않는 걸까요?자바 플랫폼용으로 만들어진 인기 있는 상업용 게임 몇 개밖에 생각나지 않는다.
퍼포먼스 때문일까요?만약 그렇다면 대부분의 무거운 작업은 GPU에 의해 처리되지 않을까요?
게임 개발 세계는 재미있습니다.한편으로, 그들은 종종 새로운 아이디어를 빠르게 받아들이지만, 다른 한편으로 그들은 아직 석기시대이다.
사실 로의 전환에 따른 인센티브는 거의 없습니다.NET/Java 또는 C/C++ 이외의 것.
대부분의 게임 회사들은 다른 회사로부터 게임 엔진의 일부를 라이선스한다.이러한 부분은 C++로 기술되어 있기 때문에, 소스에 액세스 할 수 있기 때문에, 포토 할 수 있는 경우도 있습니다만, 많은 노력이 필요합니다(물론 라이센스에서는 허가할 필요가 있습니다).
또한 C++에는 이미 많은 레거시 코드가 존재합니다.이전 프로젝트의 코드를 재사용할 수 있다면(예를 들어 속편을 작성할 경우), 새로운 언어로 다시 쓰는 것이 아니라 같은 언어를 사용하는 것이 더 중요합니다(많은 버그를 다시 도입할 가능성이 높기 때문에).
마지막으로, 게임이 100% C++로 작성되는 경우는 거의 없습니다.커스텀 언어든 기존 언어든 스크립팅 언어를 사용하는 경우가 많습니다(Lua는 요즘 가장 인기 있는 언어 중 하나입니다).
가비지 수집에 관한 한, 그것은 조금 문제가 될 수 있습니다.문제는 그것이 존재하는 것이 아니라 어떻게 동작하느냐에 있습니다.가비지 컬렉터는 논블로킹(또는 적어도 매우 짧은 시간만 차단할 것을 보증합니다)을 해야 합니다.왜냐하면 할당된 모든 메모리를 스캔하여 해방할 수 있는 것을 확인하는 동안 게임을 10초간 정지시키는 것은 용납할 수 없기 때문입니다.Java는 메모리 부족에 가까울 때 GC에서 상당히 많은 것을 알고 있습니다(게임이 있는 경우).
또한 실행 시 오버헤드로 인해 하드웨어를 완전히 이용할 수 없다는 점도 조금 더 제한적입니다.Crysis가 Java로 작성되는 것을 상상해 보십시오.그것이 유일한 눈에 띄는 차이점이라고 해도, 동일하지 않을 것입니다(Core i7이 가동하고 있는 것도 확실합니다).
이것은 이러한 언어들이 게임 개발에서 그 자리를 차지하지 않는다는 것을 의미하는 것은 아닙니다.또한 저는 툴 프로그래밍만을 언급하는 것이 아닙니다.대부분의 게임에서는 3D 게임을 포함하여 C++에서 얻을 수 있는 추가 퍼포먼스가 필요하지 않습니다.또한 처음부터 XNA와 같은 것을 사용하는 것이 매우 적합합니다.사실 그럴 가능성이 높습니다.
상업용 게임에 관한 한 RuneScape는 포함됩니까?그것은 아마도 가장 성공적인 자바 게임일 것이다.
존 카맥이 가장 잘 말한 것은 다음과 같습니다.
가장 큰 문제는 자바가 정말 느리다는 것이다.순수한 CPU/메모리/디스플레이/통신 수준에서 대부분의 최신 휴대폰은 게임보이 어드밴스드보다 훨씬 더 나은 게임 플랫폼일 것입니다.Java를 사용하면 대부분의 전화기에서 원래의 4.77Mhz IBM PC와 같은 CPU 파워와 모든 것을 제어할 수 없습니다.[...snip...] 어디서나 한 번 실행할 수 있습니다.하하하하하.현재는 4개의 플랫폼에서만 테스트하고 있으며, 어느 한 쌍도 이와 완전히 다른 특징을 가지고 있지 않습니다.모든 상용 게임은 각 플랫폼(대개 100개 이상)에 대해 개별적으로 조정 및 컴파일됩니다.휴대성은 퍼포먼스의 저하를 정당화할 수 없습니다.
(소스)
물론 그는 모바일 플랫폼에 대해 이야기했지만, 자바 전체에서도 비슷한 문제가 C++ 배경에서 비롯되었다는 것을 알게 되었습니다.스택/히프에 메모리를 할당하는 것이 제 조건에 맞지 않습니다.
우선, Java의 연산자 과부하로 인해 그래픽 파이프라인이 작동하기 위해 처리해야 하는 모든 계산은 매우 귀찮고 읽기 어렵다.
당신이 다룰 필요가 있는 모든 행렬 곱셈과 아핀 벡터는 만약 그것들이 객체 지향적인 표현보다 잘 형성된 수학 표현에 있다면 훨씬 더 쉽게 따라갈 수 있습니다.
product = vector.multiply(projectionMatrix).dotProduct(otherVector);
그건 정말 끔찍해요.수학이 그렇게 보이면 안 돼.
생각합니다.NET에는 Java와 동일한 문제가 많이 있었습니다.Microsoft는 XNA를 사용하여 개발자에 대한 마케팅을 더 잘 수행했습니다.
마이너 포인트 우선:
Java에 의한 생산성 향상은 가상적인 것입니다.이 구문은 C++와 거의 동일하기 때문에 메모리 관리 및 표준 라이브러리의 비용 절감을 기대할 수 있습니다.도서관들은 게임 개발자들에게 제공할 것이 거의 없고 메모리 관리는 쓰레기 수거로 인해 논란이 되고 있다.
크로스 플랫폼 "공짜"는 당신이 생각하는 것만큼 좋지 않다. 왜냐하면 OpenGL을 사용하는 개발자는 거의 없고 몇몇 주요 플랫폼들은 그래픽, 오디오, 네트워킹 등을 위해 그들의 네이티브 라이브러리를 위한 좋은 자바 구현이나 래퍼가 부족하기 때문이다.
그러나 주로 문제는 하위 호환성입니다.게임 개발자는 이행 경로가 원활하다는 이유만으로 C에서 C++로, 어셈블리에서 C로 이동했습니다.각각은 이전 코드와 긴밀하게 상호 운용되고 있으며, 이전 코드는 모두 새로운 언어로 사용할 수 있었습니다(대부분 단일 컴파일러를 통해 사용 가능).따라서 마이그레이션은 원하는 만큼 느리거나 빠르게 진행되었습니다.예를 들어, 현재 사용되고 있는 오래된 헤더 중에는 아직 #ifdef WATCOMC가 포함되어 있는 것도 있습니다.또, 10년 이상 동안 Watcom 컴파일러를 사용한 사람은 없는 것 같습니다.오래된 코드에 막대한 투자를 하고 있으며 각 비트는 필요한 경우에만 교체됩니다.기존 코드와 네이티브하게 상호 운용되지 않는 언어로 바꾸면 게임 간에 비트 앤 피스를 교환하고 업그레이드 하는 과정은 전혀 실용적이지 않습니다.네, C++/Java의 상호 운용성은 가능하지만 단순히 "C++"를 쓰거나 C에 asm 블록을 내장하는 것에 비하면 매우 비현실적입니다.
C++를 게임 개발자가 선택한 언어로 적절하게 대체하기 위해서는 다음 두 가지 중 하나를 수행해야 합니다.
- 기존 레거시 코드와 쉽게 상호 운용할 수 있으므로 투자를 보호하고 기존 라이브러리 및 도구에 대한 액세스를 유지할 수 있습니다.
- 독자적인 코드를 모두 재작성(또는 그 언어를 사용할 수 있는 재사용 가능한 컴포넌트에 인터페이스를 재작성)하는 비용이 충분히 들 정도로 생산성 향상을 사전에 실증할 수 있습니다.
주관적으로 자바가 그 어느 쪽도 충족시키지 못한다고 생각합니다.만약 누군가가 선구자가 될 만큼 용감한 사람이 있다면, 더 높은 수준의 언어가 제2의 언어를 충족시킬 수 있을 것이다. (EVE Online은 아마도 우리가 Python을 사용할 수 있는 가장 좋은 예일 것이다. 그러나 Python의 주요 언어의 포크, 많은 C++ 컴포넌트, 그리고 그마저도 현대적 용어로 표현하자면 꽤 무난한 게임을 위한 것이다.)
- 게임 엔진/라이브러리의 좋은 포트가 있습니까?
- 많은 C/C++ 개발자들, 특히 Windows 개발자들(대부분의 상업용 게임이 작성되는 곳)은 Visual Studio에 익숙합니다.IDE는 비교가 되지 않는다.
- 일반적으로 자바는 견고한 타이핑과 메모리 관리에 문제가 없다는 인식을 가지고 있기 때문에 기업에 판매되어 왔습니다.
- 그리고 Java는 여전히 느리고 메모리 관리가 부실하다는 인식에 시달리고 있으며 게임에서는 아마도 이 작업에 적합하지 않을 것입니다.다른 답변에서도 언급되었듯이, 실시간 고성능 요구사항을 처리할 때 가비지 수집으로 인해 가비지 수집을 줄일 수 없습니다.비디오 게임은 CPU와 GPU를 한계에 이르게 합니다.
심즈3를 연주하고 있는데 여기저기 쑤셔보기도 했어요.그래픽스 엔진은 C++이고 스크립트 및 동작 엔진은 C#/Mono입니다.따라서 C++는 시간 크리티컬 비트를 위해 존재하지만 .interaction, 게임 로직, AI 등은 객체 지향 관리 언어로 되어 있습니다.
Java 및 기타 가상 시스템 언어가 게임에 사용되지 않는 가장 큰 이유 중 하나는 가비지 컬렉션입니다.에 대해서도 마찬가지입니다.NET. 가비지 컬렉션은 오랜 기간 발전하여 대부분의 응용 프로그램에서 잘 작동합니다.그러나 가비지 수집을 수행하려면 응용 프로그램을 일시 중지하고 중단하여 휴지통을 수집해야 합니다.이로 인해 수집이 발생할 때 주기적인 지연이 발생할 수 있습니다.
Java는 실시간 애플리케이션에서도 동일한 문제가 있습니다.태스크가 특정 시간에 실행되어야 하는 경우 가비지 수집과 같은 자동화된 태스크는 이를 준수하기 어렵습니다.
자바가 느린 것은 아니다.자바가 실시간 작업을 잘 처리하지 못한다는 것입니다.
큰 이유는 비디오 게임이 대부분의 경우 그 밑바탕에 있는 하드웨어에 대한 직접적인 지식을 필요로 하기 때문입니다.또한 많은 아키텍처에는 그다지 큰 구현이 되어 있지 않기 때문입니다.개발자가 게임 시스템의 성능을 최대한 끌어낼 수 있는 기반 하드웨어 아키텍처에 대한 지식입니다.왜 게임 플랫폼에 Java를 포팅하고 그 포트에서 게임을 작성하는데 시간을 들이는 거죠?
편집: 이것은 "속도" 또는 "올바른 라이브러리가 없다"는 문제 이상임을 나타냅니다.이 두 가지는 이와 밀접하게 관련되어 있습니다만, 「셀과 같은 시스템을 어떻게 하면 자바 코드를 실행할 수 있을까?」에 더 가깝습니다.파이프라인과 벡터를 관리할 수 있는 좋은 자바 컴파일러는 거의 없습니다."
성능 문제가 첫 번째 이유입니다.Quake 엔진(http://www.codemaestro.com/reviews/9)에 하이퍼로 최적화된 C++ 코드가 있으면 가상 머신에 시간을 낭비하지 않는다는 것을 알 수 있습니다.
물론 있을 수 있다.NET 게임(어느 게임입니까?관심있어요.CPU/GPU를 많이 사용하는 테크놀로지가 있습니까?)라고 생각합니다만, 많은 사람들이 MS 테크놀로지의 전문가이며, Microsoft의 새로운 테크놀로지를 팔로우 하고 있기 때문입니다.
오, 크로스 플랫폼은 비디오 게임 회사들의 마음에 들지 않는다.Linux는 시장의 1% 정도이고 Mac OS는 몇 % 더 많습니다.DirectX와 같은 Windows 전용 테크놀로지나 librairies를 폐기할 가치가 없다고 생각하는 것은 확실합니다.
웹 어플리케이션도 왜 C나 C++로 작성되지 않았는지 물어보세요.Java의 힘은 네트워크 스택과 객체 지향 설계에 있습니다.물론 C랑 C++도 있어요.하지만 더 낮은 추상화에서는요.그건 부정적인 것은 아니지만 매번 바퀴를 재발명하고 싶지는 않겠죠?
Java는 하드웨어에 직접 액세스할 수 없기 때문에 프레임워크의 API를 계속 사용할 수 없습니다.
성능 및 JVM 최적화에 대한 잘못된 인식이 있을 것입니다.C++ 게임에는 C++ 게임보다 더 빠른 Java 포트가 있기 때문에 성능에 대한 오해가 있습니다(Jake 2 참조).IMHO의 진짜 문제점은 많은 Java 프로그래머들이 에지 퍼포먼스에 그다지 집중하지 않고 사용 편의성과 코드 이해성/유지보수가 용이하다는 것입니다.C/C++ 측면에서는 기본적으로 조금 더 높은 수준의 어셈블리 언어로 코딩하며 어셈블리 또는 스트레이트 머신 코드를 작성하지 않고도 하드웨어에 최대한 가깝게 코딩할 수 있습니다.
위키피디아에 있는 게임 엔진 목록은 많은 게임 엔진과 그것들이 쓰여진 프로그래밍 언어를 나열합니다.
몇 가지 자바 게임 엔진이 나열되어 있습니다.
링크를 클릭하면 Java로 작성된 게임 및 데모의 예가 나타납니다.몇 가지 예를 들어보겠습니다.
특정 게임 및 상황에서는 Java의 트레이드오프가 허용될 수 있습니다.
.NET은 강력한 3D 퍼포먼스에 관해 Java와 같은 문제를 안고 있습니다.마이크로소프트는 또한 3D 고부하 작업에 관한 한 라이브러리 개발에 훨씬 더 많은 시간과 비용을 투자했습니다.
(...개인적으로는 DirectX와 님의 마법에 관해서도 그들이 앞서 있다고 생각합니다.네트워크)
Java는 느리고 무거운 것의 대부분은 GPU에 의해 처리되지 않습니다.프로세서에는 애니메이션, 물리, AI가 아직 존재하고 있습니다.이것들은 모두 매우 시간이 걸립니다.
Java는 콘솔에 존재하지 않으며 콘솔은 상용 게임의 주요 타깃입니다.PC에서 Java를 사용하면 합리적인 시간 및 예산 내에서 콘솔에 이식할 수 없습니다.
게임업계에서 경험이 풍부한 많은 코더들은 자바가 대중화되기 훨씬 전부터 C와 C++를 사용해 왔다.위의 두 가지 점이 이에 기여할 수 있지만, 많은 프로 게임 코더들이 자바에 대해 잘 알지 못할 것으로 예상됩니다.
Someone else's point about middleware above was a good one, so I'm adding it to my answer. There's a lot of legacy code and middleware written specifically to link with C/C++, and last I checked Java doesn't have good interoperability. Using Java for most companies would involve throwing out a lot of code, much of which has been paid for in one way or another.
Actually, it is very possible for managed code to do 3d games, the problem is the back engines. With .Net, for a brief period, there was a Managed DirectX wrapper to DirectX 9 by Microsoft. This was before the abstraction that is now XNA.
Being given total access to DirectX api's, .Net games work a treat. The best example I know of is www.entombed.co.uk, which is written in VB.Net.
Unfortunately, on the Java side, it is seriously lacking - mainly for the reason that DirectX isn't available for Java, and games programmers know and understand the DirectX api - why learn yet another api when you will be returning to DirectX?
Game marketing is a commercial process; publishers want quantifiable low-risk returns on their investment. As a consequence, the focus is usually on technology gimmicks (with exceptions) that consumers will buy to produce reliable return - these tend to be superficial visual effects such as lens glare or higher resolution. These effects are reliable because they simply use increases in processing power - they exploit the hardware/Moore's law increases. this implies using C/C++ - java is usually too abstracted from the hardware to exploit these benefits.
I'd guess that speed is still the issue. Cross platform is going to be an issue isn't it since you don't know what 3d card is available when you write the code? Does java have anything to support auto discovery of 3d capabilities? And I'd guess that there are tools to ease porting a game between the wii, xbox, and ps3, but expensive I'll bet.
The ps3 has java, via the blue ray support. Check the bd-j site.
Even games written on the .Net platform are often highly optimized for speed like direct access to memory and bus. .Net allows to use C / C++ and mix it with higher level languages such as C#.
Game development studios often work close together with hardware vendors, which do provide access to low level interfaces of their products. This is a world, where you have to use ASM and C for device communication. A virtual environment would slow down these program parts.
Anyway, modern 3D games in fact do use higher level languages. Often, you'll find the game logic written in languages like Lua or Python. But the core (I/O, threads, task scheduling) of the typical 3D game will be written in low level languages for the next 25 years or as long devices do not allow abstraction and virtualization by themself (which will come).
I agree with the other posts about leveraging elements of a preexisting/licensed codebase, performance, etc.
One thing I'd like to add is it's hard to pull nasty DRM tricks through a virtual machine.
Also I think there's a hubris component where project managers think they can make stable/reliable code with C++ with all the perks like having absolute control over their tools and resources, BUT without all the negatives that complicate and bog down their competition because "we're smarter than they are".
Runescape by Jagex is written in Java, the "video game" tag might not specifically apply it being an on-line game, but it does have a decent following.
It was talked about it a lot already, u can find even on Wiki the reasons...
- C/C++ for the game engine and all intensive stuff.
- Lua or Python for scripting in the game.
- Java - very-very bad performance, big memory usage + it's not available on Game Consoles(It is used for some very simple games(Yes, Runescape counts in here, it's not Battlefield or Crysis or what else is there) just because there are a lot of programmers that know this programming language).
- C# - big memory usage(It is used for some very simple games just because there are pretty much programmers that know this programming language).
And I hear more and more Java programmers that try to convince people that Java is not slow, it is not slow for drawing a widget on the screen and drawing some ASCII characters on the widget, to receive and send data through network(And it is recommended to use it in this cases(network data manipulation) instead of C/C++)... But it is damn slow when it comes to serious stuff like math calculations, memory allocation/manipulation and a lot of this good stuff.
I remember an article on MIT site where they show what C/C++ can do if u use the language and compiler features: A matrix multiplier(2 matrices), 1 implementation in Java and 1 implementation in C/C++, with C/C++ features and appropriate compiler optimisations activated, the C/C++ implementation was ~296 260 times faster than the Java implementation.
I hope you understand now why people use C/C++ instead of Java in games, imagine Crysis in Java, there would not be any computer in this world which could handle that... + Garbage collection works ok for Widgets which just destroyed an image but it's still cached in there and needs to be cleaned but not for games, for sure, u will have even more lags on every garbage collection activation.
Edit: Because somebody asked for the article, here, I searched in the web archive to get that, I hope you are satisfied...MIT Case Study
And to add, no, Java for gaming is still an awful idea. Just a few days ago a big company that I will not name started rewriting their game client from Java to C++ because a very simple game(In terms of Graphics) was lagging and heating i7 Laptops with powerful nVidia GT 5xx and 6xx generation video cards(not only nVidia, the point here is that this powerful cards that can handle on Max settings most of the new games and can't handle this game) and the memory consumption was ~2.5 - 2.6 GB Ram. For such simple graphics it needs a beast of a machine.
ReferenceURL : https://stackoverflow.com/questions/1034458/why-are-only-a-few-video-games-written-in-java
'programing' 카테고리의 다른 글
디렉토리가 있는지 확인하는 휴대용 방법 [Windows/Linux, C] (0) | 2022.07.29 |
---|---|
c에서 벡터를 복제하는 방법? (0) | 2022.07.29 |
Vue 3 Modal이 다시 열 때 이전 데이터를 가지고 돌아오다 (0) | 2022.07.28 |
C코드로 ":-!"가 뭐죠? (0) | 2022.07.28 |
C/Objective-C에서 문자열 리터럴을 여러 줄로 분할하려면 어떻게 해야 합니까? (0) | 2022.07.28 |