タスクシステム

ゲームのプログラムでよく使われるタスクシステムについて。擬似的に各オブジェクトが平行的に動作しているかのように記述するための手法。いわゆるOSでいうタスクとは別物。
基本的な部分は以下の本を参考にどうぞ。C言語による古典的タスクシステムからC++でのタスクシステムまでをわかりやすく解説しています
Windowsプロフェッショナルゲームプログラミング2 ISBN:4798006033

このタスクシステムという手法は広く用いられていますが、いくつか問題点もあって

  • タスクの状態遷移の処理
  • タスク間の依存関係の処理
  • 実行順序が可変であるためバグが見つけにくい

代表的なのはこんなとこかな。他にもいろいろあると思うけど。
よくあるバグとして、タスクが他のタスクを参照しているとして、参照先がdeleteされても、そのことを参照元タスクに伝えないとdeleteされたメモリをアクセスして落ちる、とかが挙げられる。このとき実行順序が可変ってことで再現性のない、いつ起こるかわからないバグになる、と。
タスクシステムについてはここの246〜でいろいろと話題になってる。
http://pc2.2ch.net/test/read.cgi/gamedev/1067458051/
http://mimizun.com:81/2chlog/gamedev/pc2.2ch.net/gamedev/kako/1005/10051/1005144931.html
http://makimo.to/2ch/pc2_gamedev/1067/1067458051.html
2chの過去ログが飛んでるのでリンク追加。
とりあえずタスク間の依存関係をうまく処理する方法について。他のタスクの情報の参照は普通ポインタを用いるわけだけど、この部分の処理をどうするのかという問題。
実装例としてとりあえず思いついたものを挙げてみると

  1. タスク間の依存関係を管理するタスクを作る
  2. タスクは自分を参照してるタスクのポインタを全部持っておく
  3. タスクのdeleteは消去フラグを立てておくことによって、それを参照しているタスクに通知する。実際にdeleteするのは一フレーム後
  4. タスクに情報を通知する仕組みをタスクシステム側に作る
  5. ポインタは使わない。

以上。検証はまた明日。