[java] Java로 작성된 비디오 게임이 왜 소수입니까? [닫은]

Java로 작성된 상업용 3D 비디오 게임 (랜덤 오픈 소스 2D가 아닌)이 많지 않은 이유는 무엇입니까? 이론적으로는 많은 의미가 있습니다. 거의 많은 Java 라이브러리 및 내장 가비지 수집과 같은 것 중에서 생산성 향상과 크로스 플랫폼 응용 프로그램이 거의 무료로 제공됩니다. 후자가 좋은 것인지 확실하지 않습니다). 왜 거의 사용되지 않습니까? Java 플랫폼 용으로 작성된 몇 가지 인기있는 상용 게임 만 생각할 수 있습니다.

성능 때문입니까? 그렇다면 GPU가 대부분의 무거운 작업을 수행하지 않습니까?



답변

게임 개발 세계는 재밌습니다. 한편으로는 종종 새로운 아이디어를 빨리 받아들이고 다른 한편으로는 여전히 석기 시대입니다.

사실, .NET / Java / C / C ++ 이외의 다른 것으로 전환 할 때 많은 인센티브가 거의 없습니다.

대부분의 게임 회사는 다른 회사로부터 게임 엔진의 일부를 라이센스합니다. 이러한 부분은 C ++로 작성되었으며 소스에 액세스하여 이식 할 수 있지만 많은 노력이 필요합니다 (물론 라이센스가 허용해야 함).

또한 C ++에는 많은 레거시 코드가 이미 존재합니다. 이전 프로젝트의 코드를 재사용 할 수 있다면 (예를 들어, 속편을 쓰는 경우), 새로운 언어로 코드를 다시 쓰지 않고 같은 언어를 고수하는 것을 선호합니다 (더 많은 내용은 다시 소개 할 것이므로) 다림질하는 데 시간이 걸리는 수많은 버그.

마지막으로, 게임이 100 % C ++로 작성되는 경우는 거의 없습니다. 스크립트 언어를 사용하여 맞춤 언어를 사용하든 기존 언어를 통합하든 (루아는 요즘 가장 인기있는 언어 중 하나임) 많은 작업이 이루어집니다.

가비지 수집과 관련해서는 약간의 문제가 될 수 있습니다. 문제는 그다지 많지 않고 작동 방식이 더 큽니다. 가비지 수집기는 반드시 10 초 동안 게임을 정지시킬 수 없기 때문에 가비지 컬렉터는 반드시 비 차단이어야합니다. 할당 된 모든 메모리를 스캔하여 사용 가능한 메모리를 확인합니다. Java가 메모리 부족에 가까워지면 GC에서 상당히 질식하는 경향이 있다는 것을 알고 있습니다.

또한 수행 할 수있는 작업에 약간 제한이 있습니다. 런타임 오버 헤드로 인해 하드웨어를 완전히 활용할 수 없습니다. 크라이시스가 자바로 작성되었다고 상상해보십시오 … 유일한 눈에 띄는 차이점이더라도 동일하지는 않습니다 (또한 실행하려면 Core i7이 필요하다고 확신합니다).

그렇다고해서 이러한 언어가 게임 개발에 자리를 차지하지 않는다는 것은 아닙니다. 아니요, 저는 단지 도구 프로그래밍을 언급하는 것이 아닙니다. 대부분의 게임의 경우 3D 게임을 포함하여 C ++에서 얻는 추가 성능이 필요하지 않으며 처음부터 모두 작성하는 경우 XNA와 같은 것을 사용하는 것이 좋습니다. 좋은 기회입니다.

상용 게임에 관한 한 RuneScape는 중요합니까? 그것은 가장 성공적인 Java 게임 일 것입니다.


답변

John Carmack이 다음과 같이 가장 잘했다고 생각합니다.

가장 큰 문제는 Java가 실제로 느리다는 것입니다. 순수한 CPU / 메모리 / 디스플레이 / 통신 수준에서 대부분의 최신 휴대 전화는 Game Boy Advanced보다 훨씬 더 나은 게임 플랫폼이어야합니다. Java를 사용하면 대부분의 전화에서 원래 4.77mhz IBM PC의 CPU 성능과 모든 것을 완벽하게 제어 할 수 있습니다. [… snip …] 언제 어디서나 쓸 수 있습니다. 하아. 하 하하하 우리는 현재 4 개의 플랫폼에서만 테스트 중이며, 한 쌍이 정확히 같은 특징을 가지고 있지는 않습니다. 모든 상용 게임은 각 플랫폼 (종종 100 개 이상)에 대해 개별적으로 조정 및 컴파일됩니다. 이식성은 끔찍한 성능에 대한 정당화가 아닙니다.

( 소스 )

물론 그는 모바일 플랫폼에 대해 이야기하고 있었지만 C ++ 배경에서 온 Java와 비슷한 문제를 발견했습니다. 내 자신의 말로 스택 / 힙에 메모리를 할당 할 수 없다는 것을 잊어 버렸습니다.


답변

우선, Java의 연산자 오버로드가 없기 때문에 작동하는 그래픽 파이프 라인을 매우 성 가시고 읽기 어려워지기 위해 처리해야 할 모든 수학이 만들어집니다.

처리해야하는 모든 행렬 곱셈 및 아핀 벡터는 객체 지향 표현식이 아닌 올바른 형식의 수학 표현식 인 경우 따라 가기가 훨씬 쉽습니다.

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

그건 끔찍 해요 수학은 그렇게 보이지 않아야합니다.


답변

.NET은 Java와 동일한 인식 문제를 가지고 있다고 생각합니다. Microsoft는 XNA를 사용하여 개발자에게 마케팅에서 더 나은 작업을 수행했습니다.


답변

사소한 점부터 :

  • Java의 생산성 향상은 가상적인 것입니다. 이 구문은 C ++과 거의 동일하므로 메모리 관리 및 표준 라이브러리를 통한 비용 절감에 도움이됩니다. 라이브러리는 게임 개발자를 거의 제공하지 않으며 메모리 관리는 가비지 수집으로 인해 논쟁의 여지가있는 문제입니다.

  • 크로스 플랫폼 “무료”는 생각하는 것만 큼 좋지 않습니다. OpenGL을 사용하려는 개발자는 거의 없으며 몇몇 주요 플랫폼에는 그래픽, 오디오, 네트워킹 등의 기본 라이브러리에 대한 Java 구현 또는 래퍼가 없을 것입니다.

그러나 주로 문제는 이전 버전과의 호환성입니다. 게임 개발자는 마이그레이션 경로가 매끄 럽기 때문에 C에서 C ++로, 어셈블리에서 C로 옮겼습니다. 각 코드는 이전 코드와 밀접하게 연동되며 이전 코드는 모두 단일 컴파일러를 통해 새로운 언어로 사용할 수 있습니다. 따라서 마이그레이션은 원하는 속도만큼 느리거나 빠릅니다. 예를 들어 오늘날 사용중인 일부 기존 헤더에는 여전히 #ifdef WATCOMC가 있습니다.그리고 나는 10 년 이상에 아무도 Watcom 컴파일러를 사용하지 않았다고 생각합니다. 이전 코드에는 막대한 투자가 있으며 각 비트는 필요한 경우에만 교체됩니다. 기존 코드와 기본적으로 상호 운용되지 않는 언어로 변경 한 경우 한 게임에서 다음 게임으로 비트 및 조각을 교체하고 업그레이드하는 과정은 그다지 실용적이지 않습니다. 그렇습니다. C ++ / Java 상호 운용성은 가능하지만 단순히 “C를 약간의 C ++로 작성”하거나 C에 asm 블록을 포함시키는 것과 비교하면 매우 비현실적입니다.

게임 개발자가 선택한 언어로 C ++을 올바르게 대체하려면 다음 두 가지 중 하나를 수행해야합니다.

  1. 기존 레거시 코드와 쉽게 상호 운용 가능하므로 투자를 유지하고 기존 라이브러리 및 도구에 대한 액세스를 유지하거나
  2. 모든 코드를 다시 작성하는 비용 (또는 해당 언어에서 사용할 수있는 재사용 가능한 구성 요소로 인터페이스를 재 작업하는 데 드는 비용)이 포함되어 있다는 점에서 생산성 향상을 충분히 보여줍니다.

주관적으로, 나는 자바가 그 둘 중 하나를 충족한다고 생각하지 않는다. 누군가가 파이오니아가 될만큼 용감하다면, 더 높은 수준의 언어가 2 차 언어를 충족시킬 수 있습니다. (EVE Online은 아마도 우리가 파이썬을 사용할 수있는 가장 좋은 예일 것입니다. 그러나 주요 파이썬 언어의 포크, 많은 C ++ 구성 요소를 성능에 사용하며 심지어 현대적인 측면에서 상당히 요구되지 않는 게임을위한 것입니다.)


답변

나는 심즈 3을 연주하고 있으며, 주변을 파고 들었습니다. 그래픽 엔진은 C ++이고 스크립팅 및 동작 엔진은 C # / Mono입니다. 따라서 C ++에는 시간 결정적인 비트, .interaction, 게임 로직과 같은 다른 것들이 있지만 AI는 객체 지향 관리 언어입니다.


답변

  • 게임 엔진 / 라이브러리 포트가 있습니까?
  • 많은 C / C ++ 개발자, 특히 Windows (대부분의 상용 게임이 작성된 곳) 개발자는 Visual Studio에 익숙합니다. IDE에는 비교가 없습니다.
  • 일반적으로 Java는 타이핑이 견고하고 메모리 관리 문제가 없다는 인식으로 인해 비즈니스에 판매되었습니다.
  • 그리고 그렇습니다 .Java는 여전히 느리다는 인식에 시달리고 메모리 관리가 좋지 않으며 게임의 경우 작업에 적합하지 않을 수 있습니다. 다른 답변 중 일부에서 언급했듯이 가비지 수집은 실시간 고성능 요구 사항을 처리 할 때 가비지 수집을 줄이지 않습니다. 비디오 게임은 CPU와 GPU를 한계까지 밀어 넣습니다.