ゲーム開発者にC / C ++が好まれているのはなぜですか?


14

開発者により多くの制御を提供すると言う人もいますが、たとえばJavaを使用して制御できないC ++を介して制御できるのは正確には何ですか?

回答:


21

Javaは仮想マシンで実行され、C ++はハードウェアで直接実行されます。これが意味することは、メモリがどこに行くのか、C ++で何をするのかをより詳細に制御できるということです。

Javaはガベージコレクションされた言語です。メモリを直接制御することはできません。新しいメモリチャンクを割り当てることはできますが、削除されるタイミングを(細かく)制御することはできません。ガベージコレクターは、xフレームごとに割り当てたメモリをすべてチェックし、ガベージコレクターであるか、まだ使用されているかを判断します。

ゲームの場合、これは悲惨な場合があります。いくつかのフレームごとに、ガベージコレクターが1つ1つ割り当てをチェックして、それがまだ使用されているかどうかを確認しますか?減速について話してください!

次に、使用するライブラリのほとんどがCで書かれているか、C ++で書かれています。Scaleform、Havok物理エンジン、PhysX、SpeedTreeなどについて話しています。すべてのプロフェッショナルパッケージは、業界で広く使用されています。他の言語が王になりたいなら、それは彼らをより良くサポートします。

私の個人的な見解では、Javaはデスクトップアプリケーションやアプリには本当に適していますが、ゲームには適していません。Javaには開発者向けの優れたツールが多数あり、理論的にはJava仮想マシンの実装を備えた任意のプラットフォームで実行できますが、メモリを制御する必要があるため、C ++の方が好きです。特に、エキゾチックなデータ構造(赤黒木、二重リンクリストなど)で作業を開始する場合、すべてのメモリ割り当ての概要を把握するのに役立ちます。

私は言っていない:Javaを使用しないでください。私は言っている:あなたがJavaを使用している理由を考えてみてください。MinecraftはJavaで構築されたため、Javaでゲームを構築することは確かに可能です。しかし、C ++で構築されていれば、より良いゲームになっていたでしょうか?確かに、ビッグ3(Windows、MacOS、Linux)で実行するのはそれほど安上がりではなかったでしょうが、それでも、開発中にプラットフォーム固有のバグ、Javaがスムーズにできないバグに遭遇しました以上。

現在、初心者プログラマ向けのC ++フレームワークがたくさんあります。特に業界でのキャリアを促進したい場合、それを学ばない言い訳は本当にありません。


1
ほんのちょっとですが、ほとんどのオペレーティング環境では、ネイティブコードは仮想マシンで実行されます。Javaは、仮想マシン内の仮想マシンで実行されます。
スカイラーサレ

1
@RTS:op-> micro-op translationを仮想マシンと呼ぶのは少し苦労します。

いいえ、安全なマルチタスクを可能にするために、最新のオペレーティングシステムによってすべてのアプリケーションが使用される仮想マシンについて話していました。これは、マイクロオペレーションのないアーキテクチャ(RISC)で実行されるOSで発生します。これには、仮想メモリ、ソフトウェア割り込み、同時ハードウェアアクセス用システム、オペレーティングシステムスケジューラ、およびレジスタファイルの処理が含まれます。
スカイラーサレー

@RTSタスクの分離が本当にVMとしてふさわしいかどうかはわかりません。保護機能が組み込まれたRM(Real Machine)です。fetch/ execの間に明確な命令抽象化レイヤーはありません。コンパイラーとリンカーは、再配置可能なコードを要件として生成します。CPUは、このほとんどのハードウェアサポートを提供します。これにより、「仮想」面がなくなります。
-3Dave

2

簡単な答え:C ++はネイティブコードにコンパイルされるため、パフォーマンスはランタイムやVMではなく開発者に委ねられます。

長い答え:

C ++が「高速」であることは、C ++とは関係ありません。現時点では、複数のプラットフォーム用のスタンドアロンのネイティブコードを生成するツールでサポートされている数少ない言語の1つです。

昔は、C、C ++、BASIC / 2、Delphiなどを使用して、効率的で独立した実行可能ファイルを取得できました。言語の選択は、個人の好みと市場の力の問題でした。

最近では、「C ++の方が速い」という仮定は本質的に自己実現的な予言ですが、LLVMはパーサーの意味をなにかにするので、それを変更するのに良い立場にあります。

ボーランドはそれを正しかった。複数の言語を解析し、最初に最適化を適用してから、共通のバックエンドコンパイラとリンカーに渡しました。これは実質的にLLVMの主要な成果の1つです。

Javaは、JVMなしで実装するのが非常に難しいような方法で構造化されています。奇妙なことに、C#は、一般的に、また誤って、Javaとほぼ同等であると想定され、iOSを含むいくつかのプラットフォームでネイティブコードに既にコンパイルされています。

私のクリスマスリストのトップ?戻ってプロパティ、実際の例外処理、および実際のWORKINGポリモーフィズムをC ++に追加し、パーサーが独自に理解できるf "d上矢印構文の不要部分を取り除くタイムマシン。その10年間のプリプロセッサを作成しました。前にそれはおかしくなりますから。


間接的なメンバーアクセス(h-> xなど)を意味しますか?これを削除すると、ハンドルおよびスマートポインタータイプの有用性が低下します。生のポインタのためだけにそれを変更することを主張するなら、あなたは言語の一貫性を失っただけです。
ラースヴィクルンド

1
C ++のポリモーフィズムで何が機能しないのですか?
ケーシー

@LarsViklundはい、そういうことです。ただし、アドレス、逆参照、およびメンバー演算子(&、*、::、-> ...)の意味はすべて異なりますが、ほとんどの場合、コンテキストからdrsjtedの結果を推測できます。他の言語で行われているように、物事は事前に簡素化されていたかもしれません。些細な問題ですが、コードの複雑さ(および開発時間とコスト)を増加させる可能性があります。
3Dave
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.