GPUは非常に優れた並列タスクです。並列タスクを実行している場合、これは素晴らしいことです。
ゲームは、並列化が最も少ない種類のアプリケーションです。メインのゲームループについて考えてください。AI(プレイヤーがAIの特殊なケースとして扱われると仮定しましょう)は、物理学によって検出された衝突に応答する必要があります。したがって、後で実行する必要があります。または、少なくとも、物理学は物理学システムの境界内でAIルーチンを呼び出す必要があります(これは多くの理由で一般に良い考えではありません)。物理はオブジェクトの位置を更新するものであるため、物理が実行されるまでグラフィックスは実行できません。もちろん、AIは新しいオブジェクトを生成できるため、レンダリングの前にもAIを実行する必要があります。サウンドは、AIおよびプレーヤーコントロールの後に実行する必要があります
一般に、ゲームはごく少数の方法で自分自身をスレッド化できます。グラフィックはスレッドでスピンオフできます。ゲームループは、グラフィックスレッドで大量のデータを押し出し、「これをレンダリングする」と言うことができます。メインゲームループがグラフィックと同期する必要がないように、基本的な補間を行うことができます。音は別のスレッドです。ゲームループに「これを再生」と表示され、再生されます。
その後、すべてが痛くなり始めます。複雑なパスアルゴリズム(RTS用など)がある場合は、それらをスレッド化できます。アルゴリズムが完了するまでに数フレームかかる場合がありますが、少なくとも並行します。それを超えて、それはかなり難しいです。
つまり、ゲーム、グラフィックス、サウンド、そしておそらくは長期的なAI処理の4つのスレッドを見ていることになります。それは大したことではありません。また、GPUには文字通り何百ものスレッドを一度に実行することができるため、それだけでは十分ではありません。これがGPUにパフォーマンスを提供するものです。これらのスレッドをすべて一度に利用できます。そして、ゲームではそれができません。
今、おそらくあなたはいくつかの操作のために「広く」行くことができるかもしれません。たとえば、AIは通常、互いに独立しています。したがって、一度に数十個のAIを処理できます。実際にそれらを互いに依存させる必要があるまで。それからあなたは困っている。物理オブジェクトも同様に独立しています...それらの間に制約がある場合、および/または何かと衝突する場合を除きます。その後、彼らは非常に依存するようになります。
さらに、GPUにはユーザー入力へのアクセス権がないという事実がありますが、これはゲームにとって重要なことです。そのため、それを提供する必要があります。また、ファイルに直接アクセスしたり、OSと通信する実際の方法もありません。繰り返しますが、これを提供するには何らかの方法が必要です。ああ、そのすべてのサウンド処理?GPUは音を発しません。そのため、それらはCPUに戻ってからサウンドチップに出なければなりません。
ああ、GPUのコーディングはひどいです。正しくなるのは難しく、あるGPUアーキテクチャにとって「正しい」ことは、別のGPUアーキテクチャにとって非常に間違っている可能性があります。そして、AMDからNVIDIAに切り替えるだけではありません。GeForce 250からGeForce 450に切り替えることができます。これは基本的なアーキテクチャの変更です。そして、それはあなたのコードを簡単にうまく動かせないかもしれません。C ++およびCさえも許可されていません。一番良いのはOpenCLです。これはCに似ていますが、いくつかの機能はありません。同様に再帰。そうです:GPUでの再帰はありません。
デバッグしますか?ああ、あなたのIDEのデバッグ機能が気に入らないことを願っています。GDBを使用している場合でも、そのさようならにキスしてください。printf
デバッグに頼らなければなりません...待ってください、printf
GPUにはありません。そのため、メモリの場所に書き込み、CPUスタブプログラムでそれらを読み戻す必要があります。
そうです:手動デバッグ。それで頑張ってください。
また、C / C ++で使用する有用なライブラリはありますか?または、XNAなどを使用する。または何でも。GPUでそれらのいずれも使用できないため、問題ではありません。すべてをゼロからコーディングする必要があります。また、既存のコードベースがある場合は難しいです。そのコードをすべて書き直すときです。
ええ 複雑な種類のゲームを実際に行うのは恐ろしいことです。そして、ゲームはそれを助けるのに十分なほど平行ではないため、うまくいきません。