私は最近ゲーム開発を検討しており、私の最初のプログラミング言語はJavaです。 c ++で開発された多くの見事なゲームをプレイした後、なぜJavaがゲーム業界であまり使用されないのか疑問に思いました。jMonkeyEngine3および他のいくつかのゲームエンジン環境を見ましたNeed for Speed EAやアサシンクリードのEAからの追求などのタイトルは、そのようなリアリズムを伝えています。なぜ、Javaこのような業界の強さのゲームを制作できないのですか?それは芸術作品ですか?
JavaおよびC#には自動ガベージコレクションがありますが、c ++にはありません。プログラマーは、宙ぶらりんのポインターなどを避けるために、メモリーの使用に細心の注意を払う必要があります。
みんなありがとう。
JavaおよびC#には自動ガベージコレクションがありますが、c ++にはありません。プログラマーは、ダングリングポインターなどを回避するために、メモリ使用量に細心の注意を払う必要があります。
あなた自身があなたの質問に答えました。
ゲームのプログラミングでは、ガベージコレクションは利点ではありません。 JavaのパフォーマンスがほとんどのタスクでC++とほぼ同等であり、JITが静的分析中に実行できるものに勝る非常に積極的な最適化を行うことさえできます。収集すると、最悪の瞬間にフレームレートが低下する可能性があります。
また、グラフィックを集中的に使用するタスクの場合、Javaはあまり適切ではありません。ランタイムによって安全でないと見なされ、データを再解釈するためのポインターのキャストなど).
もう1つの重要な問題は、業界ですでに定着しているノウハウです。ゲーム業界でのC++の慣性は巨大です。今日、すべてのゲーム開発者はCとC++を知っています。大規模な開発者プールを雇うことで、会社を離れる重要な人々である管理上の危険の1つが軽減されます。
しかし、それにもかかわらず、 Vampire:The Masquerade-Redemption のように、Javaで記述された一部のパーツで成功したゲームがいくつかありました。
Minecraft のような最近のゲームは完全にJavaで書かれています。しかし、仮想環境の動的な性質に重点が置かれているため、最先端のグラフィックスは備えていません。
他の多くのゲームやエンジンには、 のような高性能レンダリングおよびネットワーキングプラットフォーム(C/C++で記述)の上に構築されたマネージ(安全な自動メモリ割り当ておよびコレクション)スクリプト言語をサポートするランタイムがありますたとえば、Unreal Engine 。
一般に、ここで述べられているすべてがゲーム開発のためにJavaに移植しない理由でした。 だった。ゲーム業界は現在パラダイムシフトに直面しています。次の3つのことが変化したか、現在ゲーム業界を変えています:
ゲームはそれ自体に完全に依存しなくなりました。前者(低レベル言語)に存在していた主な利点は、C#やJava(高レベル言語)などの言語内に存在する利点に重きが置かれています。 2つの粗雑で否定できない例は、Facebookで動作するゲームと、電話、タブレットなどのリモートメディアです。
2つのシナリオすべてにおいて、上記の3つの懸念事項はすべて解消されたことを述べることが重要です。サーバーなしでは動作しないゲームは、コピーの侵害を心配する必要はありません(リバースエンジニアリングによるプライベートホスティングは含まれません)。ネットワーク依存型ゲームの需要には、システムパフォーマンスとネットワークパフォーマンスのバランスを取ることができる言語が必要です(通常、stalemate JavaとC/C++の間、favoring C/C++は厳密に既存のライブラリが豊富であるため)。ただし、モジュラーネットワーキングプログラムモジュールで設計されたゲームは、C/C++などの低レベル言語で開発するのは実用的ではありません。モジュラーネットワーキングプログラムモデル用にC/C++でゲームを設計することに興味のある会社は、その1つのゲームに完全に専念する仮想マシンを作成するか、ゲームを何度も再プログラミング/再コンパイルして考える必要があります。 IMOでは、どの言語が優先されるかを述べるのは時期尚早かもしれませんが、3つの主な理由からJavaに賭けています。
1)JVMは、Javaベースのアプリケーションを、Apple、Android、Windows 8、またはLinux/UNIX派生(仮想ハードウェアプラットフォームでも実質的にサポート)を問わず、実質的にあらゆるプラットフォームで実行できます。
2)JavaはOpenJL(OpenGL派生物。OpenGLをクライアントとして実行します。jMonkeyはOpenJLで設計されたエンジンです)。 Microsoft WindowsだけがDirectXを使用していることに注意することが重要です。DirectXは、可能な限り、1つの欠点しかありません。事実上、ゲームを実行できるすべてのOSはOpenGLでレンダリングでき、モジュール設計はこれまでにない方法でこれを推進しています。 (MicrosoftはWindows 8のディストリビューションを独占することでこの問題を回避しようとしていることに注意してください)。
3)JavaはJVM内でスレッド化を内部的にサポートしているため、サードパーティのライブラリを使用せずにマルチコアプロセッサを最大限に活用できます。現在、これは他のすべての言語(特に電話用に開発された言語)のハンディキャップです。
JVMはレイテンシーの懸念を引き起こしますが、そのような懸念はスレッド化によって解消できることに注意する必要があります。また、Windows 8とMicrosoftのプッシュについてもあまり心配しません。 Googleの株価は720ドル/株、Appleは526ドル/株、Microsoftはこれまでに27ドルです。 Appleは、主にC#を使用しているため、Microsoftのプッシュによって影響を受ける可能性が高い一方で、Googleはそれから利益を得る可能性があります。マイクロソフトがグーグルと対抗するとき、ラッキーなことは一度もありませんでした。グーグル/アンドロイドはJavaを多用しています。 Angry Birdsは元々Java FYIで設計され、iPhoneのC#に移植されました。 Google/Androidが標準化を実施している場合、MicrosoftはAppleを一緒に連れて行きます。
あなたの質問に対する答えは、アートワークと財源です。オリジナルのMinecreftはJavaの1人によって開発されました。一方、ACまたはNFSのタイトルは、数千人のチームから開発されています。リソースを比較します。さらに、Ubisoftはcustromゲームエンジンを使用しています。あなたが唯一の開発者であれば、リソースが不足しているため、アイデアに集中する必要があります。そして、あなたがアイデアを持っているなら、ガベージコレクターは通常の唯一のデベロッパーゲームでは魅力的です。そして、唯一の開発者として、最も迅速な開発技術を選択する必要があります。
この質問の片側のトピックだけを取り上げたいと思いましたが、ガベージコレクションは、AAAタイプのゲームエンジンの低レベルでパフォーマンスクリティカルな側面を作成するのに必ずしも必要ではありません。実際、そのような種類のオブジェクトの参照および収集システムを避けることは役立ちます。ユーザー定義の型でさえ、メモリ内で連続していて、隣接するオブジェクトをキャッシュなどに収めたいと考えています。
定期的な間隔でガベージを収集し、メモリにオブジェクトを分散させるというパフォーマンスの問題は別として、ゲームはより大きなリソースでリークする余裕がなく、ガベージコレクタはそこに物事を妨げます。はい、私はGCがリークを回避する能力を妨げると言ったばかりです。
ガベージコレクションはリソースリークに対する特効薬ではありません。
直感に反するように聞こえますが、今日最もリークの多いアプリを見てください。アプリを長く使用すればするほど、メモリ使用量は増え続けます。通常、これらはCまたはC++アプリケーションではありません。 C/C++アプリケーションは、クラッシュすることで有名ですが、リークすることはあまりありません。これらの漏れやすいものは、ガベージコレクションを使用する言語でプログラミングされることがはるかに多くあります。
たとえば、Flashゲームを使用します。完全なアマチュアソフトウェアだけでなく、多くのリソースが使用されており、より多くのリソースを使用し、ゲームを長くするほど遅くなり、ブラウザを再起動してゲームを高速にすることがあります。ただし、ガベージコレクションを備えた言語であるActionScriptでコーディングされています。
理論的には、ガベージコレクションはリークを減らすはずです。実際には、はるかに高価で隔離が難しい論理リーク(フープ、のロジック)と引き換えに、安価で修正しやすいスポットの物理リーク(この文字列を削除するのを忘れていたフープ)を排除することがよくありますシステムは、ゲーム全体がシャットダウンされるまで、かさばるリソースを残します。
これは、GC言語では、新しいリソースR
の共有所有権を作成する場合、他のオブジェクトA
にハンドル/参照を保存するだけでよいためです。 。 B
とC
はR
へのハンドルも格納する場合があり、R
は3人の所有者を持ち、3人の所有者全員が参照を解放した場合にのみ解放されます。ユーザーはA
が保存するもののみを参照して操作するため、ゲームロジックはR
からA
を定期的に削除しますが、それへの参照はB
に残ります。およびC
は、コードがリリースするのを忘れていました。 C/C++では、ここでB
およびC
のダングリングポインターが実際に望ましい場合があります。これは、デバッガーを実行する開発者がプレイテスト中にすぐに検出および修正可能な問題を引き起こすためです。問題をすばやく見つけて修正します。 GC言語では、検出するのは非常に難しく、プログラムがクラッシュすることはありませんが、大きなリークが発生する可能性があります。
したがって、GCはポインターのぶら下がりを確実に回避しますが、C/C++でぶら下がり、GC言語でぶら下がりない場合は、GC言語の論理リソースリークとC/C++のセグメンテーション違反です。別の言い方をすれば、GCはダングリングポインターを、永遠に残るダングリングリソースと交換します。明白なクラッシュとなるものをサイレントリークに交換し、デバッグの悪夢を発見することができます(製品のリリース後も気付かないこともあります)。そのため、巨大でダイナミックな世界やグラフィックスや物理オブジェクトなどを作成しているゲームのようなものや、場合によってはすべてのフレームで、論理的なリソースリークが非常に大きくなります。
リソースリークが大した問題でない場合は、ガベージコレクションが最適です。
残念ながら、GCを使用する大規模なチーム環境では、特にすべてのプログラマーがガベージコレクションの落とし穴や弱い参照の強い必要性にあまり注意を払っていない場合、この前のシナリオはあまりにも一般的です。したがって、GCは、最高レベルのヒューマンロジックについてのみ話している場合を除き、ゲームを作成するための利点として必ずしも引用するものではありません。常にリソースを作成し、アクセスし、破壊しなければならない下位レベルのデリケートなシステムロジックは、リークを回避するという点でも、それなしでは一般的にうまくいくでしょう。
ガベージコレクションがゲーム業界で使用されていないことは完全に真実ではありません。 Unreal Engine 3には、「スクリプト」クラス用のガベージコレクションが実装されています。それらの場合、軽く使用するとパフォーマンスは許容できます。面倒な作業は、独自のメモリを管理するC/C++コードによって行われます。
Fortranが言ったように、Javaはゲーム業界では実際には使用されていません。なぜなら速度に関する懸念のためです(JavaはネイティブではなくVMでコードを実行します...ほとんどの場合)そして既にCやC++でよく使用されるコードをたくさん書いた才能のあるゲームプログラマーがたくさんいます。つまり、Java少数のJavaゲームがありますが、「主流の」ゲーム業界はC/C++バックエンドに多大な投資を行っています。
フォートランとジェームズはすでにそれをかなりよくカバーしていましたが、慣性について話すときに示唆したフォートランは、C++で利用可能な巨大なライブラリのプールです。考えられるほとんどすべてのことに対して複数のC++ライブラリを持つことは、Javaに切り替えない大きな理由です。 Javaのライブラリは今のところないということではありませんが、C++のものは既に成熟しており、経験豊富な開発者の大きなコミュニティがあります。同じことを書き直す必要はありません。以前に1000倍したことが、時間を大幅に節約します。