タスクシステムのメリット、デメリット、求める機能、問題点のまとめ
求める機能
・C++としてクラスを用いて実装する。その際Javaに近い方向で設計を行えば派生して使いやすいクラスになると考えている。
・派生させやすくて使いやすいクラス
メリット
・空領域のリスト(以後フリーリスト)をあらかじめ用意しておき、そこからメモリの確保を行うので
単純にnewなどで生成するより高速に処理できる。
・リスト化されているので切り離し、追加が簡単で高速
デメリット
・近年のPCハイスペック化により高速化を意識する重要性が薄れている(タスクシステム自体いらないんじゃないか)
・std::listもアロケーターいじれば高速化可能で、タスクシステムと同様の事ができる。(これを使えばタスクシステム再設計の手間いらず)
その他STL、boostに応用できるものがある(std::list,std::vector,boost::function,etc...)。
・フリーリストを用意するとフリーリストの存在を意識しないといけない。(関係性の管理とコーディングミスの誘発につながる恐れあり?)
とくにこだわっていない部分
・フリーリストの存在(なくなると綺麗に設計できそう、そうすると本当に標準のものでOKな展開に...)
・タスクシステムという名称。
--------------------------------------------------------------
リンクが張られたため情報の混雑を防ぐためにリンクを張っておきます。
http://hibari.2ch.net/test/read.cgi/gamedev/1285930493/
念のために補足しておくと私の目指す所は
タスクシステムを基盤としているのであくまでタスクシステムという言葉を使いますが
「コンテナ」と脳内置換して眺めてもらっても良いかもしれません。
--------------------------------------------------------------
【※タイトル変更】 使いやすいタスクシステムについて → 使いやすいタスクシステム設計・実装にご協力を
タスクシステムという不明瞭なモノを作る前に、何が本当に必要なのかを明確にするべきだという意見を貰ったので
冒頭に私の思うタスクシステムの利点を書いておきます。
・タスクシステムには汎用的な領域をリスト化して高速に処理できるメリットがある。
・クラスとしての特性を失うような設計や複数のクラスと関係性を持つようなデメリットは避けたい。
私にも明確な方向性が決まっていない部分が多数ありますので、方向性が変わるかもしれません。
利点への指摘、追加、設計案など色んな意見が欲しいです。
--------------------------------------------------------------
現在C++にてclass Taskを作成しようと試行錯誤しております。
タスクシステムというのはシューティングではよく使われている技法のようで
検索すればどんなものか、さらにコードも見つける事が出来るくらい有名なものです。
しかし実際に使ってみると汎用性に欠けていたり使いづらかったりするので再設計したいと考えています。
・タスクはあらかじめ空き領域を用意しており使用する場合に、そこから切り離して使う場合が多いです。
→ 空き領域をグローバル領域に配置する場合が多いようですが、理想としてはTaskクラスの派生先で用意できれば汎用性が高まると思っています。
・空領域から切り離して使用するので型が不明確。もしくはタスク用のイテレーターを別途用意する事で型が不明確になる場合が多い。
→ テンプレートを用いて解決できないかと模索中(テンプレート勉強不足、テンプレートでどこまでできるのか...)
個人的に使いやすいんじゃないかというTaskクラスの形式として理想のTask使用例を書いておきます。
使いにくそう、どうすれば使いやすくなりそう、車輪の再発明などの意見・情報・アドバイスが貰えればと思います。
class Move : public Task // タスククラスを継承すれば派生クラスはタスクシステムの機能を持てる
{
Move() : Task( 100 ) {} // 初期化時にMoveの空き領域確保ができれば使いやすい? この場合Move領域が100個確保される
virtual void run() = 0; // 適当な処理
int x; // 適当な値
int y; // 適当な値
};
class Move : public Task
{
Move( int task_num ) : Task( task_num ) {}
virtual void run() = 0;
int x;
int y;
};
class EnemyMove : public Move // 敵
{
EnemyMove() : Move( 100 ) // EnemyMove領域100個確保
void run(); // 敵の動き
}
class BulletMove : public Move // 弾
{
BulletMove() : Move( 5000 ) // BulletMove領域5000個確保
virtual void run(); // 弾の動き
}
int main()
{
BulletMove* bullet_move = new BulletMove();
/* ~ bullet_move値追加処理(省略) ~*/
for ( bullet_move->setHeader(); bullet_move->hasNext(); ) // 参照位置を先頭にして次値が有るか
{
bullet_move->next(); // 参照位置を次に
bullet_move->run(); // 処理を行う
}
}