ゲームプログラミングのためのC ++との競合


21

なぜC ++がゲーム開発で非常に人気があり、代わりに他の言語ではないのかについて興味があります。あなたはそれで非常に高速なコードを作成できることを知っていますが、何がそれを人気にしているのですか?

速いからといって?オブジェクト指向のパラダイムや移植性など、言語の他の機能ですか?時間の経過とともに作成されたすべてのライブラリが原因ですか?または、これらすべての(および他の)理由の何らかの組み合わせ?

誰かが私にこれを記入できれば、私はとても幸せになります。:-)


7
スピードは私にとって十分な理由です。特に、言語に関するみんなの不満は私にはあまり意味がありません。
ベンジャミンリンドリー

簡単な推測:ほとんどのゲームはWindows用に書かれています。CおよびC ++言語は、Microsoftによって大幅にサポートされています。最後に、OOPとテンプレートメタプログラミングのため、C ++が推奨されます。

@ Matt Thanks、それが存在することを知りませんでした。トピックをそこに移動できますか、またはこのトピックを削除してそこに再作成する必要がありますか?

これはすでに何度か尋ねられています。
ザンリンクス

1
@Benjamin:それではあえて、C ++で十分に書いていないか、Python(またはLINQを使用したC#)のような表現力豊かな言語を使用したことがありません。しかし、なんらかの理由で他の多くの言語が1でできるように20行のコードを書くことを好むとしても、C ++の非常に貧弱な 文法は、プログラムが本来よりもコンパイルにかなり長い時間がかかること、および適切なIDEツール(リファクタリングなど)を意味します作成することは不可能ではないにしても、より困難です。
BlueRaja-ダニーPflughoeft

回答:


29

多数の理由:

  • あなたが見逃した大きなもの:それはポータブルで、ゲームエンジンをiOS、XBOX、PS3などに簡単に移植できます
  • これは速い
  • すべてのSDKがネイティブにサポートしています
  • 多くのライブラリが利用可能
  • ゲームを書いている人なら誰でも知っているので、経験豊富なゲーム開発者をチームに雇うのは簡単です
  • Luaのようなゲームエンジンスクリプト言語を埋め込むのは簡単です

さて、皆さんの回答に感謝します、あなたは私が思うに必要なすべてをカバーしました。:-)
KasMA1990

14

@Grahamが提起したものに加えて言及したいいくつかの理由があります。

  • レガシーコード-多くのスタジオには多くのC ++コードがありますが、ライブラリについて言及しています。
  • C ++は実際には高レベルのアセンブラーであり、ハードウェアに直接アクセスでき(少なくともオペレーティングシステム上で実行できる限り直接)、非常に高速です。必要に応じて、C ++で命令レベル制御用のアセンブリ言語に直接ドロップダウンできます(常に賢明であるということではなく、Java、C#、Pythonなどでは不可能です)
  • DirectXとOpenGLはC ++をネイティブにサポートします。他のほとんどの言語は、中間層を介して基礎ライブラリに「バインディング」を持っています。つまり、高速ではない、または多くの同じことができないとは言えませんが、ゲームとハードウェア。
  • @Grahamが言及しているように、多くのプログラマーがそれを知っているので、経験豊富な開発者を見つけるのは簡単で、。 )

低レベルを意味しませんか?
11

5
C ++はlow-level言語です。しかし、high-levelアセンブラー、IMO。
ネイト

3
同意しません。C ++は高水準言語であり、C(低水準言語)にフォールバックする組み込み機能を備えています。
foo

7
C ++は、Cと同様に高レベル言語です。アセンブリは低レベルです。C#がC ++よりも高く、Ruby / PythonがC#よりも高いように、C ++はCよりも高いレベルです。
AAグラパス

4
レガシーコードを非推奨にする必要があるのはなぜですか?「レガシーコード」とは単に古いことを意味し、悪いことではありません。

8

生の速度が主な理由ですが、実際にはどちらかまたは決定ではないため、多くのゲーム会社がゲームの一部に他の言語を使用し始めています。特定のタスクはコンピューターが可能な限り高速に動作することを要求します(コアレンダリングルーチンなど)が、ゲームプレイコードの多くのタスクはそれほど高速に実行する必要はありません(プレイヤーがクリックするとドアを開くなど)これらの部分にはるかに単純な(したがって、プログラムを書くのに速い)言語を使用するのが賢明です。そのため、多くのゲームエンジンがC ++で記述されていますが、ゲームプレイコードを記述するためにLuaのようなスクリプト言語が組み込まれています。

理解するのが難しいことは、プログラミング言語を選択するとき、コンピューターの効率とプログラマーの効率の間に全体的なトレードオフがあるということです。それは、あなたにとってより重要なのは、コンピューターがコードを実行する速さ、またはプログラマーがコードを書く速さです。


3

C ++では、関数が終了すると消えるローカル変数を割り当てることができます。通常、これらはスタックに割り当てられます。

スタック変数は、断片化とオーバーヘッドの動的メモリ割り当ての問題には寄与しません。スタック上の部屋の割り当ては迅速かつ簡単です(ポインタを調整するだけです)。動的なメモリ割り当てでは、通常、適切なメモリブロックをコンテナで検索し、メモリにマークを付けて、使用中としてタグ付けします。割り当て解除では、メモリブロックをコンテナに追加し、場合によっては既存のブロックとマージします。ポインタを変更するよりもはるかに多くのオーバーヘッド。

JavaおよびC#は、プリミティブ型を除き、メモリを動的に割り当てます。これらの言語は、変数を削除対象としてマークし、メモリを再利用するためにランダムな(スケジュールされていない)間隔でガベージコレクターを実行するランタイム環境に依存しています。一般に、プログラマーは、変数にいつ削除のタグを付けるか、いつ回収するかを制御することはできません(使用済みメモリーの回収は、ほとんどのC ++およびJavaプログラマーが経験しない高度なトピックです)。

C ++の速度は、主に実行可能コードへの直接変換によるものです。JavaとC#は中間コードにコンパイルされ、仮想マシンによって解釈されます。一般的に、解釈言語は、直接翻訳された言語よりも実行速度が遅くなります。


1
-1(可能な場合)-ローカルプリミティブはJavaとC#の両方でスタックに割り当てられ、C#ではstack-allocatedを作成できますstructs。その他のポイントに、非常に、非常にあなたがいない速度の小さな増加は、このネットに近い他の上で1つの言語を正当化するのに十分な。本当の理由は@Graham Perksによって述べられています:それはゲーム開発者が知っていることが期待されていることです。言語と同じように高速またはより高速であり、ではない(例:ゴー)がたくさんあり、ほとんど不便などへの書き込みには。
BlueRaja-ダニーPflughoeft

C ++はスタック割り当てがあまり得意ではありません。実際、STL互換オブジェクトをスタックに割り当てることは非常に困難です。例えば、私が最後に取り組んだ大きなエンジンはCであり、一定のサイズ(通常は1K)でスタックで開始できる文字列がありました。透過的にヒープに移動したことが過去に成長した場合。C ++のstd :: stringカスタムアロケーターを使用して同様のことを行うことができますが、コードを正しく処理するには非常に複雑です。

1
@Joe Wreschnig:C ++はスタック割り当てに優れており、アセンブリ言語のリストをダンプするだけです。ただし、ほとんどのコンパイラベンダーは、大量のメモリをスタックに割り当てません。経験豊富なC ++プログラマの一般的な理解は、巨大なオブジェクトはローカルストレージ(スタック)ではなく動的に割り当てられる(ヒープ)ということです。スタック上の大きなオブジェクトは、スタックとヒープが互いに近づくにつれて、一部のプラットフォームでヒープにあふれることがあります。
トーマスマシューズ

1
経験豊富なC ++プログラマー、特にゲームコンソールのプログラマーの一般的な理解は、スタックをオーバーフローさせないものはすべて、スタック割り当てまたは事前割り当てされているということです。Cは、アロケーターがオブジェクトの構造型の一部ではないため、これを簡単にします。これにより、何かを誤って解放することも可能になりますが、私の経験では、stdlib互換のアロケーターの実装/互換性を台無しにする人に比べると、これはまれな問題です。新しい配置にはいくつかのトリックもありますが、これもCの同等のものよりも複雑です。

2
いいえ。C++の速度の利点は、ヒープの割り当てに独自のカスタムメモリマネージャーを使用できることです。すべての健全な言語は、スタックにローカルを割り当てます。
ネバーマインド

3

ゲームはかつて機械語で書かれていました。なぜなら、それらにはコンパイラが存在しないエキゾチックなハードウェアがあったからです。また、ハードウェアには、効率的な16ビット整数演算など、Cプログラマーが当然のことと考えていた機能もありませんでした。

ゲームが使い慣れたハードウェアに収まると、Cコンパイラが利用可能になり、すぐにすべてのゲームがCで作成されました。

かつてはC ++は良いアイデアのように思えましたし、現在ほとんどのゲームはC ++ですが、エンジニアはCに戻ることをいまいましく言っています。私はCでゲームを作りたいと思っています。多くの同僚もそうです。ゲームを改善すると思うC ++の新しい機能はありません。

コンピューターは数年前よりも1000倍高速であるように思われますが、高レベルの言語は開発時間($)を短縮し、Cを時代遅れにします。

これは、ゲームの購入者がハードウェアが1000倍優れていることを知っており、見た目と音が1000倍優れたゲームと交換したいためです。これにより、高レベル言語が消費するスラックがシステムから削除されます。

ゲームのパフォーマンス要件は厳しいです。グラフィックの新しいフレームは、必ず33ms(または16ms!)未満でレンダリングする必要があります。この予算を満たすために、ハードウェアが行うすべてのことを考慮する必要があります。プログラマーが理解していない、または予期していないハードウェアで何かをする言語は、この予算を満たすのを非常に難しくします。これは、高レベルのものに対する自動マイナスです。

ゲームプログラマは低レベルの言語で作業するだけでなく、高レベルのデータ構造とアルゴリズムも避けます。通常、ゲームにはリンクリストがなく、ツリーはほとんどありません。可能な限りポインターを回避する動きがあります*。O(N)時間またはO(1)スペースを超えるアルゴリズムは、広く使用されない傾向があります。

*ポインタがキャッシュミスを引き起こさない場合、32ビットを使用してそれを保存するのはなぜですか?ポインターがキャッシュミスを引き起こす場合、そのキャッシュミスを取り除くのが最善です。


1
「ゲームを改善すると思うC ++の新しい機能はありません。」笑?おっと?human派生クラスplayerenemy
orlp

2
@nightcracker:基本的なis-a継承はCで正常に機能します。とにかくパフォーマンスとクリーンさの理由から、has-aを使用して、説明する関係をより適切に実装します。

3
C ++のOOP機能はゲームに適していないというコンセンサスが高まっています。これらの機能は、キャッシュパフォーマンスに敵対する前提で動作するためです。
bmcnett

C ++がCに比べて利点がないと考えている場合でも、Cに戻ってもC ++に比べて利点がないことを確実に認識する必要があります。
ダン・オルソン

@Dan Cに戻ると、テンプレートやOOPを使用しないなどの「ベストプラクティス」が、後輩プログラマーをスティックで追いかけるのではなく、コンパイル時エラーによって強制されるという利点があります。また、言語がより単純であるため、おそらくコンパイラーとデバッガーの保守も安価です。
bmcnett

3

すべてのプログラミング言語には、さまざまな要因に長所と短所があります。これらの要因の例は次のとおりです。

  • 特定のプラットフォームでの速度
  • 特定のプラットフォームでのメモリ使用量
  • より簡単に公開する機能
  • 存在するプラットフォーム
  • プログラマーがオンボードで考慮する必要のある考慮事項

ゲームプログラマが気にする最も重要な要素の1つはパフォーマンスです。彼らは、インタラクティブな体験を生み出したいと考えています。つまり、リアクティブであり、できるだけ多くの有用な(または興味深い)データを出力できる必要があります。あなたはいつでも健康状態を知りたいと思っており、それを待ちたくないのです。ボタンをクリックすると、銃を発射するか、キャラクターがジャンプするとキャラクターがジャンプすることを期待します。わずかな遅延がこの対話性を妨げる可能性があるため、パフォーマンスが必要です。

もう1つの重要な要素は、実装の言語ではなく、問題の言語でプログラムすることを好むことです。ゲームプログラマは、メモリレジスタED0ではなく、人間、オーク、レースカーを扱いたいと考えています。パフォーマンスが必要な場合は、実装の詳細に飛び込むオプションが必要ですが、ほとんどの場合、ゲームワールドのエンティティのレベルで対処できると便利です。彼らは、リンクリストがどのように機能するかを常に気にすることなく、ゲームの世界をシミュレートすることを心配するのに十分です。

C ++は、これら2つの主要な要因に非常によく適合します。オブジェクトの表現力で、アセンブリまたはCコードのパフォーマンス上の利点を得ることができます。これがゲームに適している理由を確認するには、他の言語オプションと比較してください。

  • アセンブリ:これは生の力です。あなたが書くことは基本的にCPUがすることです。しかし、すべての段階で、レジスターで何が起こっているのかを知る必要があり、その効果はゲーム世界のエンティティのようには見えません。プログラマーは、自分のコードが行うこととゲーム内で何が起こるかをメンタルに対応させる必要があります。これは精神的なオーバーヘッドになる可能性があります。
  • C:ここではパフォーマンスは良好ですが、達人の経験を活用して標準的なこと(メモリの割り当て、文字列の操作、標準的な数学関数の使用など)を実行できます。ここでは表現力に近づきますが、実際には通常のデータ型でしか操作できないため、この言語は多かれ少なかれ実装に集中するように強制します。すべてが実際にはchar、intなどです。構造体、ポインター、および配列は、物事をまとめることができますが、内部について考える必要があります。
  • Java: C ++を飛び越えて、Javaに到達します。Javaは実装の詳細からさらにプッシュします。実際、ほとんどの場合、下位レベルにアクセスすることはできません。Javaは、クロスプラットフォームにしたいという理由で、実装の詳細(使用しているCPUやOSなど)の多くを抽象化します。詳細がないため、詳細にアクセスできません。コンピューター用にプログラミングするのではなく、プラットフォーム(ほとんどのコンピューターに存在するJavaプラットフォーム)用にプログラミングします。さらに、Javaには問題の言語を扱うためのC ++よりも間違いなく優れた言語があります。トレードオフは、特定のコンピューターに対して最適化できないことです。これが実際的な違いを生むかどうかは、プログラムとコンピューターの詳細にかかっています。
  • ゲームスクリプト言語:これにより、UnrealScriptやゲームエンジンに縛られたカスタムスクリプト言語のようなものを意味します。これらでは、基礎となるエンジンにアクセスできません。パフォーマンスに関する考慮事項をエンジンに委任することで、ゲームの作成について心配する必要がなくなります。ゲームを書くのは簡単で、パフォーマンスを自分で最適化するのは難しくなります。
  • Haskellの(またはお好みの曖昧な言語):任意のチューリング完全なプログラミング言語は、他のと同じです。あなたがしながら、そうすることができます任意の言語で任意のプログラムを書き、あなたはトレードオフ、いくつかの客観的、いくつかの主観を作ります。Haskellのような言語は、数学的精神での作業により重点を置いています。対象となる問題は、ゲームで直面する問題とは多少異なります。ゲームに使用できない、または使用すべきではないという意味ではなく、ゲームに簡単に適していないというだけです。

最後のポイントは、これのいくつかは歴史的および政治的であるということです。さまざまなプログラミング言語間で多くのフレーム戦争が戦われています。たとえば、C#はゲーム開発に適しているかもしれませんが、C ++の後に登場しました。または、Microsoftからのものであることを好まない人もいます。C#に移行した人もいなかった人もいます。一部の人々は今でもBASIC、Pascal、およびCでゲームをプログラミングしています。プログラマーが何に満足していようと、彼らは固執します。ゲームプログラマーは、おそらくCとC ++で育ち、ニーズを満たしたため、C ++にほとんど慣れています。コンピューター業界がJavaのパフォーマンスと取り込みが十分な人々を満足させる状態にある場合、Javaは事実上の標準のゲーム開発言語になるでしょう。


2

レガシーと勢い。

昔々、究極のパフォーマンスのためにコードがアセンブラーで書かれていました。計算能力が向上するにつれて、コンパイルされた言語がより実行可能になり、Cは、マクロアセンブラーにすぎない非常に基本的なレベルで、能力と生産性の間で最高の妥協を提供しました。

C ++はCの自然な後継者でした。以前のコードや知識を捨てることはありませんが、新しい方法論に拡張する可能性があります。C ++は最終的に非常に柔軟性が高く、パフォーマンスをほぼ完全に制御しながら、少なくともC ++でシミュレートできない設計パラダイムをまだ見ていません。


2

コンソール用に開発している場合、選択の余地はありません。プロフェッショナルSDKはC ++のフレーバーでしか提供されていません。通常、彼らはほとんどのことへのCアクセスも持っています。

多くの開発者はコンソール+ PCであるため、すべてのPCの作業を同じ言語で行い、技術を直接共有することは理にかなっています。

それはプロ業界が住んでいる場所であり、ほとんどの人がその一部になりたいので、ほとんどのゲームプログラマはC ++プログラマです。

そのすべてが起こるため、ほとんどのエンジン開発者もC ++開発者であるため、プロ級のエンジンを評価する場合、ほとんどすべての選択肢がC ++になります。

それはすべて大きな自立型エンジンです。それを破壊するには、単なる技術的な進歩以上のものが必要です。


2

FWIW:C#はゲーム開発で人気を集めています。Miguel de Icazaのブログ投稿を参照してください。非常に興味深い読み物、私見。


2
いつものように、Miguelはお気に入りの(通常は限界的な)テクノロジーをプッシュしますが、XNAなどの業界でC#が実際に大きなプレーヤーになった方法を無視しています。

2

私はかなりC、C、C ++に反対していますが、他の言語にはほとんどないことの1つは、実行しているプラ​​ットフォームを完全に制御することです。 GC、グリッチなし。

これは最近ではそれほど重要ではありませんが、パワー不足のプラットフォームには当てはまります。

PC / Mac / Linuxでは、おそらく最近出会う中で最も移植性の低い言語であり、スピードボーナスはそれほど大きな違いではありません。Minecraft(Java)はスムーズで、非常に最小限のプラットフォーム(およびすべてのOS)で動作します。単一の実行可能ファイル-3つのプラットフォームで動作することはもちろんのこと、機能が多くバグが少ない低労力の個別C / C ++アプリはまだありません。

だからこの時点では、ほとんどが慣性であり、実際のゲームは常にC / C ++で行われるという考え方ですが、iPhoneやコンソールに「移植」する能力は重要ですが(ほとんどの場合、ゲームのUIの多くは、WindowsとXBoxの間を除き、移植に多大な労力を要します)。


1
ああ、私はそれが「力不足」プラットフォームにとってのみ重要であるとは知らない。これを見るもう1つの方法は、ゲームは常にどのプラットフォームでもパフォーマンスの最前線にあるということです。新しいパワーはすぐに消費されます。プロのゲーム開発について話している場合、パフォーマンスが主な関心事です。マシンが提供するすべての最後のサイクルを最大化せずにUnrealを書くことはできません。毎; シングル; サイクル。グラフィックエンジンとディスクアクセスからUIループまで、あらゆるレベルで。
クリススバジオ

@Chris:ゲーム以外のプログラマーに説明するために私が見つけた最良の方法は、ゲームは速度が競争上の優位である領域であるということです。ワードプロセッサが5秒で起動し、MS Wordが10になる場合、または0.1秒でリフローすると、Wordが0.2になる場合、それは価値がありません。しかし、ゲームでさらに10%の断片をポンプで排出したり、さらに詳細なキャラクターを1つでも表示できる場合、それは大きな競争上の優位になります。

それから、アセンブリ以外のコードを作成するのはばかげていませんか?確かに少なくとも10%は速くなります。保守性と開発の速度を犠牲にしてパフォーマンスを犠牲にする点があります。一般的に、最近のポイントはC ++です。Minecraftのようなクロスプラットフォームに対応する能力がもっと重要であれば、それは素晴らしいことです。
ビルK

ああ、しかし、それはアセンブリでのコーディングが高速であることの誤りです。現在のチップは十分に複雑であるため、プログラマがコンパイラを一貫してアウトパフォームすることは困難です。PS3のSPU、GPUの内部物理ループ、シェーダーなど、より制約のあるドメインでのみ、明らかな利点があります。実際、C ++は現在、スイートスポットであり、OOPが常に最良の選択とは限らないという警告があります。時には...あなたは本当にただC.たい
クリスSubagio

また、アセンブラーとC / C ++の間のプログラマー効率のステップは、CとC ++、またはC ++とC#/ Javaの間のプログラマー効率のステップよりも桁違いに大きくなります。フレッドブルックスは25年前にこれを指摘しました。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.