初老ゲームプログラマの覚え書き

マルチマルチスレッドとゲームってどんなもの?

マルチコアとは簡単に言うと2つ以上のCPUコアを1つのパッケージにまとめる技術です。
プログラムを実行するCPUコアが複数あるので、プログラムを並列に実行することで性能向上する事が出来ます。

今までのCPU(シングルコア)が一台のベルトコンベアで作業しているとしたら、マルチコアはベルトコンベアが二台以上あると考えると、なんだか早そうに感じますね。

しかし、いつも並列に実行できるとは限りません。相手の結果を基に処理する場合、相手の結果が出るまで何も出来ない状態が生まれます。これではマルチコアの意味がありません。
従来ゲームプログラミングは’自分の位置が決まらないとカメラの位置を決められない’など処理の順序が重要で、並列に処理するマルチコアには向かないと言われてきました。

capcom製MT Frameworkの記事を参考に実験してみましたが、並列処理の良い配分は簡単ではありませんでした。

例えば、キャラクタ個々の更新は並列に処理できますが、キャラクタ同士の接触は並列で行えず、接触(衝突)判定に処理の負荷が集中してしまいます。

タスクマネージャー

上の画像は自作プログラムのタスクウィンドウです。横にブロックが伸びるほど並列に処理しています。
逆に横方向へ伸びていないブロックは処理が一箇所に集中していることになります。

50体のキャラクタ同士を歩かせて衝突判定させてみましたが、ほとんどブロックが横に伸びていないので、プログラムの並列度が低いです。
今後は簡単なゲームを作成しながら良い実装の研究を進めていこうと思っています。

マルチコアで有効な並列処理プログラムは設計の複雑さもあるのですが、デバックの難しさも増してしまいます。
中でもよく話題に上がるのはリソースの競合です。

例えば私と妻が一杯のジュースを同時に飲む事は出来ません。「先にコップを取った方が飲む」などのルールをプログラムに盛り込む必要があります。

プログラム上で競合が起きる期間(部分)をクリティカルセクションと呼びます。
クリティカルセクション内で排他制御を行なわなければ、プログラムは誤動作を起こすばかりか、最悪の場合は停止します。

我が家では、自称愛妻家の私が「常に妻が優先」というルールで円滑に動いております。