タスクシステム

以下、昨日の続き。
1、タスク間の依存関係を管理するタスクを作る

  • 論外。タスク間の依存を管理するタスク間を管理する…(以下ループ)破綻するのは目に見えてる。

2、タスクは自分を参照してるタスクのポインタを全部持っておく

  • 同上。管理しきれるとは思えない。

3、タスクのdeleteは消去フラグを立てておくことによって、それを参照しているタスクに通知する。実際にdeleteするのは一フレーム後

  • 微妙。やってできないことはないと思う。が、利点がほとんどない気がするので却下。

タスクシステムのメリットは個々のタスクの独立性が高いこと、そのため擬似的に並行的に処理してるかのように書けるってこと。
依存関係にポインタをつかって他のオブジェクトを直接参照するのは、その独立性を損なうわけで。だったらタスクが直接他のタスクを参照しない構造にするのがよさそう。ってわけで4と5。
4、タスク間で情報を通知する仕組みをタスクシステム側に作る

  • タスク対タスクって関係ではなくタスク間通信オブジェクトを通して間接的に情報を送るようにする。deleteする前に死ぬぞーってメッセージを送ればいい。後は必要なタスクはそのメッセージを読んで適切な処理をすればいい。

5、生のポインタを使わない

  • 個々のオブジェクトにユニークなIDを振って他のオブジェクトを参照するタスクはそのIDを通してアクセスする仕組みを作る。

とりあえず最後の二つを詳しく検討してみようと思う。

書いてるうちになんか混乱してきた…どっか根本的に間違ってるような。前半と後半で話がつながってない…
とりあえずまた明日。

追記。5番で他にスマートポインタを使うのが考えられる。問題は循環参照の場合とオブジェクトの所有権をどこに持たせるのか。単純なオブジェクト参照にはboostのweak_ptrが使えるような気がしないでもない。
ともかくどんな方法であれ、破棄されたオブジェクトにアクセスすることがなければいいわけで。それにタスクの実行順序や描写が絡んでくるのが面倒な理由。