せっかく360向けに作るのだから、そのマルチコアを活かしたコードにしたいと思う。で、上にあるようにThread.SetProcessorAffinityメソッドを使えば、スレッドを別のコアに割り振ること自体は簡単のようだ。
問題はどうやってゲーム内の動作を分担させるかだよなあ。まともな同期処理などはいっさいやりたくないので、ゲーム本体に関係ない背景処理とかパーティクル処理とかを分離するのが基本か。
UpdateメソッドではMonitorなどを使ってメソッドを抜ける前に同期を取る必要がありそう。
- スレッド同士を協調動作させる「同期制御」(http://www.atmarkit.co.jp/fdotnet/mthread/mthread04/mthread04_02.html)
Drawメソッドに関しては謎だ。GPUにマルチスレッドから非同期にアクセスするとおそらくひどいことになるので、こっちはマルチスレッド化してはいけないんだろう、たぶん。
するとマルチコアの恩恵を受けるためにはDrawメソッド側の負担を減らしてUpdateメソッド側で前処理をなるべくやっておいたほうがいい、ということになるのか?ただUpdate側の負荷を増やすと、フレーム落ちによる処理能力稼ぎがしにくくなりそうな感じもする。
XNAでのマルチコアハンドリングに関する、この辺の定石が載っているいいドキュメントはないのかね。