[過去ログ]
ゲームプログラミング相談室 (986レス)
ゲームプログラミング相談室 http://game.5ch.net/test/read.cgi/gamedev/1005040025/
上
下
前次
1-
新
通常表示
512バイト分割
レス栞
抽出解除
レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
361: 名前は開発中のものです。 [sage] 02/02/07 15:26 ID:??? http://www.hh.iij4u.or.jp/~peto/Games/games_top.html を参考にしてC++でタスクを使っています。新しいタスクを作るときに Cならば TCB* t = task_make(pri,func)のようにすれば、 task_makeの実装によってあらかじめmallocしておいたヒープを渡せますが、 C++では TCB_HOGE* t = new TCB_HOGE(パラメータ); task->add(t)//TCB_HOGEは基本クラスTCB_BASEを継承しているので代入できる のようになって毎回new を呼ぶことになってしまいます。 これを解決するにはどうすればいいでしょうか? それとも気にするほどのことではないのでしょうか http://game.5ch.net/test/read.cgi/gamedev/1005040025/361
363: 名前は開発中のものです。 [sage] 02/02/07 20:36 ID:??? >>361 1. placement new を使う 2. operator new を定義して、自前でメモリ管理をする あと STL 使っている場合テンプレートパラメタで渡す allocator にも手を入れないと、 完全にはメモリを管理下にはおけない。ただ、そこまでやる意味があるかというと、 俺は無いと思う。 (仕事でメモリの制限が厳しいハードを対象にプログラミングしてる場合を除く) http://game.5ch.net/test/read.cgi/gamedev/1005040025/363
364: 名前は開発中のものです。 [sage] 02/02/07 22:46 ID:??? >>361 そもそも C++ なら、タスク用の構造体を用意せずに struct Task { virtual void Update(unsgned tick) = 0; }; とでもインターフェースを用意してやって、Task を継承したクラスを、自機/弾/敵機 など必要なだけ用意。あとはメインループの中で using namespace boost; using namespace std; list<shared_ptr<Task> > taskList; for_each(taskList.begin(), taskList.end(), bind(&Task::Update, _1, tick); とループをまわせば終わりって気がする。 実際には taskList への新規タスクの登録/削除のタイミングに関しては気をつける必要が あるけど(特に for_each 使う場合には、ループの最中に削除すると iterator が不 正な値を指すことになる) taskList への挿入削除時に動的なメモリ確保/開放処理が発生するので、メモ リ不足が発生しては困る環境では allocator を自作するか、list の変わりになる コンテナを自前で実装する。 タスクの新規作成/削除時に動的なメモリ確保/開放処理が入るので、ヒープの 断片化が気になる場合には Task::new, Task::delete を自前で用意する。 とか細かい注意点があるけど、そんなものでしょ。 http://game.5ch.net/test/read.cgi/gamedev/1005040025/364
366: 361 [sage] 02/02/08 13:50 ID:??? お答えしてくれてありがとうございました。 >>363 operator new はクラスごとに書かなくちゃいけないのかな? とりあえず何回もnewされるクラスに使ってみて、パフォーマンス を比べてから、効果が大きいようであれば他のクラスにも使ってみます。 >>364 うう、関数オブジェクトだとかそこら辺は勉強してないのであまりわからないです もうしわけない。想像していた以上にSTL周りのことは重要になってきそうですね。 Effective STLでも読んでみることにします。 http://game.5ch.net/test/read.cgi/gamedev/1005040025/366
375: 名前は開発中のものです。 [sage] 02/02/16 14:06 ID:??? >>361,366 ワシも同じページ見ながらC++でタスク作ったことがある。 そんときは363と全く同じやり方に行き着いたよ。 メモリ管理は手を抜いて固定サイズメモリ領域の配列に したけど。 いちいち各クラスのoperatow newを用意する必要はなくて、 タスク基底クラスのoperator newだけ自前で用意して、継承 させてやればOKOK。 関数ポインタの扱いがC++だと厄介なので、TCBの内部では statusだけ保持して、別途用意した関数ポインタテーブルを 引くようにした方が楽だと思う。 ttp://www.emit.jp/prog/prog_cpp0.html この辺参照。 http://game.5ch.net/test/read.cgi/gamedev/1005040025/375
メモ帳
(0/65535文字)
上
下
前次
1-
新
書
関
写
板
覧
索
設
栞
歴
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.375s