並列タスクエンジンが適切なソリューションになるのはいつですか?


8

並列タスクベースのアーキテクチャを試すために取り組んでいるゲームを中断したくなることがよくありますが、それは私のプロジェクトにとって大きな要件ではないようなので、今のところは避けます。私は、最初におもちゃのプロジェクトで「コンセプトで遊ぶ」ことを試すつもりです。

さて、私が尋ねているのは、多くの(非AAA)ゲームは本当に本当に高いパフォーマンスを必要としないので、タスクベースのエンジンを使用することは気になる価値がないように感じられる...どんな場合ですか?

現時点では、(マルチコア)ハードウェアの最大パフォーマンスを実際に活用する必要がある場合にのみ必要だと思います。タスクベースのエンジンを使用するのが良い他のケースはありますか?それとも、新しいプロジェクトの場合は、タスクベースのエンジンから始めるのが常に良いですか?

回答:


7

スレッド化は、次の2つの状況で使用されます。

  1. やるべきことはたくさんあるが、ユーザーの応答性を維持する必要がある場合。
  2. お気に入りのプラットフォーム/最小要件で複数の処理コアの能力が必要な場合。

これらのいずれかまたは両方が必要であると合理的に期待できる場合は、それを実行してください。そうでなければ、しないでください。もちろん、あなたが楽しいためにスレッド化するのを止めたり、それをざっと調べて調査したりする人は誰もいませんが、実際にマルチスレッド化されたアプリケーションを取得する利点のためにthreadngを実行することに関しては、上記の2つの使用例は次のとおりです。ほとんどそれ。


2
応答性のための+1:私の主なプロジェクトの要件の1つは、ローディングスクリーンがないこと、最大限の没入感を得るために継続的なエクスペリエンスを提供することです。それは良い点です。
Klaim

1
+1パズルゲームで複数のスレッドを使用した正確な理由:UIをフリーズせずに重い作業(数百万の組み合わせをチェック)。
ashes999

「ロード画面なし、継続的なエクスペリエンス」-このアイデアに基づいてアーキテクチャ全体を構築する必要があります。これは、ほとんどの小さなエンジンが使用する「1つのレベルをロードして再生し、次に別のレベルをロードする」設計からの脱却です。
Patrick Hughes

14

ゲームがリモートでハードウェア集約型になる場合は、すべての最新のハードウェアに対応するスレッドが必要です。来年または2年に登場する将来のCPUは、4コアを最小、最大16コアまで、マニア/パフォーマンス市場で一般的になっています。まったくマルチスレッドを実行している場合は、他のスレッドモデルが本質的に将来を見据えたゲームエンジンでは機能しないため、タスク指向のアーキテクチャを確実に実行してください。

ここで、「タスク」とは「ジョブ」を意味し、「異なるエンジンサブシステム用の個別のスレッド」を意味しないことに注意してください。1つのグラフィックススレッド、1つの物理スレッド、1つのAIスレッドなどのようなことは絶対に完全に避けたいと思います。これは、ごく一部のコアを超えてスケ​​ーリングすることはなく、実際に実際の並列処理を実現することはできません。物理演算は、AIの更新ごとに複数の更新を実行するべきではありません(AIが物理イベントに反応できるようにする必要があります)。物理演算が実行されていない場合、グラフィックスはほとんど新しくレンダリングされないため、各サブシステムはシーケンスで自然に実行されます注文。あなたは

あなたがしたいのはこれです スレッドスプールを作成します。古典的な一連のサブシステム更新でゲームループを実行します。ただし、サブシステムごとに、ワークロードを個別の分離可能なバッチに分割し、それらをスレッドプールに分散します。ゲーム更新ループの次の状態を実行する前に、すべてのジョブが完了するのを待ちます。一部のサブシステムには複数のサブステージがあります。たとえば、グラフィックは一連のジョブを発行してカリングを実行し、次に2番目の一連のジョブを実行してレンダーキューの作成を実行します。このアプローチは、最初のアプローチの同期の問題を回避し、はるかに多くのコアに拡張でき、率直に言って、コーディング、デバッグ、および保守が簡単になります。


この種のエンジンを構築する方法についてのアドバイスをありがとうございますが、私はすでに十分に文書化されているので、それは必要ありませんでした。私が尋ねるのは、「いつ価値があるのか​​」という質問です。知らない人のためにそれらの情報を指摘することは、まだ良いことだと思うので、削除しないでください:)
Klaim

非常に妥当に聞こえる
Den

Appleと同じように、いったん仕事に慣れたら後戻りはできません=)これは、新しいエンジンに適したアーキテクチャの提案です。
Patrick Hughes

@SeanMiddleditchスレッドの粒度をそのように変更するだけではありませんか?システムごとのスレッドだけではなく(実際にはそれほどスケーラブルではありませんが、一部のシステムは他のシステムよりも多くの電力を必要とし、コアを使用できるシステムがはるかに多い場合もあります)、システムごとに複数のスレッドを実行する可能性があります。したがって、各スレッドが作用するデータの粒度を微調整しています。これがどのように機能するかはわかりませんが、追加することは他にありません。7年後もこの意見を保持していますか?ありがとう。
ニコス

1
@ Nik-Lz:いいえ。「システムごとの複数のスレッド」は、システムごとのスレッドがどうあるべきかを知っていることを意味するためです。レンダリング用に2つのスレッドと物理学用に3つのスレッドが必要ですか?AIはいくつですか?それはすべて、特定のシーンに依存し、プレーヤーが見ているシーンのどこにいて、その瞬間に何が起こっているのかによって異なりますか?ジョブシステムは、スレッド全体を現在必要としないサブシステムにスレッド全体をビニングするのではなく、当面のニーズに簡単に動的にスケーリングします。
Sean Middleditch、2018

0

マルチスレッドには2つの用途があります。1つはプログラムのパフォーマンスを向上させることであり、もう1つは進行中の大きなプロセスがあるときにプログラムを実行させることです。たとえば、いくつかのデータをロードしようとしているとき、プログラムがハングアップするのは面倒なので、ロードに別のスレッドを使用してメインスレッドを解放し、メインループを続けることができます。一方、スレッドを使用してパフォーマンスを向上させることは非常に困難です。通常、線形プロセスですべてのことを行うため、並列処理とは対照的です。グラフィカルデバイスの更新には常にメインスレッドを使用する必要があり、スレッド間でタスクを分割することがさらに困難になります。


1
スレッド化は難しくありません。:)これは多くの人がきちんと行うことを決して学ばないものであるので、彼らは未経験のために難しいと思います。特にゲームでは、多くのアルゴリズムとコアデータ構造が複数のスレッドで非常に簡単に処理できます。たとえば、物理の更新をオブジェクトのアイランドに分割し、統合と解決のためにそれぞれを別のスレッドにファームすることができます。同様に、グラフィックスのオブジェクトのカリングでは、読み取り/書き込みデータアクセスの競合はほとんど発生しません。
Sean Middleditch、2011年

@seanmiddleditchスレッド自体を使用することは難しいことだとは言いませんでしたが、スレッドを効果的に使用して、同じ負荷を共有するようにスレッドのバランスをとることは、なんらかの欠点です。
Ali1S232 2011年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.