環境:WindowsXP SP3 VS2008
Win32APIを使用
リアルタイムストラテジーゲームを作成したいと考えております。
この時どの部分をマルチスレッド化するのか教えていただけますか?
スタート
↓
ウィンドウ作成
↓--------↓
メッセージループ ゲームの処理
| ↓
↓←--------
終了
ゲームの処理
↓
ここでどれをマルチスレッド化すべきでしょうか?
描画
思考
入力処理などなど
> ここでどれをマルチスレッド化すべきでしょうか?
マルチスレッドにすることによって得られるメリットが明らかでないのなら
マルチスレッドにする意味はありません。
なにを目的としてマルチスレッド化するのですか?
あたり判定が多くなるとどうしても低速化が目立ちます。
また、シングルスレッドではマルチコア化について行けません。
というわけで、高速化を目的としてマルチスレッド化します。
基本的にユーザーインターフェイスはメインスレッドに
置くのが基本だと思いますが、それ以外の部分で何処を
マルチスレッド化するのかと言われてもシステムの仕組みを
理解していない人に問う事自体に無理があると思いますよ。
それなりの判断をするにはシステムの仕組みとか
ボトルネックになっている箇所とか諸々の要素を知っている
必要があると思います。
現状の情報でそれを行なうの難しいと思いますし、
ご本人が作成しているシステムに最適な方法かどうかは
判断できません。
定番の考え方で言うなら動作のボトルネックを解消するには
どうしたら良いかと言う部分を考える上でマルチスレッドと
いう手段を採用すると言う事ではないでしょうか。
マルチスレッドが唯一の解答であるとは限らないので
マルチスレッドも手段の一つと考えて方法論を検討された方が
良いと思いますよ。
一般論としてどこがマルチスレッド化するのかを教えていただけますか?
>あたり判定が多くなるとどうしても低速化が目立ちます。
まぁ、通常はアルゴリズムを再検討した方がよいですね。
たいていは、表示対象でない部分まで無用な計算をやっていたりするものです。
>また、シングルスレッドではマルチコア化について行けません。
シングルスレッドが常に単一の論理コアで実行されるわけではありません。
また、マルチスレッド化して、かつ多論理コアで実行したほうが、常に処理が
早く終了するというわけでもありません。これは、のべのCPU使用量は
マルチスレッドのほうが多いので当然ですね。
自分は、高速化の要はユーザーが異常を感じないように、
処理のバランスをとり、なるべくキャッシュを考慮したメモリ操作する。
ではないかと考えます。これは、具体的に動き始めてからでないと
調整できないものなで、物が無いうちはあまり気にする必要はありません。
さて、一般にゲームでスレッド化してそうな部分はというと
1.メインのゲームスケジューラ。
2.バックグラウンドミュージックや効果音
3.再生用の記録
4.その他、時間のかかる開始時の初期化とそれをごまかすアニメ。
なんかじゃないでしょうか。
自分が知っているゲームコードは10年以上昔のものなので、
今は違うのかも知れませんけど(vv;)。
> 一般論としてどこがマルチスレッド化するのかを教えていただけますか?
一般論では無く俺論だけど、描画、思考、入力処理といった処理単位でスレッドを別けな
い。というかスッキリ別けられるような設計を俺はできない。
ゲームの場合どうしてもデータ等の依存関係が強くなってしまうので、処理単位とかで分
けようとすると同期関係で死ねる。
> あたり判定が多くなるとどうしても低速化が目立ちます。
俺ならここの処理をスレッドに分ける事を考える。
例えば「あたり判定」をするオブジェクトが1000個あった場合、これを4つのコアで分担
できれば当然単一コアで処理するよりは高速でしょ?
・基本はメインスレッドのみで処理。他のスレッドは立ってはいるが眠っている。
・で、複数のコアに分けて処理できそうな案件が出た時には他スレッドにも処理を振る。
・一つのコアに一つの作業を振るのではなく、一つの作業を複数コアで分担する感じ。
ってのが割と簡単なマルチコア対応方法かも。(最上級の最適化かどうかは別として)
もちろん、描画、思考、入力処理といった単位で分けられて、それで高速化できるならコ
レも正解。というか結果が出るならば全部正解、casebycase。
とりあえず、4年程ゲーム開発していない元アマチュアゲームプログラマの一つの考えで
した。
一般論と言う言い方は便利なんですが、
一般論は、自分の例に適応できるかどうかの判断を
結局自分でやる必要があると言う事は前提にしてくださいね。
一般的には、マルチスレッドで動かした時に並列に動かせる
処理なんだけれど、シングルスレッドだからシリアルに処理するしかない。
と言うケースの場合にマルチスレッド化すると処理時間が稼げます。
とは言え、2倍、3倍処理が早くなると言う物ではないので
過大な期待は禁物だと思います。
(この辺はそれそこ一般論としてWeb上にいくらでも情報があるはず)
私のイメージだとマルチスレッドが生きるのは
ユーザーインターフェイススレッドの裏で
ユーザーインターフェイスとは直接関係しないような
重い処理をワーカースレッドでやる事で処理中の表示を更新しつつ、
ユーザーからの操作も受け付ける事ができるようにする
と言った部分かなと思っています。
これは、処理能力は2倍になるとかと言う話ではなくて
シングルスレッドだと重い処理の為にユーザーインターフェイスの
部分が止まってしまうというケースを緩和する為の方法論で
処理能力を上げると言う話で有りません。
他の方も書かれていますが、処理能力を上げるという方に
考えるのであれば、マルチスレッド化する前に元々の処理に
無駄がないかと検討した方が良いと思います。
マルチコアでマルチスレッドを使う事で処理性能を
向上させると言うのはかなり慎重に設計を行って
スレッド間のバランスをうまく取る必要があると思いますよ。
結局、同期処理等で足を引っ張り合って結果あんまり変わりません
なんて事もありえる話です。
皆さんありがとうございました。
とりあえず既存の部分を高速化し、その上でどのような部分がマルチスレッド化できるか考
えていきたいと思います。