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


171

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

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



1
다시 : mmyers; 2005 년에도 그 게임이 "최고의 그래픽"상을 수상했다는 사실에 다소 충격을
받습니다

2
예. 그러나 대부분의 "실제 게임"은 관리되는 .net에서 만들어지지 않습니다. 그들은 오래된 학교 c / c ++에서 만들어 졌습니까?
Hardwareguy

14
Runescape는 Java로 작성되었습니다.
GameFreak 2016 년

44
Minecraft는 Java로 작성되었습니다!
daGrevis

답변:


155

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

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

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

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

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

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

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

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

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


16
JVM에서 크라이시스를 실행하지는 않을 것입니다. 지옥, 그 게임을 어셈블리 언어로 코딩했다면 여전히 전체 설정에서 게임을 실행하려면 슈퍼 컴퓨터가 필요합니다. 그러나 통찰력이 뛰어나면 +1입니다. 감사합니다.
Sasha Chedygov

15
Unreal Tournament 3 또는 Crysis와 Runescape를 비교할 수 없습니다. 그래픽 품질이 중요한 경우 가능한 한 적은 오버 헤드로 낮은 수준의 언어를 사용해야합니다. 물론 그래픽이 주요 판매 지점이 아닌 Indy 또는 게임의 경우 Java는 C / C ++의 훌륭한 대안입니다.
GuiSim 2016 년

6
@GuiSim : 대부분의 게임에서 그래픽 품질은 주요 판매 지점이 아닙니다. 내가 생각할 수있는 몇 가지 게임은 그래픽을 염두에두고 만들어진 것입니다 (저는 크라이시스 (Crysis)를 생각하고 있지만 Half-Life 2도 생각하고 있습니다). 나는 대부분의 게임 개발자들이 그래픽이 "충분히 좋은"(일부 다른 게임과 동등한 수준) 인 한 그래픽에 대해 크게 신경 쓰지 않는다고 생각합니다.
Sasha Chedygov

4
그래픽은 언어와 거의 관련이 없습니다. 물리, AI 그래픽.
JulianR 2016 년

10
@JulianR은 장면을 효율적으로 렌더링하기 위해 준비하고 유지하는 데 상당한 작업 부하가있을 수 있으므로 언어 ​​및 관련 언어 오버 헤드가 그래픽에 중요합니다.
KSchmidt 2009

95

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

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

( 소스 )

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


60
그 인용은 2005 년부터 나왔다. 그 이후로 자바 기술과 핸드폰 성능이 상당히 향상되었다. 핸드폰 게임과 PC 게임을 비교하는 것은 사과를 오렌지와 비교하는 것입니다.
Chris Dail

78
존 카맥이 말했다. 경우 폐쇄.
GuiSim 2016 년

41
"자바는 정말 느리다"를 읽으면 불안해집니다. 그것은 $ 55,000 스포츠카가 $ 100k 스포츠카에 비해 느린 것을 말하는 것과 같다. 물론, 속도는 느리지 만 90 %는 작업이 여전히 크며 절반의 비용이 든다.) 화염 전쟁은 의도하지 않았다. 위의 이유가 크라이시스와 같은 게임이 Java로 작성되지 않은 이유에 동의합니다.
Ross

17
@Chris Dail은 Java 성능과 관련된 모든 문제를 강조합니다. Java 성능이 향상 되었습니까? 아니요, 휴대 전화가 더 빨라졌습니다. 게임은 사실주의의 한계를 뛰어 넘기 때문에 하드웨어의 한계를 넘어서며, 한 줄의 코드를 작성하기 전에는 성능의 % 30 ~ 40 %를 버릴 수 없습니다.
cgp

8
나는이 논쟁이 매우 이상하다고 생각한다. Java ME는 Android의 Java와 동일하지 않으며 PC의 Java와 동일하지 않습니다. Java ME는 일반적으로 전화 제조업체에 의존하여 JVM을 고안했습니다. 어떤 사람들은 잘 해냈고 어떤 사람들은 잘하지 못했습니다. Carmack이 그들에 대해 불평 한 것도 당연합니다. 안드로이드에는 JVM이 아닌 자체 VM이 있습니다. 그리고 그것은 (내 관점에서) 심각한 문제가 있습니다. Oracle의 HotSpot VM은 두 경우와 완전히 다릅니다. 사람들이이 모든 것을 비교한다면, 내가 결론을 내릴 수있는 유일한 것은 그들이 무엇을 말하는지 모른다는 것입니다.
Malcolm

54

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

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

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

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


19
저는 96 년에 썬의 디자이너 중 일부가 버클리에서 Java에 대한 프레젠테이션을하고 있었다고 생각합니다. William Kahan ( en.wikipedia.org/wiki/William_Kahan )은이 문제를 다루지 못했습니다. :)
JP Alioto

13
사람들이 언어를 사용하지 못하도록 언어로 연산자 오버로드를 허용하지 않는 좋은 이유가 있다고 생각합니다. 그것은 강력한 도구이며 수학에는 매우 시원하지만 다른 모든 것에 위험합니다. 코더가 게으 르기 때문에 코드를 단축하기 위해 코드를 잘못 사용하는 경향이 있으며, 사람들이 iterable에 함수를 곱한 맵을 시작하는 순간 또는 모든 산술 연산이 함수에 대해 정의 된 경우에도 코드 가독성은 0에 도달합니다. 예, 코드를 이식하는 데 많은 시간을 보냈습니다. : -S 디자인 선택입니다. 디자인 선택은 항상 논쟁의 여지가 있습니다.
back2dos

19
나쁜 사과 몇 개를 위해 다른 사람을 모두 처벌 하시겠습니까? 이것이 제가 C #을 선호하는 이유 중 하나입니다. 연산자 오버로드가 정말로 필요한 경우 거기에 있습니다.
ChaosPandion 2009

1
기본적으로 연산자 오버로드는 OOP 디자인 (벡터, 행렬, 복소수)의 2-3 가지 상황에만 적합합니다. 대부분의 다른 상황에서는 너무 느슨하게 정의되어 있으며 사용 방법을 알고있는 사람들조차도 조잡한 코드, 약한 구문 및 문서화 부족으로 이어집니다. 나는 이것이 썬이 자바에서 이것을 사용하지 않기로 선택한 이유라고 생각하며 이것이 올바른 결정이라고 생각합니다.
bgroenks 2016 년

1
@MMJZ : 람다 식은 연산자 오버로드와 어떤 관련이 있습니까?
Sasha Chedygov

26

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


10
XNA를 사용하면 .NET 응용 프로그램을 XBox에 배포 할 수도 있습니다. Java에 대해 그다지 매끄러운 것을 보지 못했습니다.
StriplingWarrior 2016 년

Zune에도 배포 할 수 있습니다.
cbeuker 2016 년

오래된 질문이지만 업데이트하기 위해 이제 Windows Phone 용 XNA 게임도 작성할 수 있습니다 :-)
Joel Martinez

3
@JoelMartinez 또 다른 업데이트 : Windows Phone 8 용 XNA 게임을 작성할 수 없습니다.
Tomas Andrle

@TomA은 WP8에 대한 쓰기 monogame 게임을 할 수있게되었습니다
알렉스 라파

17

사소한 점부터 :

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

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

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

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

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

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


EVE Online은 1000 대 대 1000 대 플레이어 대 플레이어 전투가 일반적이며 성능 측면에서 까다로운 시나리오로 계산 될 수있는 '온라인'공간 시뮬레이션입니다. 속도 집약적 인 부분은 C / C ++로 작성되었지만 게임에서 고급 언어 (Python)를 사용하는 문제에 대한 흥미로운 연구입니다.
Hakan Deryal

그러나 멀티 플레이어 서버 측 게임의 성능은 싱글 플레이어 클라이언트 측 게임의 성능과 약간 다른 메트릭스로 측정된다는 점을 기억하십시오. 전자는 처리량에 더 관심이 있고 후자는 대기 시간이 있습니다.
Kylotan

그렇습니다. 그러나 전투에는 2000 개 이상의 발사체 (미사일, 애니메이션 포함), 폭발 등이 있으며 화면에 2000 개 이상의 함선이 포함되어 있으며 그래픽 성능이 약간 필요합니다. 어쨌든 자세한 답변에 감사드립니다.
Hakan Deryal 8

1
C & Java 구문이 동일하고 성능과 관련이 있다고 생각하면 실제로 무슨 일이 일어나고 있는지 이해할 수 없습니다. C는 런타임에 주어진 함수가 동일한 매개 변수로 반복적으로 호출되고 있음을 어떻게 결정하고 매개 변수의 편차가있을 때 함수 호출을 유지하면서 전체 함수 호출을 상수로 대체 할 수 있습니까? 나는 런타임이 항상 더 좋거나 더 나쁘다는 것을 말하지 않고 단지 구문과 관계가 없다는 것입니다!
Bill K

1
@BillK-잘못 읽은 것 같습니다. 나는 '성능'이 아닌 '생산성'과 관련해서 만 구문을 언급했습니다. JIT 최적화가 이론상 Java를 더 빠르게 만들 수는 있지만 실제로는 게임 소프트웨어에서는 그렇지 않습니다.
Kylotan

12

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


5
그런 다음 Mac 버전의 경우 수정 된 Wine 가상 머신에 모든 것을 넣습니다. 여전히 자바에서 생각하는 것보다 훨씬 빠릅니다. :-)
Ben Gotow

10
Wine은 가상 머신이 아니며 Windows 런타임 라이브러리의 동작을 모방하는 런타임 라이브러리입니다. 따라서 이름은 (와인은 에뮬레이터가 아닙니다).
Nate CK

2
이것은 게임에서 매우 일반적이며 시간이 중요하지 않은 논리는 일종의 스크립팅 언어 (일반적으로 루아 또는 파이썬)로 작성됩니다.
KSchmidt 2009

그러나 바닐라 모노는 아닙니다. EA는 자체 맞춤형 CLR 풀 타임으로 작업하는 특수 팀이 필요했습니다.
Crashworks

4
Sims 3는 우수한 컴퓨터에서도 성능이 좋지 않은 것으로 유명합니다.
Lotus Notes

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

1
굵은 글씨는 +1입니다. 사람들은 게임이 20fps에서 실행될 때 종종 20fps의 하드웨어에 묶여 있다는 것을 인식하지 못하는 것 같습니다. 정말 30+ fps에 도달하고 싶지만 할 수는 없습니다.
GuiSim 2016 년

나는 성능 측면에서 문제가되는 것은 GC 일뿐 만 아니라 느린 시작 단계와 결합 된 것조차도 일반적인 성능 문제라고 생각하지는 않지만 그저 나뿐입니다.
rogerdpack 2016 년

2
나는이 시점에서 과거보다 동의 할 가능성이 더 높다고 생각한다. JVM 최적화가 향상되었습니다. 그러나 JavaScript 및 다른 언어와 같이 느슨하게 입력 된 언어의 성능 향상 측면에서 Java의 성능은 거의 변명 할 수 없습니다. Java 성능에 대한 많은 사과가 있습니다. (그러나 결국 인식 된 성능이 중요합니다) '
cgp

10

Java 및 기타 가상 머신 언어가 게임에 사용되지 않는 가장 큰 이유 중 하나는 가비지 콜렉션 때문입니다. .NET도 마찬가지입니다. 가비지 콜렉션은 먼 길을 왔으며 대부분의 애플리케이션에서 훌륭하게 작동합니다. 가비지 수집을 수행하려면 휴지통을 수집하기 위해 응용 프로그램을 일시 중지하고 중단해야합니다. 수집이 발생할 때주기적인 지연이 발생할 수 있습니다.

Java는 실시간 응용 프로그램에 대해 동일한 문제가 있습니다. 특정 시간에 작업을 실행해야하는 경우 가비지 수집과 같은 자동화 된 작업을 수행하기가 어렵습니다.

Java가 느리다는 것은 아닙니다. Java는 실시간 작업을 잘 처리하지 못합니다.


1
그러나 Java를 새로운 환경으로 포팅하기 위해 가비지 콜렉터에 대한 고유 스케줄러를 작성할 수 있습니다. 메모리는 어느 방식 으로든 재생되어야하며 실시간 환경에서는 언제 어디서나 GC를 예약 할 수있는 옵션을 가질 수 있습니다. C / C ++가 이미 당신을 위해 할 때 원하는 일을하기 위해 Java를 아키텍처로 이식 할 이유가별로 없다는 점으로 돌아 가야합니다. Java는 다른 곳에서 빛납니다.
San Jacinto

5
이것은 1990 년대가 아닙니다. 가비지 콜렉터는 일시 중지가 낮게 조정되었을 때 매우 좋습니다.
Tom Hawtin-태클 라인

8

가장 큰 이유는 비디오 게임이 종종 하드웨어에 대한 직접적인 지식을 필요로하기 때문에 많은 아키텍처에 대한 훌륭한 구현이 실제로 없기 때문입니다. 개발자가 게임 시스템에서 모든 성능을 끌어낼 수있는 기본 하드웨어 아키텍처에 대한 지식입니다. 왜 Java를 게임 플랫폼으로 이식 한 다음 게임을 작성할 수있을 때 해당 포트 위에 게임을 작성해야합니까?

편집 : 이것은 "속도"또는 "올바른 라이브러리가 없습니다"문제 이상이라고 말합니다. 이 두 가지는 이것과 함께 진행되지만 "셀과 같은 시스템을 Java 코드로 실행하려면 어떻게해야합니까?"실제로 파이프 라인과 벡터를 관리 할 수있는 좋은 자바 컴파일러는 없습니다. "필요한 것 같아요."


7

성능 문제가 첫 번째 이유입니다. Quake 엔진 ( http://www.codemaestro.com/reviews/9) 에있는 하이퍼 최적화 C ++ 코드의 종류를 볼 때 ) 되면 가상 머신으로 시간을 낭비하지 않을 것입니다.

물론 일부 .NET 게임이있을 수 있습니다 (관심이 있습니까? 실제로 CPU / GPU를 많이 사용하는 게임이 있습니까?). 많은 사람들이 MS 기술의 전문가이기 때문에 시작했을 때 Microsoft를 따랐기 때문에 더 많은 것으로 추측됩니다. 그들의 새로운 기술.

아, 그리고 크로스 플랫폼은 비디오 게임 회사의 마음에 있지 않습니다. Linux는 시장의 약 1 %, Mac OS는 몇 % 더 높습니다. 그들은 분명히 Windows 전용 기술과 DirectX와 같은 라이브러리를 버릴 가치가 없다고 생각합니다.


3
"크로스 플랫폼은 단지 비디오 게임 회사의 마음에 있지 않습니다."– 이것이 내가하는 회사를 전적으로 존중하는 이유입니다. :)
Sasha Chedygov

크로스 플랫폼과 오픈 소스 모두에 헌신 한 Carmack에게 감사드립니다. 나는 대부분의 회사가 생각하는 것을 간단히 언급했다.
Ksempac 2016 년

1
사실입니다. Linux로 포팅 된 인기있는 비디오 게임이 많지 않습니다. :(
Sasha Chedygov

크로스 플랫폼은 단순한 크로스 OS가 아닙니다. PS3, Xbox 360, Wii를 생각해보십시오.
JulianR 2016 년

"그들은 가상 머신으로 시간을 낭비하지 않을 것입니다." en.wikipedia.org/wiki/Quake_III_Arena#Virtual_machine , Carmack은 게임 로직을 위해 자체 제작했습니다.
James McMahon

4

웹 응용 프로그램이 C 또는 C ++로 작성되지 않은 이유를 물을 수 있습니다. Java의 힘은 네트워크 스택 및 객체 지향 디자인에 있습니다. 물론 C와 C ++도 마찬가지입니다. 그러나 더 낮은 추상화에서. 그건 부정적인 일이 아니지만 매번 바퀴를 재발 명하고 싶지 않습니까?

Java에는 직접적인 하드웨어 액세스 권한도 없으므로 모든 프레임 워크의 API에 갇혀 있습니다.


자바는 "JNI '를 통해 네이티브 코드를 호출 할 수 있습니다
바트 밴 Heukelom

4
...하고있는 동안 휴대 성을 잃어 버리세요!
LiraNuna 2009

1
JNI를 사용할 때 이식성이 크게 떨어지지 않습니다. 지원하려는 플랫폼에서 네이티브 라이브러리를 여전히 컴파일 할 수 있다면 기본적으로 모든 코드가 아닌 코드의 1 % 만 이식 / 재 컴파일하면됩니다. 여전히 Java 이식성에서 많은 이점을 얻을 수 있습니다.
bgroenks 2016 년

4

성능과 잘못된 JVM 최적화에 대한 오해가 제 추측입니다. C ++에 비해 C ++ 게임의 일부 Java 포트가 더 빠르기 때문에 성능에 대한 오해가 있습니다 (제이크 2 참조). 실제 문제인 IMHO는 많은 Java 프로그래머가 사용하기 쉽고 코드의 이해성 / 유지 보수성이 뛰어나 최첨단 성능에 크게 집중하지 않는다는 것입니다. C / C ++ 측면에서는 본질적으로 약간 더 높은 수준의 어셈블리 언어로 코딩하고 어셈블리 또는 기계 코드를 작성하지 않고도 얻을 수있는 하드웨어에 가깝습니다.


"어셈블리로 쓰지 않고 얻을 수있는 하드웨어에 가깝다면"코딩이 끔찍하지 않으면 자바가 이길 수 없다. 하드웨어에 가까울수록 더 빨리 얻을 수 있습니다.
Josh Johnson

4

Wikipedia 의 게임 엔진 목록 에는 작성된 게임 언어와 함께 많은 게임 엔진이 나열되어 있습니다.

몇 가지 Java 게임 엔진이 나열되어 있습니다.

링크 중 일부를 클릭하면 Java로 작성된 게임 및 데모 예제로 연결됩니다. 몇 가지 있습니다 :

특정 게임과 상황에서 Java의 트레이드 오프가 허용 될 수 있습니다.


Java로 작성된 게임 이 존재 한다는 것을 알고 있습니다 . 그러나 Minecraft 및 Runescape 외에도 Java 플랫폼 용으로 제작 된 주류 상용 게임은 거의 없습니다. Java로 작성된 AAA 제목은 몇 개입니까? 왜 그렇게 적은가? 따라서 내 질문.
Sasha Chedygov

3

.NET은 Java가 강렬한 3D 성능과 관련하여 동일한 문제를 가지고 있습니다. Microsoft는 또한 3D 작업이 많은 작업을 할 때 라이브러리 개발에 더 많은 시간과 비용을 투자했습니다.

(... 개인적으로 DirectX와 .NET 간의 마법에 관해서는 다리가 있다고 생각합니다)


2
  1. 자바는 느리다. 대부분의 무거운 작업은 GPU에 의해 처리되지 않는다. 여전히 CPU에 타격을 가하는 애니메이션, 물리학 및 인공 지능이 있지만 모두 시간이 많이 걸립니다.

  2. 콘솔에는 Java가 없으며 콘솔은 상업용 게임의 주요 대상입니다. PC에서 Java를 사용하는 경우 합리적인 시간과 예산 내에서 콘솔로 이식 할 수있는 능력이 없어집니다.

  3. 게임 업계에서 경험이 많은 많은 코더들이 Java가 대중화되기 훨씬 전에 C와 C ++를 사용해 왔습니다. 위의 두 가지 점이 이것에 기여할 수 있지만 많은 전문 게임 코더가 Java를 잘 모르는 것으로 기대합니다.

  4. 위의 미들웨어에 대한 다른 사람의 견해가 좋았으므로 대답에 추가하고 있습니다. C / C ++와 연결하기 위해 특별히 작성된 많은 레거시 코드와 미들웨어가 있으며 마지막으로 Java가 상호 운용성이 좋지 않다는 것을 확인했습니다. 대부분의 회사에서 Java를 사용하면 많은 코드를 버리게되는데, 그 중 많은 부분이 어떤 방식 으로든 지불되었습니다.


3
JavaCL, JOCL 또는 APARAPI를 사용하여 많은 부분을 GPU로 오프로드 할 수 있습니다.
bgroenks

2

실제로 관리되는 코드가 3D 게임을 수행하는 것이 매우 가능합니다. 문제는 백 엔진입니다. .Net을 사용하면 Microsoft의 DirectX 9에 대한 Managed DirectX 래퍼가있었습니다. 이것은 이제 XNA 인 추상화 이전이었습니다.

.Net 게임은 DirectX API에 대한 전체 액세스 권한을 부여받습니다. 내가 아는 가장 좋은 예는 www.entombed.co.uk이며 VB.Net으로 작성되었습니다.

불행히도 Java 측면에서는 Java에 DirectX를 사용할 수 없으며 게임 프로그래머가 DirectX API를 알고 이해하는 이유 때문에 심각하게 부족합니다. DirectX로 돌아올 때 또 다른 API를 배우는 이유는 무엇입니까?


2

게임 마케팅은 상업적 프로세스입니다. 게시자는 투자에 대한 수량화 가능한 저 위험 수익을 원합니다. 결과적으로 소비자가 신뢰할 수있는 수익을 창출하기 위해 구매할 기술 특수 효과 (예외 제외)에 중점을 둡니다. 렌즈 눈부심 또는 고해상도와 같은 피상적 시각 효과 인 경향이 있습니다. 이러한 효과는 단순히 처리 능력의 증가를 사용하기 때문에 신뢰할 수 있습니다-하드웨어 / 무어의 법칙 증가를 이용합니다. 이것은 C / C ++를 사용한다는 것을 의미합니다. java는 일반적으로 이러한 이점을 활용하기 위해 하드웨어에서 너무 추상화되었습니다.


1

속도가 여전히 문제라고 생각합니다. 코드를 작성할 때 어떤 3D 카드를 사용할 수 있는지 모르기 때문에 크로스 플랫폼이 문제가되지 않습니까? Java에 3D 기능의 자동 검색을 지원하는 것이 있습니까? 그리고 wii, xbox 및 ps3 사이에 게임을 쉽게 이식 할 수있는 도구가 있다고 생각하지만 비싸지 않을 것입니다.

PS3는 블루 레이 지원을 통해 자바를 가지고 있습니다. bd-j 사이트를 확인하십시오.


1

.Net 플랫폼에서 작성된 게임조차도 종종 메모리 및 버스에 대한 직접 액세스와 같은 속도에 매우 최적화되어 있습니다. .Net에서는 C / C ++를 사용하고이를 C #과 같은 고급 언어와 혼합 할 수 있습니다.

게임 개발 스튜디오는 종종 제품의 저수준 인터페이스에 액세스 할 수있는 하드웨어 공급 업체와 긴밀히 협력합니다. 이것은 장치 통신을 위해 ASM과 C를 사용해야하는 세상입니다. 가상 환경은 이러한 프로그램 부분을 느리게합니다.

어쨌든 현대의 3D 게임은 실제로 더 높은 수준의 언어를 사용합니다. 종종 Lua 나 Python과 같은 언어로 작성된 게임 로직을 찾을 수 있습니다. 그러나 일반적인 3D 게임의 핵심 (I / O, 스레드, 작업 예약)은 향후 25 년 동안 저수준 언어로 작성되거나 긴 장치가 자체적으로 추상화 및 가상화를 허용하지 않기 때문에 앞으로 나올 것입니다.


1

기존 / 라이센스가 부여 된 코드베이스, 성능 등의 요소 활용에 대한 다른 게시물에 동의합니다.

내가 추가하고 싶은 한 가지는 가상 머신을 통해 불쾌한 DRM 트릭을 풀기가 어렵다는 것입니다.

또한 프로젝트 관리자가 툴과 리소스를 완벽하게 제어하는 ​​것과 같은 모든 특권으로 C ++로 안정적이고 신뢰할 수있는 코드를 만들 수 있다고 생각하는 허브 구성 요소가 있다고 생각합니다. 그러나 "우리" "보다 똑똑하다"


0

Jagex의 Runescape는 Java로 작성되었으며 "비디오 게임"태그는 특별히 온라인 게임에 적용되지 않을 수 있지만 다음과 같은 점은 괜찮습니다.


미안하지만 이것은 실제로 내 질문에 전혀 답하지 않습니다.
Sasha Chedygov

2
그러나이 질문에 대한 맹목적인 진술은 자바로 작성된 게임이 없다는 가정으로 이어지며, 게임의 성공적인 사례를 지적합니다.
Mark Schultheiss

0

그것은 이미 그것에 대해 많이 이야기되었지만, Wiki에서도 이유를 찾을 수 있습니다 ...

  • 게임 엔진 및 모든 집중적 인 작업을위한 C / C ++
  • 게임에서의 스크립팅을위한 Lua 또는 Python.
  • Java-매우 나쁜 성능, 큰 메모리 사용 + Game Consoles에서 사용할 수 없음 이 프로그래밍 언어를 아는 많은 프로그래머).
  • C #-큰 메모리 사용량 (이 프로그래밍 언어를 아는 프로그래머가 많기 때문에 매우 간단한 게임에 사용됩니다).

그리고 사람들이 자바가 느리지 않다고 설득하려고하는 점점 더 많은 자바 프로그래머가 들었습니다. 화면에 위젯을 그리고 위젯에 ASCII 문자를 그려서 네트워크를 통해 데이터를 송수신하는 것이 느리지 않습니다. C / C ++ 대신이 경우 (네트워크 데이터 조작)에 사용하는 것이 좋습니다.)하지만 수학 계산, 메모리 할당 / 조작 및이 좋은 것들과 같은 심각한 것들에 관해서는 느려집니다.

언어 및 컴파일러 기능을 사용하는 경우 C / C ++이 수행 할 수있는 작업을 보여주는 MIT 사이트의 기사를 기억합니다. 행렬 승수 (2 행렬), Java로 1 회 구현, C / C ++로 1 회 C / C ++로 구현 적절한 컴파일러 최적화가 활성화되면 C / C ++ 구현은 Java 구현보다 ~ 296 ~ 260 배 빠릅니다.

사람들이 왜 게임에서 Java 대신 C / C ++를 사용하는지 이해하고 Java에는 Crysis를 상상할 수 있습니다.이 세상에는 처리 할 수있는 컴퓨터가 없을 것입니다 ... + 가비지 수집은 이미지를 파괴 한 위젯에서 작동합니다. 그러나 그것은 여전히 ​​거기에 캐시되어 있으며 게임을 위해 청소해야하지만 반드시 가비지 수집 활성화마다 더 많은 지연이있을 것입니다.

편집 : 누군가가 기사를 요청했기 때문에 여기에서 웹 아카이브를 검색하여 만족시키기를 바랍니다. MIT 사례 연구

그리고 게임용 Java는 여전히 끔찍한 아이디어입니다. 며칠 전, 이름이없는 대기업 은 매우 간단한 게임 (그래픽 측면에서)이 강력한 nVidia GT 5xx 및 6xx 세대 비디오 카드를 갖춘 i7 노트북을 뒤섞 고 가열했기 때문에 게임 클라이언트 를 Java에서 C ++로 다시 작성하기 시작했습니다. nVidia뿐만 아니라 여기에서 요점은 대부분의 새로운 게임의 Max 설정을 처리 할 수 ​​있고이 게임을 처리 할 수없는이 강력한 카드이며 메모리 소비는 ~ 2.5-2.6GB Ram입니다. 이러한 간단한 그래픽을 위해서는 기계가 필요합니다.


10
최신 Java 런타임 및 가상 머신에 대해서는 거의 알지 못합니다. 당신이 언급 한 기사는 10 년 전에 나온 것보다 많을 것입니다. 물론 인용하지 않았기 때문에 아무도 알 수 없습니다. Java에 대한 인식이 오래되었습니다.
bgroenks

2
연구에 따르면 대규모 행렬 곱셈의 경우 2 차원 배열 액세스를 사용하여 데이터에 액세스 할 때 Java가 C로 손실됩니다. 예, 저도 짐작했을 것입니다. 그리고 그것이 정말로 당신에게 문제가된다면, 의심 할 여지가 있으므로 JNI를 가진 이유입니다. Java 코드가 결과를 크게 향상시키기 위해 최적화되었을 수는 있지만 배열의 오버 헤드 검사 오버 헤드는 해당 상황에서 추가됩니다. 마찬가지로, 나는 JIT에 대한 그의 이해가 "빠른 컴파일 = 최고의 코드 생성이 아님"이라고 말할 때 질문합니다. 그렇지 않다면 IBM의 사양을 읽어보십시오.
bgroenks

3
자바는 게임 개발에있어 나쁜 선택이 아니다. Java를 실행하는 성공적인 게임이 많이 있습니다. 일반적으로 최상의 결과를 얻으려면 네이티브 코드 (특히 LWJGL 등)의 도움이 필요합니다. 그러나 100 %가 아닌 1 %의 코드를 이식하고 다시 컴파일 해야하는 경우 큰 도움이됩니다.
bgroenks

1
@bgroenks "100 %"-C / C ++에 대해 전혀 모르는 것 같습니다 ... 게임을 만들 때 항상 크로스 플랫폼 라이브러리 (SDL 및 기타 여러 가지) 또는 프레임 워크 (예 : Qt)를 사용할 수 있습니다. 예를 들어 EA는 모든 게임에 Qt를 사용합니다. Qt는 Java보다 크로스 플랫폼 방식이며 네이티브 코드로 컴파일됩니다.
릴리안 A. 모라 루

2
Qt가있을 때 Java에서 요점을 실제로 보지 못합니다. Qt 코드가 Java 코드보다 더 명확하고 이해하기 쉽고 유지 관리됩니다. 친구에게 왜 C ++을 두려워하는지 물어 보면 항상 포인터를 싫어하고 메모리 할당을 해제한다고 말합니다. 많은 사람들이 C ++의 shared_ptr에 대해 모르는 것 같습니다 ... 저에게 Qt와 C # .NET / C ++ .NET은 쓰는 것이 가장 좋습니다. Java 코드는 일반적으로 예외 처리로 매우 부풀어 오며 일반적으로 오래된 라이브러리가 있습니다. (이것은 대부분 서버 측에서만 잘하고 나머지는 ...) 자주 사용되는 문서입니다.
릴리안 A. Moraru
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.