なぜC ++がゲーム開発で非常に人気があり、代わりに他の言語ではないのかについて興味があります。あなたはそれで非常に高速なコードを作成できることを知っていますが、何がそれを人気にしているのですか?
速いからといって?オブジェクト指向のパラダイムや移植性など、言語の他の機能ですか?時間の経過とともに作成されたすべてのライブラリが原因ですか?または、これらすべての(および他の)理由の何らかの組み合わせ?
誰かが私にこれを記入できれば、私はとても幸せになります。:-)
なぜC ++がゲーム開発で非常に人気があり、代わりに他の言語ではないのかについて興味があります。あなたはそれで非常に高速なコードを作成できることを知っていますが、何がそれを人気にしているのですか?
速いからといって?オブジェクト指向のパラダイムや移植性など、言語の他の機能ですか?時間の経過とともに作成されたすべてのライブラリが原因ですか?または、これらすべての(および他の)理由の何らかの組み合わせ?
誰かが私にこれを記入できれば、私はとても幸せになります。:-)
回答:
多数の理由:
@Grahamが提起したものに加えて言及したいいくつかの理由があります。
low-level言語です。しかし、high-levelアセンブラー、IMO。
生の速度が主な理由ですが、実際にはどちらかまたは決定ではないため、多くのゲーム会社がゲームの一部に他の言語を使用し始めています。特定のタスクはコンピューターが可能な限り高速に動作することを要求します(コアレンダリングルーチンなど)が、ゲームプレイコードの多くのタスクはそれほど高速に実行する必要はありません(プレイヤーがクリックするとドアを開くなど)これらの部分にはるかに単純な(したがって、プログラムを書くのに速い)言語を使用するのが賢明です。そのため、多くのゲームエンジンがC ++で記述されていますが、ゲームプレイコードを記述するためにLuaのようなスクリプト言語が組み込まれています。
理解するのが難しいことは、プログラミング言語を選択するとき、コンピューターの効率とプログラマーの効率の間に全体的なトレードオフがあるということです。それは、あなたにとってより重要なのは、コンピューターがコードを実行する速さ、またはプログラマーがコードを書く速さです。
C ++では、関数が終了すると消えるローカル変数を割り当てることができます。通常、これらはスタックに割り当てられます。
スタック変数は、断片化とオーバーヘッドの動的メモリ割り当ての問題には寄与しません。スタック上の部屋の割り当ては迅速かつ簡単です(ポインタを調整するだけです)。動的なメモリ割り当てでは、通常、適切なメモリブロックをコンテナで検索し、メモリにマークを付けて、使用中としてタグ付けします。割り当て解除では、メモリブロックをコンテナに追加し、場合によっては既存のブロックとマージします。ポインタを変更するよりもはるかに多くのオーバーヘッド。
JavaおよびC#は、プリミティブ型を除き、メモリを動的に割り当てます。これらの言語は、変数を削除対象としてマークし、メモリを再利用するためにランダムな(スケジュールされていない)間隔でガベージコレクターを実行するランタイム環境に依存しています。一般に、プログラマーは、変数にいつ削除のタグを付けるか、いつ回収するかを制御することはできません(使用済みメモリーの回収は、ほとんどのC ++およびJavaプログラマーが経験しない高度なトピックです)。
C ++の速度は、主に実行可能コードへの直接変換によるものです。JavaとC#は中間コードにコンパイルされ、仮想マシンによって解釈されます。一般的に、解釈言語は、直接翻訳された言語よりも実行速度が遅くなります。
structs。その他のポイントに、非常に、非常にあなたがいない速度の小さな増加は、このネットに近い他の上で1つの言語を正当化するのに十分な。本当の理由は@Graham Perksによって述べられています:それはゲーム開発者が知っていることが期待されていることです。言語と同じように高速またはより高速であり、ではない(例:ゴー)がたくさんあり、ほとんど不便などへの書き込みには。
ゲームはかつて機械語で書かれていました。なぜなら、それらにはコンパイラが存在しないエキゾチックなハードウェアがあったからです。また、ハードウェアには、効率的な16ビット整数演算など、Cプログラマーが当然のことと考えていた機能もありませんでした。
ゲームが使い慣れたハードウェアに収まると、Cコンパイラが利用可能になり、すぐにすべてのゲームがCで作成されました。
かつてはC ++は良いアイデアのように思えましたし、現在ほとんどのゲームはC ++ですが、エンジニアはCに戻ることをいまいましく言っています。私はCでゲームを作りたいと思っています。多くの同僚もそうです。ゲームを改善すると思うC ++の新しい機能はありません。
コンピューターは数年前よりも1000倍高速であるように思われますが、高レベルの言語は開発時間($)を短縮し、Cを時代遅れにします。
これは、ゲームの購入者がハードウェアが1000倍優れていることを知っており、見た目と音が1000倍優れたゲームと交換したいためです。これにより、高レベル言語が消費するスラックがシステムから削除されます。
ゲームのパフォーマンス要件は厳しいです。グラフィックの新しいフレームは、必ず33ms(または16ms!)未満でレンダリングする必要があります。この予算を満たすために、ハードウェアが行うすべてのことを考慮する必要があります。プログラマーが理解していない、または予期していないハードウェアで何かをする言語は、この予算を満たすのを非常に難しくします。これは、高レベルのものに対する自動マイナスです。
ゲームプログラマは低レベルの言語で作業するだけでなく、高レベルのデータ構造とアルゴリズムも避けます。通常、ゲームにはリンクリストがなく、ツリーはほとんどありません。可能な限りポインターを回避する動きがあります*。O(N)時間またはO(1)スペースを超えるアルゴリズムは、広く使用されない傾向があります。
*ポインタがキャッシュミスを引き起こさない場合、32ビットを使用してそれを保存するのはなぜですか?ポインターがキャッシュミスを引き起こす場合、そのキャッシュミスを取り除くのが最善です。
human派生クラスplayerとenemy?
すべてのプログラミング言語には、さまざまな要因に長所と短所があります。これらの要因の例は次のとおりです。
ゲームプログラマが気にする最も重要な要素の1つはパフォーマンスです。彼らは、インタラクティブな体験を生み出したいと考えています。つまり、リアクティブであり、できるだけ多くの有用な(または興味深い)データを出力できる必要があります。あなたはいつでも健康状態を知りたいと思っており、それを待ちたくないのです。ボタンをクリックすると、銃を発射するか、キャラクターがジャンプするとキャラクターがジャンプすることを期待します。わずかな遅延がこの対話性を妨げる可能性があるため、パフォーマンスが必要です。
もう1つの重要な要素は、実装の言語ではなく、問題の言語でプログラムすることを好むことです。ゲームプログラマは、メモリレジスタED0ではなく、人間、オーク、レースカーを扱いたいと考えています。パフォーマンスが必要な場合は、実装の詳細に飛び込むオプションが必要ですが、ほとんどの場合、ゲームワールドのエンティティのレベルで対処できると便利です。彼らは、リンクリストがどのように機能するかを常に気にすることなく、ゲームの世界をシミュレートすることを心配するのに十分です。
C ++は、これら2つの主要な要因に非常によく適合します。オブジェクトの表現力で、アセンブリまたはCコードのパフォーマンス上の利点を得ることができます。これがゲームに適している理由を確認するには、他の言語オプションと比較してください。
最後のポイントは、これのいくつかは歴史的および政治的であるということです。さまざまなプログラミング言語間で多くのフレーム戦争が戦われています。たとえば、C#はゲーム開発に適しているかもしれませんが、C ++の後に登場しました。または、Microsoftからのものであることを好まない人もいます。C#に移行した人もいなかった人もいます。一部の人々は今でもBASIC、Pascal、およびCでゲームをプログラミングしています。プログラマーが何に満足していようと、彼らは固執します。ゲームプログラマーは、おそらくCとC ++で育ち、ニーズを満たしたため、C ++にほとんど慣れています。コンピューター業界がJavaのパフォーマンスと取り込みが十分な人々を満足させる状態にある場合、Javaは事実上の標準のゲーム開発言語になるでしょう。
コンソール用に開発している場合、選択の余地はありません。プロフェッショナルSDKはC ++のフレーバーでしか提供されていません。通常、彼らはほとんどのことへのCアクセスも持っています。
多くの開発者はコンソール+ PCであるため、すべてのPCの作業を同じ言語で行い、技術を直接共有することは理にかなっています。
それはプロ業界が住んでいる場所であり、ほとんどの人がその一部になりたいので、ほとんどのゲームプログラマはC ++プログラマです。
そのすべてが起こるため、ほとんどのエンジン開発者もC ++開発者であるため、プロ級のエンジンを評価する場合、ほとんどすべての選択肢がC ++になります。
それはすべて大きな自立型エンジンです。それを破壊するには、単なる技術的な進歩以上のものが必要です。
私はかなりC、C、C ++に反対していますが、他の言語にはほとんどないことの1つは、実行しているプラットフォームを完全に制御することです。 GC、グリッチなし。
これは最近ではそれほど重要ではありませんが、パワー不足のプラットフォームには当てはまります。
PC / Mac / Linuxでは、おそらく最近出会う中で最も移植性の低い言語であり、スピードボーナスはそれほど大きな違いではありません。Minecraft(Java)はスムーズで、非常に最小限のプラットフォーム(およびすべてのOS)で動作します。単一の実行可能ファイル-3つのプラットフォームで動作することはもちろんのこと、機能が多くバグが少ない低労力の個別C / C ++アプリはまだありません。
だからこの時点では、ほとんどが慣性であり、実際のゲームは常にC / C ++で行われるという考え方ですが、iPhoneやコンソールに「移植」する能力は重要ですが(ほとんどの場合、ゲームのUIの多くは、WindowsとXBoxの間を除き、移植に多大な労力を要します)。