크로스 플랫폼 게임에는 Java가 적합합니까? [닫은]


13

Java로 게임을 만들고 Windows, Linux 및 Mac에서 작동하도록하고 싶습니다. C #이 이것에 대한 나쁜 선택이라고 확신하며 C 또는 C ++에 대한 경험이 충분하지 않습니다. 플래시를 멀리하고 싶습니다. 따라서 Java가 저에게 적합한 선택입니까? 주로 C #을 사용하고 Java가 비슷하다고 생각하므로 배우기가 어렵지 않을 것이라고 생각합니다. 그러나 그것은 충분히 빠릅니까? Java보다 내 요구에 더 적합한 언어가 있습니까?


8
어떤 스타일의 게임을 원하는지에 따라 다릅니다. 원하는 스타일에 따라 HTML5가 될 수 있으며 java가 아닌 경우 일부 Javascript가 작동합니다.
패트릭 휴즈

Oddlab은 Java 기반 게임 (예 : Tribal Trouble)을 판매합니다. 그들의 엔진에 대한 자세한 내용은 oddlabs.com/technology.php

5
Minecraft는 Java로 작성된 크로스 플랫폼 게임의 좋은 예입니다. 우리 젊은이가 진지한 Minecraft 세션을 위해 친구를 만나면 OSX, Windows 및 Linux에서 재생됩니다.
Kev

2 년 후 C #은 이제 Unity 엔진 및 / 또는 Monogame의 도움을 받아 iOS, Android 및 WP8을 모두 지원합니다.
Magus

답변:


28

Java는 플랫폼 간 게임 작성에 매우 적합합니다. 주요 장점 :

  • 이식성 -일반적으로 Java 게임을 작성하고 대부분의 플랫폼에서 변경되지 않은 상태로 실행될 것으로 예상 할 수 있습니다. C / C ++는 이식성이 뛰어난 다른 옵션이지만 각 플랫폼에 대해 다시 컴파일해야하며 대부분의 경우 라이브러리에는 이식성을 제한하는 플랫폼 별 기능이 있습니다.
  • 성능 -Java 코드는 잘 작성되면 C / C ++를 포함한 다른 언어와 거의 비슷하게 작동합니다. JVM JIT 컴파일러는 매우 좋습니다. Java (예 : Minecraft)에서 최고 품질의 성공적인 게임을 작성할 수 있습니다.
  • 라이브러리 -네트워킹에서 그래픽, 사운드, AI에 이르기까지 게임에서 원하는 거의 모든 기능을 다루는 Java 용 라이브러리는 매우 다양합니다. 대부분의 Java 라이브러리는 오픈 소스입니다.

결정해야 할 주요 결정은 사용할 GUI 프레임 워크입니다. 몇 가지 다른 옵션이 있지만 가장 눈에 띄는 옵션은 다음과 같습니다.

  • jMonkeyEngine- 본격적인 3D 엔진. 3D 게임을 만들고 싶다면 이것이 최선의 선택 일 것입니다. 장면 그래프, 지형 생성 등과 같은 많은 게임 엔진 기능이 포함되어 있습니다.
  • LWJGL -OpenGL에 직접 액세스 할 수있는보다 낮은 수준의 라이브러리입니다. 최대 성능을 원하고 엔진을 처음부터 새로 작성하는 것을 신경 쓰지 않으면 매력적일 것입니다.
  • Swing- 이식성이 뛰어나고 Java 런타임에 포함되므로 추가 종속성이 필요하지 않습니다. 그래픽을 많이 사용하지 않는 2D 게임 (전략 게임, 카드 게임 등)에 좋습니다.
  • Slick -LWJGL을 기반으로하는 2D 게임 라이브러리. 2D 게임을 작성하고 싶지만 여전히 우수한 그래픽 성능 (촬영, 스크롤 플랫폼 게임 등)이 필요한 경우에 적합합니다.
  • JavaFX -Flash와 거의 같은 풍부한 인터넷 응용 프로그램을 위해 설계되었습니다. 아직 많이 사용하지는 않았지만 게임에 좋은 깔끔한 기능이 많이 있습니다. 특히 JavaFX 2.0은 매우 유망합니다.

게임을위한 Java의 주요 단점은 실제로 당신에게 영향을 미치지 않지만 일부 게임 등급과 관련이있는 "가장 큰 경우"와 관련이 있습니다.

  • 3D 엔진 가용성 -위에 나열된 도구와 엔진은 훌륭하지만 여전히 전문 게임 회사에서 사용하는 언리얼 엔진과 같은 C / C ++ 엔진 수준에는 미치지 못합니다. 따라서 수백만 개의 예산으로 주요 FPS를 개발하려는 경우 Java가 첫 번째 선택이 아닐 수 있습니다 .C / C ++는 여전히 여기에서 승리합니다.
  • GC 대기 시간 Java 가비지 수집은 전체적으로 큰 이점이지만 GC주기가 발생하면 약간의 일시 중지가 발생할 수 있습니다. 지연 시간이 짧은 새로운 JVM에서는 훨씬 향상되지만 여전히 지연 시간이 매우 짧은 게임 (1 인칭 슈팅 게임)에게는 문제가 될 수 있습니다. 해결 방법은 http://javolution.org/ 와 같이 대기 시간이 짧은 라이브러리를 사용하는 것이지만 게임보다는 고주파 거래 또는 실시간 시스템에서 더 많은 대상이있는 것 같습니다.
  • 저수준 최적화를 활용하는 능력 부족-Java JIT 컴파일러는 엄청나게 훌륭하지만 여전히 피할 수없는 몇 가지 제약 조건을 적용합니다 (예를 들어 배열에 대한 경계 검사). 이런 종류의 것을 최적화하기 위해 기본 머신 코드 수준의 액세스 권한을 실제로 확보 해야하는 경우 Java보다 C / C ++를 선호 할 것입니다.

고려해야 할 몇 가지 배포 옵션도 있습니다.

  • 애플릿 -브라우저에서 실행되며 사용자에게는 매우 편리하지만 애플릿은 보안상의 이유로 수행 할 수있는 기능이 다소 제한되어 있습니다. 추가 보안 권한을 얻기 위해 애플릿에 서명 할 수 있지만 대부분의 사용자에게는 약간 무서운 프롬프트가 표시됩니다.
  • Java Web Start- 전체 로컬 다운로드가 필요하고 로컬 시스템 리소스에 액세스해야하는보다 정교한 게임에 적합합니다. 또한 플랫폼 독립적 인 방식으로 작동합니다. 아마도 중형 게임이나 애플릿 보안 제한을 피해야하는 게임에 가장 적합한 경로 일 것입니다.
  • 인스톨러 다운로드 -다른 언어와 마찬가지로 Java 게임용 인스톨러를 작성할 수 있습니다. 설치 프로그램에는 일부 플랫폼 별 기능이 있기 때문에 구성 및 테스트 작업이 약간 더 진행됩니다.
  • -HTML5 웹 애플리케이션을 작성하고 서버 측에서 순수하게 Java의 장점을 활용할 수 있습니다. 멀티 플레이어 웹 게임을 고려할 가치가 있습니다.

마지막으로, 다른 JVM 언어도 고려해야합니다. 위에 나열된 Java 플랫폼의 모든 이점이 있지만 일부는 Java보다 언어가 더 좋다고 생각합니다. 스칼라, 클로저 및 그루비가 가장 눈에 띄는 것들이며 위에 나열된 Java 툴과 라이브러리를 모두 사용할 수 있습니다.


1
JWS는 실제로 앱을 브라우저에서 분리하는 것 외에 애플릿을 크게 추가하지 않습니다. 두 경우 모두 OpenGL 라이브러리를 사용하는 경우 코드에 서명하고 싶다고 생각합니다.
피터 테일러

2
로컬 시스템 액세스는 많은 심각한 게임, 특히 멀티 플레이어의 애플릿 제한에 비해 "큰"수준이라고 말하고 싶습니다. HTML5는 깔끔하지만, 여전히 많은 브라우저에서 GL 및 소켓과 같은 중요한 부분을 지원하고 GL 및 소켓과 같은 중요한 비트를 지원하며 오디오는 게임 사용에 적합하지 않습니다.
Patrick Hughes

1
@PatrickHughes, 큰 대화 상자가없는 JWS에서 로컬 시스템 액세스를 원하면 코드에 서명해야하며 서명 된 애플릿에는 일반적으로 로컬 시스템 액세스도 있습니다.
피터 테일러

Inno Setup 을 사용 하여 Java 게임을 배포 할 수도 있습니다 .
Mahmoud Hossam

1
자신의 엔진을 작성하는 데 도움이되는 패키지 목록에 LIBGDX를 추가 할 수 있습니다. 다양한 플랫폼, 심지어 Android 및 OpenGL ES까지의 설정 및 JNI 최적화 기능이 있습니다.
Patrick Hughes

4

Mattine의 Minecraft와 Blocks는 모두 Java로 제작되었으므로 게임 제작에 좋습니다. Java를 사용하는 동안 발생할 주요 문제는 해당 경로로 이동하여 기본 앱을 작성하도록 선택한 경우 모바일 플랫폼으로 포팅하는 것입니다. Android는 별도의 라이브러리가있는 일종의 유명한 Java SE입니다. RIM의 Blackberry는 Java ME를 사용합니다. 이론적으로 iOS는 Java로 프로그래밍 할 수 있지만 Objective-C가 해당 플랫폼에 더 적합한 선택 일 수 있습니다.

Java는 C #과 매우 유사합니다. Java 만 알고도 C # 코드를 이해할 수있는 경우가 많습니다. 그것들은 다른 디자인 철학을 가지고 있지만 최소한의 번거 로움없이 광범위하게 배치 할 수 있습니다. C #은 모바일 배포가 더 어려워지고 비 Windows 플랫폼에 배포하는 데 특정 외부 라이브러리 등에 따라 시간이 많이 걸리거나 어려워 지더라도 게임에 대한 끔찍한 선택은 아닙니다.


1
자바 모바일 : 한 번 컴파일, 어디서나 디버깅 : '(.
deadalnix

0

가장 명백하고 가장 저항력이 적은 방법은 HTML5 + 자바 스크립트 콤보를 사용하는 것입니다. 이를 사용하여 만들어진 모든 응용 프로그램이나 게임은 거의 모든 장치와 브라우저에서 실행됩니다.

장점 :-다양한 플랫폼과 장치에서 게임을 실행하려면 구성이 필요하지 않습니다.

참고 :- 위의 기술을 사용하여 빌드 된 게임은 거의 없지만 키가 작습니다. 그러나 우유로 버터를 만들 수 있다면 치즈는 불가능하지 않다고 생각합니다.


0

Eclipse에서 Scala 및 Scheme Bigloo 를 사용하여 Java 게임 내에서 스트레스 코드 또는 병렬 작업에 JVM을 사용할 수 있습니다 .

Pattern Design 및 UML2를 사용하면 OCL로 코드를 보호 할 수 있으며 Topcased.org에 모두 있습니다.

이러한 툴을 익히는 데는 시간이 걸리지 만, Java의 배경이자 기반이 될 것입니다.


-10

짧은 대답 : 아닙니다.

Java는 이진 실행 파일을 생성하지 않지만 C #에서와 같이 바이트 코드 만 생성하며 (CLI), "열린 환경"에서 심각한 비즈니스에는 두 가지 주요 이유로 좋지 않습니다.

  • 역 엔지니어링에 갇힐 확률은 특히 Java와 같이 오래되고 잘 알려진 언어에서 매우 높습니다.
  • 시스템 성능을 완전히 제어 할 수는 없습니다. Java의 경우 JVM이 전체 제어를 수행하는 데 큰 역할을합니다.

물론 모든 언어에는 자체 라이브러리가 있지만 각 언어마다 많은 양의 라이브러리가 있기 때문에 이것은 실제 문제가 아니며이 주제의 목적이라고 생각하지 않습니다.

전문가 수준에서는 모든 C # 문을 실제 컴퓨터의 어셈블리 코드로 변환 할 수있는 dev-Kit과 같은 규칙을 어길 수있는 것을 찾을 수 있지만, 이런 종류의 접근 방식은 실제로 카드에없는 경우 개방 된 환경에서 제품을 판매하려는 경우 개발을 위해 C 및 C ++ 만 고려하십시오.

실제 환경의 ROM 소스가 일반적으로 공개되지 않고 안드로이드는 오픈 소스로 간주 될 수 있다는 사실을 고려할 때 안드로이드도 실질적으로 폐쇄되어 있기 때문에 모바일 디바이스는 상황이 약간 다릅니다. 실제 장치의 ROM 중 %가 아닙니다. 이 경우 너무 많은 논쟁을 할 수 없으며 모든 것이 이미 준비되어 있으며 모든 플랫폼은 모든 사람이 알고있는 것처럼 고유 한 언어를 가지고 있습니다.

결국 열린 환경 에서이 제품을 판매하려는 경우 닫힌 환경에서 컴파일 된 이진 / 어셈블리 코드를 생성 할 수있는 언어 만 제안 할 수 있습니다. 닫힌 환경에서는 다른 이유로 결정을 내리기가 더 쉽습니다.


7
컴파일 된 바이너리는 바이트 코드 바이너리보다 리버스 엔지니어링하기가 더 어렵다고 생각합니다. 그것에 약간의 진실이있을 수 있지만 많이는 아닙니다. 실제로 CLI 또는 Java 바이트 코드보다 x86 및 x64 디스어셈블러를 사용하는 사람이 더 많을 수 있으며 IDA Pro와 같은 도구가 얼마나 도움이 될 수 있는지에 놀랄 것입니다. 몇 년 전-아마 훨씬 쉬워졌습니다). 난독 화 된 바이트 코드 파일은 리버스 엔지니어링하기가 더 어려울 수 있으며, 대부분의 사람들은 신경 쓸 이유가 거의 없습니다.
Steve314

2
신경 쓸 이유가없는 이유는 무엇입니까? 글쎄, 얼마나 많은 사람들이 자신의 저급 독점 게임 엔진을 작성합니까? 그리고 그렇게하더라도 법적으로 사용하기보다는 누군가가 당신의 것을 훔칠 가능성은 무엇입니까 (역 엔지니어링 필요, 문서가 부족함-개발 언어에 관계없이 많은 시간 낭비) 잘 문서화 된 무료 오픈 소스 엔진? 전체 프로그램의 불법 복제는 코드 아이디어를 훔치기 위해 리버스 엔지니어링보다 훨씬 더 실질적인 관심사이며, 해적은 네이티브 컴파일 코드에 의해 조금이라도 방해받지 않는 것으로 보입니다.
Steve314

1
추상화 수준에서 JVM 명령어는 하드웨어 수준이 아니라 기본적으로 응용 프로그램 계층 추상화에서 멀리 떨어진 수준에서 매우 낮은 수준입니다. 추상화 카운트 계층이 표준 Java 라이브러리에있는 경우 플랫폼과 최종 애플리케이션 사이에 계층이 거의 없습니다. 어쨌든 C 및 C ++에서 일반적으로 발생하는 것을 제외하고 (libpng를 재발 명하는 이유) 대부분의 사람들은 널리 알려진 플랫폼 세트를 효과적으로 형성하는 공통 라이브러리를 사용하며 훌륭한 리버스 엔지니어링 도구가이를 인식 할 수 있습니다.
Steve314

3
요구 사항을 만족시키기 위해 모든 코드는 FPGA로 배송되어야하고 에폭시로 싸야합니다. 놀랍게도 블랙 박스 칩 패키지조차도 항상 리버스 엔지니어링 될 수 있습니다. 그런 다음 인텔과 같은 거대 기업들도 CPU 패키지에 버그를 도입하여 에폭시 임베디드 하드웨어 블랙 박스가 여전히 하드웨어 라이브러리에 노출 될 수 있습니다. 마지막으로 모호한 보안에 대한 요구는 작동하지 않습니다. Reductio ad absurdum은 알고 있지만 원래 답변도 마찬가지입니다.
Patrick Hughes

3
불행히도 나는 당신을 공감할만큼 충분한 평판을 얻지 못했습니다. 모든 주장이 실패했습니다. C, C ++ 또는 다른 언어로 제작 된 게임을 디코딩, 디 컴파일 및 해킹하는 사람들이 있으므로 바이너리 패키지는 추가 보안을 제공하지 않습니다. 또한 OP가 이것에 관심이 있다면 거기에 많은 훌륭한 자바 난 독자가 있습니다. 머신 성능에 대한 완전한 제어에 관해, 대부분의 C 및 C ++ 프로그래머는 이것을 가지고 있지 않으며 단지 좋은 코드를 작성하면 컴파일러가 필요한 것을 최적화합니다. 그리고 이것이 문제가 되더라도 JNI 또는 JNA를 사용할 수 있습니다.
Victor Stafusa
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.