Javaで書かれたビデオゲームが少ないのはなぜですか?[閉まっている]


171

Javaで書かれた商用の3Dビデオゲーム(ランダムなオープンソースの2Dゲームではない)がそれほど多くないのはなぜですか?理論的には、それは非常に理にかなっています。膨大な量のJavaライブラリや組み込みのガベージコレクションなど、とりわけ、生産性の向上とクロスプラットフォームアプリケーションをほぼ無料で利用できます(ただし、 m後者が良いことかどうかは不明です)。では、なぜそれがめったに使用されないのですか?Javaプラットフォーム用に作成された人気のある商用ゲームをいくつかしか考えられません。

パフォーマンスのせいですか?もしそうなら、重い作業のほとんどはとにかくGPUによって行われるのではないでしょうか?



1
Re:mmyers; 2005年でさえ、そのゲームが「最高のグラフィックス」賞を受賞したのには少しショックを受けています...
CloudyMusic 09年

2
そうですが、ほとんどの「実際のゲーム」はマネージド.netで作成されていませんね。彼らは古い学校のc / c ++で作られていますか?
Hardwareguy

14
RunescapeはJavaで書かれています。
GameFreak 2009年

44
MinecraftはJavaで書かれています!
daGrevis

回答:


155

ゲーム開発の世界は面白いです。一方で、彼らはしばしば新しいアイデアをすぐに受け入れることができ、他方で、彼らはまだ石器時代にいます。

真実は、C / C ++以外の.NET / Java /何かに切り替えることにそれほどインセンティブがあることはめったにありません。

ほとんどのゲーム会社は、ゲームエンジンの一部を他の会社からライセンス供与しています。これらの部分はC ++で記述されており、ソースにアクセスして移植できる場合もありますが、多くの労力がかかります(もちろん、ライセンスで許可する必要があります)。

また、C ++には多くのレガシーコードがすでに存在しています。以前のプロジェクトのコードを再利用できる場合(たとえば、続編を作成している場合)、新しい言語で書き直すのではなく、同じ言語を使用するほうが有利です(再導入する可能性が高いため大量のバグを修正するために時間を費やす必要があります。

最後に、ゲームが100%C ++で記述されることはめったにありません。カスタムであっても、既存の言語を統合するだけでも、多くはスクリプト言語を使用して行われます(Luaは最近人気のある言語の1つです)。

ガベージコレクションに関する限り、これは少し問題になる可能性があります。問題はそれが存在するほど多くはありません。それはそれがどのように機能するかです-ガベージコレクターは非ブロッキングでなければなりません(または少なくとも非常に短時間しかブロックされないことが保証されています)。割り当てられたすべてのメモリをスキャンして、解放できるものを確認します。Javaがメモリ不足に近づくと、GCでかなり窒息する傾向があることを知っています(一部のゲームでは、そうなるでしょう)。

また、実行できることも少し制限されます。ランタイムのオーバーヘッドのため、ハードウェアを完全に活用することはできません。CrysisがJavaで記述されていることを想像してください...それが唯一の目に見える違いであるとしても、それは同じではないでしょう(それを実行するにはCore i7が必要だとかなり確信しています)。

これは、これらの言語がゲーム開発の場を持たないという意味ではありません。いいえ、私は単にツールプログラミングに言及しているのではありません。ほとんどのゲームでは、3Dゲームを含めて、C ++から得るパフォーマンスの追加ビットは必要ありません。すべてを最初から作成する場合、XNAのようなものを使用することは完全に理にかなっています。実際、それは良いチャンスです。

商用ゲームに関する限り、RuneScapeはカウントされますか?それは、世の中で最も成功したJavaゲームかもしれません。


16
もちろん、JVMでCrysisを実行することはありません。地獄、その言語をアセンブリ言語でコーディングした場合でも、フル設定でゲームを実行するにはスーパーコンピューターが必要です。しかし、優れた洞察のための+1、ありがとうございます。
サーシャチェディゴフ2009年

15
Unreal Tournament 3またはCrysisをRunescapeと比較することはできません。グラフィックの品質が問題になる場合は、できるだけオーバーヘッドの少ない低レベルの言語を使用する必要があります。もちろん、グラフィックが主なセールスポイントではないIndyやゲームの場合、JavaはC / C ++の優れた代替手段です。
GuiSim 2009年

6
@GuiSim:ほとんどのゲームでは、グラフィック品質は主要なセールスポイントではありません。グラフィックを念頭に置いて作成されたと考えることができるゲームはほんの一握りしかありません(私はCrysisを考えていますが、当時はHal​​f-Life 2も考えています)。他のほとんどのゲームと同じように、「十分に良い」グラフィックである限り、ほとんどのゲーム開発者はグラフィックスをそれほど気にしないと思います。
サーシャチェディゴフ2009年

4
グラフィックスは、言語とはほとんど関係がありません。物理学、AI、はい。グラフィックス。
JulianR

10
@JulianRは、効率的にレンダリングされるシーンを準備および維持するためにかなりのワークロードが存在する可能性があるため、グラフィックスでは言語とそれに関連する言語のオーバーヘッドが問題になります。
KSchmidt 2009

95

ジョンカーマックは、次の点について最もよく言ったと思います。

最大の問題は、Javaが本当に遅いということです。純粋なCPU /メモリ/ディスプレイ/通信レベルでは、最新の携帯電話のほとんどはGame Boy Advancedよりもかなり優れたゲームプラットフォームです。Javaを使用すると、ほとんどの電話で、元の4.77 mhz IBM PCのCPUパワーと、すべてに対するお粗末な制御が残ります。[... snip ...] Write-once-run-anywhere。ハ。ははははは。現在、4つのプラットフォームでのみテストを行っており、1つのペアがまったく同じ癖を持っているわけではありません。すべての商用ゲームは、各プラットフォーム(多くの場合100以上)ごとに個別に調整およびコンパイルされます。移植性は、ひどいパフォーマンスを正当化するものではありません。

ソース

確かに、彼はモバイルプラットフォームについて話していましたが、C ++のバックグラウンドに起因するJava全体として同様の問題を見つけました。自分の条件でスタック/ヒープにメモリを割り当てることができません。


60
その引用は2005年からのものです。それ以来、Javaテクノロジと携帯電話のパワーの両方が大幅に向上しています。携帯ゲームとPCゲームの比較では、リンゴとオレンジを比較しています。
Chris Dail

78
ジョン・カーマックはそれを言った。ケースは閉じられました。
GuiSim 09年

41
「Javaは本当に遅い」と読んだだけで不安になります。5万ドルのスポーツカーは10万ドルのスポーツカーと比較して遅いと言っているようなものです。確かに遅いですが、90%の時間、それが行う仕事は依然として素晴らしく、半分のコストです;)火炎戦争は意図されていません。上記の理由がCrysisや同様のゲームがJavaで書かれていない理由に同意します。
ロス

17
@Chris Dail、これはJavaパフォーマンスの問題全体を強調しています。Javaのパフォーマンスは向上しましたか?いいえ、携帯電話はより速くなりました。ゲームはリアリズムの限界を押し上げることになっているため、ハードウェアの限界を押し上げ、コード行を書く前にパフォーマンスの%30-%40を捨てることは受け入れられません。
cgp 2009年

8
この論争はとても奇妙だと思います。Java MEは、AndroidのJavaとは異なり、PCのJavaとも異なります。Java MEは通常、JVMを考案するために電話メーカーに依存していました。うまくいった人もいなかった人もいます。カーマックが彼らについて不平を言っていたのも不思議ではありません。Androidには、JVMではない独自のVMがあります。そして、(私の観点から)いくつかの深刻な問題があります。OracleのHotSpot VMは、どちらの場合とも完全に異なります。人々がこれらすべてのものを比較する場合、私が結論付けることができる唯一のことは彼らが彼らが話していることを知らないということです。
マルコム

54

1つには、Javaには演算子のオーバーロードがないため、機能するグラフィックスパイプラインを取得するために処理しなければならないすべての計算が非常に煩わしく、読みづらくなります。

扱う必要があるすべての行列乗算およびアフィンベクトルは、次のようなオブジェクト指向の式ではなく、整形式の数式であると、追跡がはるかに簡単です。

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

それはひどいです。数学はそのように見えるべきではありません。


19
'96年のことを覚えています。Sunのデザイナーの何人かが、バークレーでJavaに関するプレゼンテーションを行っていました。ウィリアム・カーハン(en.wikipedia.org/wiki/William_Kahan)は、この問題について彼らにsh * tを与えていました。:)
JP Alioto

13
言語でのオペレーターのオーバーロードを許可しないことには十分な理由があると思います。それを人々が使用できないようにするためです。これは強力なツールであり、数学にとっては非常に優れていますが、他のすべてにとって危険です。コーダーが怠惰であると、コードを短くするために誤用される傾向があり、人々が関数でイテラブルを乗算するマップを実行し始めた瞬間、またはすべての算術演算が関数に対して定義されているときでさえ、コードの可読性はほぼ0に達します。はい、そのようなコードの移植にかなりの時間を費やしました。:-Sそれは設計上の選択です。また、デザインの選択には常に異議を唱える傾向があります。
back2dos 2009年

19
いくつかの悪いリンゴのために他のみんなを罰しますか?これが私がC#を好む理由の1つです。オペレーターのオーバーロードが本当に必要な場合は、そこにあります。
ChaosPandion 2009

1
基本的に、オペレーターのオーバーロードは、OOP設計(ベクター、行列、複素数)の2〜3種類の状況にのみ適切です。他のほとんどの状況では、それはあまりにも緩く定義されており、それを使用する方法を知っている人からさえ、ずさんなコード、弱い構文、および不十分なドキュメントにつながります。それが、SunがJavaで使用しないことを選択した理由だと思います。それは正当な決定だと思います。
bgroenks 2013年

1
@MMJZ:ラムダ式は演算子のオーバーロードとどのように関係していますか?
サーシャチェディゴフ2015

26

.NETには、Javaと同じように認識されている問題がたくさんあると思います。マイクロソフトは、XNAを使用して、開発者へのマーケティングにおいてより良い仕事をしました:-)


10
XNAでは、.NETアプリケーションをXBoxにデプロイすることもできます。Javaについてそれほどスムーズなものは見たことがありません。
StriplingWarrior

Zuneにも展開できます。
cbeuker

ちょっと古い質問ですが、更新するだけで、Windows Phone用のXNAゲームも作成できるようになりました:-)
Joel Martinez

3
別の更新@JoelMartinez:それはWindowsの携帯電話8のためのXNAゲームを書き込むことはできません
トマスAndrle

@TomA WP8用のモノゲームゲームを作成できるようになりました
Alex Lapa

17

マイナーポイントを最初に:

  • Javaによる生産性の向上は架空のものです。構文はC ++とほとんど同じなので、メモリ管理と標準ライブラリからの節約を実際に利用しているだけです。ライブラリはゲーム開発者に提供するものがほとんどなく、メモリ管理はガベージコレクションのために論争の的となっています。

  • 「無料」のクロスプラットフォームは、OpenGLを使用したくない開発者がほとんどいないため、グラフィックス、オーディオ、ネットワーキングなどのネイティブライブラリの適切なJava実装やラッパーが不足している可能性があるため、思ったほど良くありません。

しかし、主に、問題は下位互換性です。ゲーム開発者は、純粋に移行ルートがスムーズだったため、CからC ++に、アセンブリからCに移行しました。それぞれが以前のコードと密接に相互運用し、以前のすべてのコードは、多くの場合単一のコンパイラを介して新しい言語で使用できました。したがって、移行はあなたが好きなように遅いか、または速いものでした。たとえば、今日使用されている古いヘッダーの一部には、#ifdef WATCOMCがまだあります。で、10年以上ここでWatcomコンパイラを使用した人はいないと思います。古いコードへの多大な投資があり、各ビットは必要に応じてのみ置き換えられます。既存のコードとネイティブに相互運用しない言語に変更した場合、1つのゲームから次のゲームにビットやピースを置き換えてアップグレードするプロセスは、現実的ではありません。はい、C ++ / Javaの相互運用性は可能ですが、単に「Cを少し使ったC」と書くことや、asmブロックをCに埋め込むことと比べると、非常に非現実的です。

C ++をゲーム開発者の選択言語として適切に置き換えるには、次の2つのいずれかを行う必要があります。

  1. 既存のレガシーコードと容易に相互運用できるため、投資を保護し、既存のライブラリとツールへのアクセスを維持する、または
  2. すべての独自のコードを書き直す(またはインターフェースをその言語から使用できる再利用可能なコンポーネントに作り直す)コストがカバーされる以上の十分な生産性向上を前もって明らかに示します。

主観的には、Javaがこれらのいずれにも対応していないと思います。誰かが開拓者になるのに十分な勇気があるならば、より高いレベルの言語は2番目に会うかもしれません。(EVE OnlineはおそらくPythonを使用できる最高の例ですが、メインのPython言語のフォーク、多くのC ++コンポーネントを使用してパフォーマンスを実現しています。これは、現代の要求がかなり厳しいゲームでも同じです。)


追加したいのは、EVE Onlineは「オンライン」の宇宙シミュレーションであり、1000対1000のプレイヤー対プレイヤーの戦いが一般的であり、パフォーマンスの点で厳しいシナリオとして数えることができます。速度を重視する部分はC / C ++で記述されていますが、ゲームで高水準言語(Python)を使用する際の課題については、興味深い研究です。
Hakan Deryal 2012年

ただし、マルチプレーヤーのサーバー側ゲームのパフォーマンスは、シングルプレーヤーのクライアント側ゲームのパフォーマンスとは少し異なるメトリックによって測定されることを覚えておいてください。前者はスループットに、後者はレイテンシに関係しています。
カイロタン2012年

はい、そうですが、その戦闘には画面上に2000以上の船が含まれ、2000以上の発射体(ミサイル、アニメーション付き)、爆発など、いくつかの重いグラフィックスパフォーマンスが必要です。とにかく、詳細な回答をありがとう、それはまだ当てはまります。
Hakan Deryal 2012年

1
CとJavaの構文が同じで、パフォーマンスに何らかの関係があると思われる場合、何が起こっているのか本当に理解できません。特定の関数が同じパラメーターで繰り返し呼び出されていることを実行時にCがどのように判断し、パラメーターに偏差がある場合に関数呼び出しを保持しながら、関数呼び出し全体を定数で置き換えることができるでしょうか?ランタイムが常に良い、または常に悪いと言っているのではなく、構文とはまったく関係がないということです。
ビルK

1
@BillK-誤読しているようです。構文については、「パフォーマンス」ではなく「生産性」のみを参照して説明しました。JITの最適化によって理論的にはJavaが高速になることは事実ですが、これは実際には発生しません。少なくともゲームソフトウェアでは発生しません。
Kylotan 2014年

12

私はSims 3をプレイしています。グラフィックスエンジンはC ++、スクリプトおよび動作エンジンはC#/ Monoです。したがって、C ++はタイムクリティカルなビットのために存在しますが、.interaction、ゲームロジックなどの他のものは、オブジェクト指向のマネージ言語です。


5
そしてMac版では、変更されたWine仮想マシン内にすべてを押し込みました。ストレートJavaの場合よりもさらに高速だと思います:-)
Ben Gotow

10
Wineは仮想マシンではなく、Windowsランタイムライブラリの動作を模倣するランタイムライブラリです。したがって、名前は(ワインはエミュレータではありません)です。
Nate CK、

2
これはゲームでは非常に一般的ですが、タイムクリティカルではないロジックは、ある種のスクリプト言語(通常はluaまたはpython)で書かれていることがよくあります。
KSchmidt 2009

ただし、バニラモノではありません。EAは、独自のカスタムCLRをフルタイムで機能させるための特別なチームを必要としていました。
Crashworks、

4
ちなみに、The Sims 3は、優れたコンピューターでもパフォーマンスが低下することで悪名高いものです。
ロータスノーツ

12
  • ゲームエンジン/ライブラリの良いポートはありますか?
  • 多くのC / C ++開発者、特にWindows(ほとんどの商用ゲームが書かれている)の開発者は、Visual Studioに精通しています。IDEでの比較はありません。
  • 一般に、Javaは型付けがしっかりしているため企業に販売されており、メモリ管理の問題はないと認識されています。
  • そして、はい、Javaはまだ遅いという認識に悩まされており、メモリ管理が貧弱であり、ゲームの場合、おそらくこのタスクには不適切です。他のいくつかの回答で述べたように、ガベージコレクションは、リアルタイムの高性能要件に対処しているときは、それを削減するつもりはありません。ビデオゲームはCPUとGPUを限界まで押し上げます。

1
太字のテキストの場合は+1。ゲームが20 fpsで実行されている場合、多くの場合、ハードウェアが20 fpsでバインドされていることに気づいていないようです。それは本当に30 + fpsに到達したいのですが、それはできません。
GuiSim 09年

パフォーマンス面で問題となっているのはGCだけではないと思います...起動が遅い段階と相まって、それも一般的なパフォーマンスの問題ですが、それは私だけです。
rogerdpack '14年

2
この時点で、私は以前よりも同意する可能性が高いと思います。JVMの最適化が改善されました。ただし、JavaScriptやその他の緩やかに型付けされた言語のパフォーマンスの向上を考慮すると、Javaのパフォーマンスと比較するとかなり言い訳がありません。Javaのパフォーマンスには多くの謝罪者がいます。(しかし、最終的に知覚されたパフォーマンスがすべての問題です)」
cgp

10

Javaおよびその他の仮想マシン言語がゲームに使用されていない最大の理由の1つは、ガベージコレクションによるものです。同じことが.NETにも当てはまります。ガベージコレクションは長い道のりを歩んでき、ほとんどのタイプのアプリケーションでうまく機能しています。ただし、ガベージコレクションを実行するには、アプリケーションを一時停止して中断し、ごみを収集する必要があります。これにより、収集が発生したときに定期的に遅延が発生する可能性があります。

Javaには、リアルタイムアプリケーションでも同じ問題があります。タスクを特定の時間に実行する必要がある場合、ガベージコレクションなどの自動タスクでそれを尊重することは困難です。

Javaが遅いということではありません。それは、Javaがリアルタイムタスクの処理が得意ではないということです。


1
ただし、Javaを新しい環境に移植する場合は、ガベージコレクター用の独自のスケジューラーを作成できます。メモリはいずれかの方法で再利用する必要があり、リアルタイム環境では、gcをスケジュールするタイミングのオプションを選択できます。C / C ++がそれらのことをすでに行っているときに、Javaをアーキテクチャーに移植してやりたいことを行う理由はそれほど多くないという点に戻る必要があります。Javaは他の場所で輝きます。
サンジャシント

5
これは1990年代ではありません。ガベージコレクターは、一時停止を低くするように調整されている場合はかなり良いです。
トム・ホーティン-タックライン09年

8

主な理由は、ビデオゲームでは、多くの場合、その下にあるハードウェアの直接的な知識が必要であり、多くのアーキテクチャに優れた実装が実際にはないためです。開発者があらゆるオンスのパフォーマンスをゲームシステムから引き出すことができるのは、基盤となるハードウェアアーキテクチャに関する知識です。なぜ時間をかけてJavaをゲームプラットフォームに移植し、ゲームを作成するだけで、そのポートの上にゲームを作成するのでしょうか。

編集:これは、「速度」または「適切なライブラリがない」問題以上のものであると言うことです。これら2つのことはこれと密接に関連していますが、「セルのようなシステムでJavaコードを実行するにはどうすればよいですか?パイプラインとベクターを管理できる優れたJavaコンパイラーは実際にはありません。私のように……」


7

最初の理由はパフォーマンスの問題です。Quakeエンジン(http://www.codemaestro.com/reviews/9)に含まれているハイパー最適化されたC ++コードの種類を見ると、仮想マシンで時間を浪費していないことがわかります。

確かにいくつかの.NETゲーム(どれか?興味がある。本当にCPU / GPU集中型のゲームがあるか?)があるかもしれないが、多くの人がMSテクノロジーの専門家であり、Microsoftを発売したときにフォローしていたので、もっと多いと思う彼らの新しい技術。

ああ、クロスプラットフォームは、ビデオゲーム会社の考えではありません。Linuxは市場の約1%で、Mac OSはそれより数%多いだけです。彼らは、Windows専用のテクノロジやDirectXなどのライブラリをダンプする価値はないと考えています。


3
「クロスプラットフォームは単にビデオゲーム会社の頭の中ではありません」-それが私がそうする会社を完全に尊重する理由です。:)
サーシャチェディゴフ2009年

クロスプラットフォームとオープンソースの両方に熱心に取り組んでくれたカーマックに間違いなく感謝しています。ほとんどの企業がどう思うかを簡単に述べました。
Ksempac 09年

1
それは本当だ。Linuxに移植された人気のあるビデオゲームは多くありません。:(
サーシャチェディゴフ2009年

クロスプラットフォームはクロスOSだけではありません。PS3、Xbox 360、Wiiについて考えてみてください。
JulianR 2009年

「仮想マシンで時間を無駄にするつもりはありません。」en.wikipedia.org/wiki/Quake_III_Arena#Virtual_machine、カーマックはゲームロジック用に独自に構築しました。
James McMahon、

4

WebアプリケーションがCまたはC ++で記述されていない理由についても質問できます。Javaのパワーは、ネットワークスタックとオブジェクト指向設計にあります。もちろん、CとC ++にもあります。しかし、より低い抽象化についてです。それは悪いことではありませんが、毎回ホイールを作り直したくありませんか?

また、Javaにはハードウェアへの直接アクセスがありません。つまり、フレームワークのAPIに悩まされています。


Javaは「JNI」を介してネイティブコードを呼び出すことができます
Bart van Heukelom、2009年

4
...そして、あなたがそれにいる間、携帯性を失います!
LiraNuna

1
JNIを使​​用しても、移植性はほとんど失われません。サポートしたいプラットフォームでネイティブライブラリをコンパイルできる場合、基本的には、すべてのコードではなく、コードの1%だけを移植/再コンパイルするだけで済みます。それでも、Javaの移植性から多くのメリットを得られます。
bgroenks 2013年

4

パフォーマンスとJVMの最適化の悪さについての誤解が私の推測でしょう。C ++ゲームのJavaポートには、C ++ゲームよりも高速に動作するJavaポートがあるため(Jake 2を参照)、私はパフォーマンスについて誤解を述べています。実際の問題であるIMHOは、多くのJavaプログラマーが、使いやすさとコードの理解可能性/保守性を備えているため、最先端のパフォーマンスにそれほど重点を置いていないことです。物事のC / C ++側では、基本的にわずかに高いレベルのアセンブリ言語でコーディングしており、アセンブリまたはストレートマシンコードを記述せずに取得できる限りハードウェアに近いものです。


それが「アセンブリを記述せずに取得できるハードウェアに近い」場合、コーディングがひどいものでない限り、Javaはそれに勝つことができません。ハードウェアに近づけば近づくほど、早く到達できるようになります。
Josh Johnson

4

ウィキペディアのゲームエンジンのリストには、多くのゲームエンジンと、それらが記述されているプログラミング言語がリストされています。

いくつかのJavaゲームエンジンがリストされています。

いくつかのリンクをクリックすると、Javaで記述されたゲームとデモの例が表示されます。ここにいくつかあります:

特定のゲームや状況では、Javaのトレードオフが許容される場合があります。


私はJavaで書かれたゲームが存在することを知っています。しかし、MinecraftとRunescape以外に、Javaプラットフォーム向けに書かれた主流の商用ゲームはほとんどありません。Javaで書かれたAAAタイトルはいくつありますか?そして、なぜそれほど少ないのですか?したがって、私の質問です。
サーシャチェディゴフ

3

.NETには、強力な3Dパフォーマンスに関してJavaと同じ問題がいくつかあります。マイクロソフトは、3Dの重い操作を扱う場合、ライブラリの開発により多くの時間とお金を費やしました。

(...個人的には、DirectXと.NETの間の魔法に関しては、彼らも足を踏み入れたと思います)


2
  1. Javaは遅いので、手間のかかる作業のほとんどはGPUで処理されません。アニメーション、物理、およびAIがCPUにアクセスすることはまだあり、これらはすべて非常に時間がかかります。

  2. コンソールにはJavaが存在せず、コンソールは商用ゲームの主要なターゲットです。PCでJavaを使用している場合、妥当な時間と予算内でコンソールに移植する能力がなくなります。

  3. ゲーム業界で経験豊富なプログラマーの多くは、Javaが普及するずっと前からCおよびC ++を使用しています。上記の2つの点がこれに寄与している可能性がありますが、多くのプロのゲームプログラマーは、Javaをあまりよく理解していないと思います。

  4. 上記のミドルウェアに関する他の誰かの指摘は良いものだったので、私はそれを私の答えに追加しています。C / C ++とリンクするために特別に記述された多くのレガシーコードとミドルウェアがあり、最後にJavaが良好な相互運用性を備えていないことを確認しました。ほとんどの企業でJavaを使用するには、多くのコードを破棄する必要があり、その多くは何らかの形で支払われています。


3
JavaCL、JOCL、またはAPARAPIを使用して、それらの多くをGPUにオフロードできます。
bgroenks 2013年

2

実際、マネージコードで3Dゲームを実行することは非常に可能です。問題はバックエンジンです。.Netでは、短期間、MicrosoftによるDirectX 9へのマネージDirectXラッパーがありました。これは、現在はXNAである抽象化の前でした。

DirectX APIへの完全なアクセス権が与えられているため、.Netゲームはごちそうです。私が知っている最も良い例は、VB.Netで書かれたwww.entombed.co.ukです。

残念ながら、Java側では、DirectXがJavaで利用できず、ゲームプログラマーがDirectX APIを知って理解しているという理由で、それはひどく欠けています。DirectXに戻るときにさらに別のAPIを学ぶ理由


2

ゲームマーケティングは商業プロセスです。出版社は、投資に対する定量化可能な低リスクのリターンを望んでいます。結果として、焦点は通常、消費者が信頼性の高い収益を生み出すために購入するテクノロジーギミック(例外を除く)にあります。これらは、レンズのまぶしさやより高い解像度などの表面的な視覚効果である傾向があります。これらの効果は、処理能力の増加を単純に使用するため、信頼性が高く、ハードウェア/ムーアの法則の増加を利用します。これは、C / C ++の使用を意味します。通常、Javaはハードウェアから抽象化されているため、これらの利点を活用できません。


1

速度はまだ問題だと思います。コードを作成するときに利用できる3Dカードがわからないので、クロスプラットフォームが問題になるでしょう。Javaには、3D機能の自動検出をサポートするものはありますか?そして、wii、xbox、ps3の間でゲームを簡単に移植できるツールはあると思いますが、費用がかかると思います。

ps3には、ブルーレイサポートを介したjavaがあります。bd-jサイトを確認してください。


1

.Netプラットフォームで作成されたゲームでさえ、メモリやバスへの直接アクセスなどの速度に合わせて高度に最適化されることがよくあります。.Netでは、C / C ++を使用して、C#などの高水準言語と混在させることができます。

ゲーム開発スタジオは、ハードウェアベンダーと緊密に連携することがよくあります。ハードウェアベンダーは、製品の低レベルインターフェイスへのアクセスを提供します。これは、デバイス通信にASMとCを使用する必要がある世界です。仮想環境はこれらのプログラム部分を遅くします。

とにかく、現代の3Dゲームは実際には高レベルの言語を使用しています。多くの場合、ゲームのロジックはLuaやPythonなどの言語で記述されています。しかし、典型的な3Dゲームのコア(I / O、スレッド、タスクスケジューリング)は、今後25年間、または長いデバイスが抽象化と仮想化を自分で許可しないため(今後登場する)、低レベル言語で記述されます。


1

既存またはライセンス済みのコードベースの要素の活用、パフォーマンスなどに関する他の投稿に同意します。

追加したいことの1つは、仮想マシンで厄介なDRMトリックを実行するのが難しいことです。

また、プロジェクトマネージャーがツールやリソースを完全に制御できるなど、C ++を使用して安定したコードや信頼性の高いコードを作成できると考えるハブリスコンポーネントもあると思います。彼らよりも賢い」


0

JagexによるRunescapeはJavaで書かれており、「ビデオゲーム」タグはオンラインゲームであることを明確に示していない可能性がありますが、適切なフォロワーがいます。


申し訳ありませんが、これは実際には私の質問にまったく答えません。
サーシャチェディゴフ2009年

2
しかし、質問の盲目的な発言は、ゲームがJavaで書かれておらず、どこにあるかの成功例を指摘しているという仮定につながります。
マークシュルタイス

0

それはすでに多くのことについて話されました、あなたはウィキでさえ理由を見つけることができます...

  • ゲームエンジンとすべての集中的なもののためのC / C ++。
  • ゲームのスクリプト用のLuaまたはPython。
  • Java-非常に悪いパフォーマンス、大きなメモリ使用量+ゲームコンソールでは使用できません(これは一部の非常に単純なゲームで使用されます(はい、ここでRunescapeが考慮されます。バトルフィールドやクライシスではなく、他に何があるかです)。このプログラミング言語を知っている多くのプログラマー)。
  • C#-大きなメモリ使用量(このプログラミング言語を知っているプログラマーが非常に多いため、非常に単純なゲームで使用されます)。

そして、Javaが遅いわけではないことを人々に納得させようとするJavaプログラマーがますます増えています。画面上にウィジェットを描画し、ウィジェット上にいくつかのASCII文字を描画することは、ネットワークを介してデータを送受信するために遅くありません(そしてそれはC / C ++の代わりにこのケース(ネットワークデータ操作)で使用することをお勧めします)...しかし、数学の計算、メモリの割り当て/操作、このような多くの優れた機能のような深刻な機能に関しては、非常に遅くなります。

言語とコンパイラの機能を使用した場合にC / C ++で実行できることを示すMITサイトの記事を覚えています。行列乗数(2つの行列)、Javaでの1つの実装、C / C ++機能を備えた1つのC / C ++での実装適切なコンパイラ最適化がアクティブ化された場合、C / C ++実装はJava実装よりも最大で296 260倍高速でした。

ゲームでJavaの代わりにC / C ++を使用する理由を理解していただければ幸いです。JavaのCrysisを想像してください。これを処理できるコンピューターはこの世にはないでしょう。しかし、それはまだそこにキャッシュされており、クリーンアップする必要がありますが、ゲーム用ではありません。確かに、ガベージコレクションのアクティブ化ごとに、さらに多くのラグがあります。

編集:誰かが記事を求めたので、ここでは、それを得るためにWebアーカイブを検索しました、あなたが満足していることを願っています... MITケーススタディ

さらに、ゲーム用のJavaはまだひどい考えです。ほんの数日前、私が名前を付けない大企業が、ゲームクライアントをJavaからC ++に書き直し始めました。これは、非常に単純なゲーム(グラフィックに関して)が、強力なnVidia GT 5xxおよび6xx世代のビデオカードを搭載したi7ラップトップに遅れをとって加熱していたためです( nVidiaだけでなく、ここでのポイントは、ほとんどの新しいゲームのMax設定を処理でき、このゲームを処理できないこの強力なカードであり、メモリ消費量は〜2.5〜2.6 GB RAMでした。そのような単純なグラフィックスには、マシンの獣が必要です。


10
最新のJavaランタイムと仮想マシンについては、ほとんど何も知りません。あなたが言及した記事は10年以上前のものである可能性が高いです。もちろん、あなたがそれを引用しなかったので誰も知ることができません。Javaに対する認識が古くなっています。
bgroenks 2013

2
わかりましたので、大規模な行列の乗算では、データへのアクセスに2次元配列アクセスが使用されている場合、JavaはCに負けます。はい、私もそれを推測したでしょう。そして、それが本当にあなたにとって問題であるならば、私がそれを疑うであろう、それがあなたがJNIを持っている理由です。配列の境界チェックのオーバーヘッドは、その状況では増加しますが、彼のJavaコードは結果を大幅に改善するように最適化できたはずです。同様に、彼が「より速いコンパイル=生成された最良のコードではない」と述べたとき、私は彼のJITの理解に疑問を投げかけます。そうでないことを証明するために、IBMの仕様を読んでください。
bgroenks 2013年

3
Javaはゲーム開発にとって悪い選択ではありません。Javaを実行する成功したゲームはたくさんあります。通常、実際に最良の結果を得るには、ネイティブコード(特にLWJGLなど)の少しの支援が必要です。しかし、コードの100%ではなく1%を移植して再コンパイルするだけでよい場合、それは私には大きな問題のように思えます。
bgroenks 2013年

1
@bgroenks "100%"-あなたはC / C ++について何も知らないように見えます...そしてゲームを作るときはいつでもクロスプラットフォームライブラリ(SDLや他の束)やフレームワーク(例えばQt)を使うことができます。たとえば、EAはすべてのゲームでQtを使用します... QtはJavaよりもクロスプラットフォームであり、ネイティブコードにコンパイルされます。
リリアンA.モラル2013年

2
あなたがQtを持っているとき、私は本当にJavaの要点を見ません。Qtコードは、Javaコードよりも明確で理解しやすく、保守しやすいと思います。友達になぜC ++をそんなに恐れているのかと尋ねると、ポインタを嫌い、メモリの割り当てを必ず解除するように言われます。多くの人がC ++のshared_ptrについて知らないように見えます...私にとって、QtとC#.NET / C ++ .NETが最も優れています。Javaコードは通常、例外処理で非常に肥大化し、通常はライブラリが古くなっています(それは主にサーバー側でのみうまくいっていますが、残りは...)そして頻繁に古いドキュメントです。
リリアンA.モラル2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.