- 1 名前:名前は開発中のものです。 mailto:sage [2009/02/19(木) 02:21:01 ID:k4ODtuXP]
- タスクシステムについての議論、相談、質問、雑談などのスレです
part4 pc11.2ch.net/test/read.cgi/gamedev/1233459490/ part3 pc11.2ch.net/test/read.cgi/gamedev/1226199100/ part2 pc11.2ch.net/test/read.cgi/gamedev/1196711513/ part1 pc11.2ch.net/test/read.cgi/gamedev/1173708588/ ・タスクと呼ばれる実装は、非常に多岐に渡ります 古典タスクシステムについての話題は「>>2」と明示してください そうでない場合はカスタム版タスクであることを明示してください ・人を憎んで言語を憎まず
- 488 名前:名前は開発中のものです。 mailto:sage [2009/03/03(火) 13:14:20 ID:HSt7mZci]
- >>484
携帯からだったから483よく読んでなかったぜ すまんこ >>483 根拠の無い話ばかり並べても叩かれるだけ
- 489 名前:名前は開発中のものです。 [2009/03/03(火) 18:22:34 ID:NIkO1+LI]
- いいやあるね
少なくともごった煮をデータベースとか言ってた馬鹿のソースには確実にあるね そもそもそいつは制限や型を言語の進化の過程でできたものという認識がまったくなかった タスク信者の大半がこんな奴ら 関連をタスクにするなんて言ってるけど 関連クラスとどうやってやりとりする気なんだよ グローバル変数かポインタの保持くらいしかないだろ また、無駄に問題が増える(笑) 使わないって選択肢は選べないのかね
- 490 名前:名前は開発中のものです。 [2009/03/03(火) 18:25:01 ID:NIkO1+LI]
- カプセル化もわからないから自機のクラスに弾の処理書いちゃうんだよ
お前等馬鹿は
- 491 名前:名前は開発中のものです。 [2009/03/03(火) 18:29:59 ID:UVBLimNu]
- >>489
>>490 レスを二つにしてカプセル化したつもりですかwwww
- 492 名前:名前は開発中のものです。 mailto:sage [2009/03/03(火) 18:34:43 ID:gnPoJpgi]
- >>489
こんな馬鹿、久しぶりに見た。 悪いこと言わないから、OOPの基礎から勉強しなおしなよ。
- 493 名前:名前は開発中のものです。 [2009/03/03(火) 18:57:02 ID:NIkO1+LI]
- ムリムリ
タスク信者の組み方じゃ絶対分離なんて不可能 グローバルインスタンスホルダーが絶対にある
- 494 名前:名前は開発中のものです。 mailto:sage [2009/03/03(火) 19:09:12 ID:gnPoJpgi]
- >>493
仮想関数すら知らなさそうだな。本当、生きてて恥ずかしくないか?
- 495 名前:名前は開発中のものです。 [2009/03/03(火) 19:19:33 ID:NIkO1+LI]
- 仮想関数?
いまの話題と全く関係無いけど頭おかしいの? 弾クラスで自機クラス呼んだら自機クラスのヘッダーが必要になるんだぜ 基底クラスじゃ自機クラス呼べないんだぜ もしかしてしらなかった?
- 496 名前:名前は開発中のものです。 mailto:sage [2009/03/03(火) 19:22:49 ID:gnPoJpgi]
- >>495
> 弾クラスで自機クラス呼んだら自機クラスのヘッダーが必要になるんだぜ 呼ぶ必要なんか全くないんだが。ほんと、馬鹿だよね。
- 497 名前:名前は開発中のものです。 [2009/03/03(火) 19:27:56 ID:NIkO1+LI]
- でも、呼んでるんでしょ?
だからタスクシステムに固執してるんでしょ? 嘘はよくない(笑)
- 498 名前:名前は開発中のものです。 mailto:sage [2009/03/03(火) 19:31:36 ID:gnPoJpgi]
- >>497
本当、馬鹿すぎて泣ける。 ソース書いてみな。俺が添削してやるから。
- 499 名前:名前は開発中のものです。 [2009/03/03(火) 19:38:27 ID:NIkO1+LI]
- は?
俺はごった煮とかやってる馬鹿なタスク信者をぶん殴ってるところなんだよ 俺がなんのソースをだすんだよ 日本語大丈夫かよ(笑) ああ、頭悪いのか それじゃしょうがないな
- 500 名前:名前は開発中のものです。 mailto:sage [2009/03/03(火) 19:42:26 ID:gnPoJpgi]
- >>499
だからお前の糞タスクシステムのソースを出せと言ってるんだ。 全タスクのヘッダをincludeしているところを書き直してやる。
- 501 名前:名前は開発中のものです。 [2009/03/03(火) 19:58:25 ID:NIkO1+LI]
- は?
俺、タスクシステムなんて使わないんだけど? だいたいソース書きたきゃ自分で書けよ 仮想関数とか明らかにズレた話題だしてる格下のお前の相手なんかしなきゃいけないんだよ
- 502 名前:名前は開発中のものです。 mailto:sage [2009/03/03(火) 20:10:55 ID:gnPoJpgi]
- >>501
仮想関数わかってないのお前。 > タスク信者が必要な分だけインクルードしてるなんて考えられないから > ごった煮を表現するために総合ヘッダー絶対あるだろ 何度でも言うが、そんなものはないし、そんなことをする必要すらない。 まあ、このスレでわかってないのお前だけだろうから、俺はもう帰る。 基地外の相手してても仕方ないんでな。
- 503 名前:名前は開発中のものです。 mailto:sage [2009/03/03(火) 20:38:10 ID:fQh6ZhSe]
- 俺も基底クラスに仮想関数つくってそれ呼び出せば、いちいち総合ヘッダーなんて必要ないと思う。
- 504 名前:名前は開発中のものです。 [2009/03/03(火) 21:24:23 ID:NIkO1+LI]
- は?仮に基底がゲームオブジェクトだとして自機特有の処理はどうやって呼ぶんだよ
まさか全部ゲームオブジェクトにもたせんの?(笑) ああ、お前等のごった煮ってそこまで腐ってんだ
- 505 名前:名前は開発中のものです。 mailto:sage [2009/03/03(火) 21:37:48 ID:fQh6ZhSe]
- ああ凄いな。凄まじいなID:NIkO1+LIは。
とりあえず総合ヘッダー(笑)については、必要ないことを分かったかい? まずはそこからだ。
- 506 名前:名前は開発中のものです。 mailto:sage [2009/03/03(火) 21:39:53 ID:I1ftq204]
- ぬるぽ
- 507 名前:名前は開発中のものです。 mailto:sage [2009/03/03(火) 21:48:44 ID:gnPoJpgi]
- >>504
お前は、OOPの基本がわかってない。 腐ってんのはお前の頭。
- 508 名前:名前は開発中のものです。 mailto:sage [2009/03/03(火) 21:54:48 ID:gnPoJpgi]
- アンチタスカーって、なんで ID:NIkO1+LI みたいな OOPすらまともに使いこなせない
糞野郎ばっかりなんだろうかね・・
- 509 名前:名前は開発中のものです。 mailto:sage [2009/03/03(火) 21:57:27 ID:fQh6ZhSe]
- さすがのアンチタスカーの俺も擁護できん。
同じPG職なら陰口叩かれてもいいレベル。
- 510 名前:名前は開発中のものです。 mailto:sage [2009/03/03(火) 22:01:20 ID:I1ftq204]
- ID:NIkO1+LI
2009年ゲ製痛い(ノ∀`)ニュース第1位確定だな。 道理でアンチタスク厨とは、マトモな会話が成り立たないわけだ。
- 511 名前:名前は開発中のものです。 [2009/03/03(火) 22:11:53 ID:NIkO1+LI]
- は?
どうせ総合ヘッダーよんでんだろ そうじゃなきゃごった煮の意味ないもんな 悔しかったら総合ヘッダー無しでプログラム組んでみろよ データベースなんだろデータベース(笑)
- 512 名前:名前は開発中のものです。 mailto:sage [2009/03/03(火) 22:14:31 ID:fQh6ZhSe]
- アンチタスカーは、タスクシステムを使って知ったうえで、叩くべきだわ。
使ったこともないのに想像だけで総合ヘッダーや癒着云々と否定しているのは滑稽すぎるわ。
- 513 名前:名前は開発中のものです。 [2009/03/03(火) 22:16:25 ID:NIkO1+LI]
- ハイハイ、自機のソースから弾のソースを取り払ってから言ってね
- 514 名前:名前は開発中のものです。 mailto:sage [2009/03/03(火) 22:21:10 ID:AybnbhgS]
- 大昔ポケコンでシューティングを作ってた時は
敵ワークx16 弾ワークx16 とか固定長バッファを用意して、使用中フラグのビットマップで管理して動かしてた ワークエリア内にポインタを書いてリストや仮装関数を実現するには500kHz程度クロックのCPUには重荷だった 今はもうゲームとして動いてるならなんでもいいやって感じ
- 515 名前:名前は開発中のものです。 mailto:sage [2009/03/03(火) 22:41:02 ID:I1ftq204]
- >>511
総合ヘッダー(笑)って何だよ! 総合病院にでも診てもらってこい。 C++入門者未満のくせに、デカイ顔してノイズ垂れ流しやがって。 タスクシステムを語るには20年早いわ。
- 516 名前:名前は開発中のものです。 mailto:sage [2009/03/03(火) 23:02:20 ID:Gs0swA+H]
- main.h に extern 使いまくりで
どこからでも #include "main.h" をすればコンパイルは通る 分割コンパイルの意味の分かっていないバカのやることだよ ええ そうですよ 私の講師がそうだったように・・・
- 517 名前:名前は開発中のものです。 [2009/03/03(火) 23:13:28 ID:KhkzCgZ3]
- アンチタスカーだが俗に言うタスクシステムみたいな仕組みを
C++で実現している ソース晒そうか?
- 518 名前:名前は開発中のものです。 mailto:sage [2009/03/03(火) 23:28:24 ID:UfdUZfM/]
- j
- 519 名前:名前は開発中のものです。 mailto:sage [2009/03/03(火) 23:37:31 ID:UfdUZfM/]
- 仮想関数と総合ヘッダの話は
本元のクラスでなくて、抽象クラスを、includeするということ? /*総合.h もしくはそれの#include*/ class IHoge : public ITask { virtual SomeFunc() = 0; }; /*Hoge.cpp*/ class CHoge: public IHoge { SomeFunc(); }; ということ? 多分、総合ヘッダといった人は、IHogeを抜いて考えていたと思う もしくは、それでもIHogeを利用するところからIHogeが見えないといけないジャンという ことを言いたかったのかも タスクとマルチコアとかの関連っぽい記事を発見したので張っとく 理解はしていないので、賢い人解説して そして建設的な話をして www.gamasutra.com/view/feature/3941/sponsored_feature_designing_the_.php?page=1
- 520 名前:名前は開発中のものです。 mailto:sage [2009/03/03(火) 23:38:58 ID:UfdUZfM/]
- 戻り値書き忘れたけれど、突っ込まないで
- 521 名前:名前は開発中のものです。 mailto:sage [2009/03/03(火) 23:47:42 ID:YUVx5SHc]
- >>519
タスクと言う言葉を軽々しく使わないで下さい
- 522 名前:名前は開発中のものです。 [2009/03/03(火) 23:52:38 ID:NIkO1+LI]
- >>519
馬鹿はどっかいけよ
- 523 名前:ID:EEKBitmg mailto:sage [2009/03/04(水) 00:02:09 ID:vv/UkwCS]
- 厨房見参
総合ヘッダーさん(ID:NIkO1+LI)と引数さんは同じ人だと思うが、まぁそれはそれとして 総合ヘッダーさんはCodeZineの記事に出てくるようなタスクシステムのことを言ってるんだろ? CodeZineの記事を書いた人は俺と同い歳くらいの学生さんだと思う。叩くつもりはないが グチャグチャに絡み合ってる反面教師的なコードとしてはなかなか秀逸だなーと思う task.hに 自機、敵機、自機の弾、敵機の弾 狙い撃ち、爆発、自機の制御、敵の出現制御 ステージ制御、ライフバー管理、スコア管理、タイトル画面、ゲームオーバー画面 といったTaskEx派生クラス全ての宣言をまとめてぶちこんでいる で、例えば自機弾クラスのソースコードの中を見る。まず先頭でtask.hをインクルードしている 次に自機弾クラスの当たり判定メソッドの中を見る。こいつの中では int 敵数=GetCount(ENEMY); // 敵の数よこせ (循環リストを総舐め) for(int i=0;i<count;i++){ 敵クラス *task=(敵クラス*)GetTask(ENEMY , i ); //i番目の敵よこせ (ヒットするまで循環リストを舐める) … } という感じで 『"グローバルインスタンスホルダー"の検索結果 3 件中 1 - 3 件目』 に対して、『敵を全部くれ』と要求して、敵クラス型にキャスト(static_cast)している 循環リストを舐めまくりでびびった。HSPでこんなコード組んだら重くて普通に死ねる C/C++を使うメリットを遺憾なく発揮してると思った
- 524 名前:名前は開発中のものです。 mailto:sage [2009/03/04(水) 00:18:28 ID:43lD+2sK]
- >>523
アンチだけれども、別にごった煮にして、 全てをなめるような実装にしなくてもいい気がする 最初から型ごとにリストを持ってそれごと返せばいい訳だし ヘッダに全部宣言を入れていたのも、サンプルとしてそうしていただけで、 ヘッダが必要な個々の実装でincludeさせてそこでキャストさせればいい そうすると、型ごとリストへ割り振りは、本当の型で判断できないので 別の情報で型を識別させるようにして型ごとリストを持たせればいいのでは? タスクシステムに入れる時に型名を文字列で渡すとか ここらへんは、タスクシステムの弱点ではない気がする 何回も語られているけれど、本当の弱点は、 静的に片付くものをわざわざ動的にして問題を複雑にしている点だと思う 素人考え?
- 525 名前:名前は開発中のものです。 mailto:sage [2009/03/04(水) 00:23:18 ID:w8Rwmagw]
- > 静的に片付くものをわざわざ動的にして問題を複雑にしている点だと思う
意味がわからない。例えば?
- 526 名前:名前は開発中のものです。 mailto:sage [2009/03/04(水) 00:31:05 ID:mN9/jFMx]
- >>524
それなら、最初からふつーにメンバ変数で持たせて終わりじゃない? class Scene { Player player_; Enemies std::list<Enemy> enemies_; ... };
- 527 名前:名前は開発中のものです。 mailto:sage [2009/03/04(水) 00:40:31 ID:43lD+2sK]
- >>525
静的というのは、シーンクラスのメンバもしくはそのメンバに 自機、敵機、自機弾、スコア管理、ステージ制御などを階層を持たせて 配置しているということ 動的というのは、(少なくともインターフェイス越しには)ごった煮の グローバルなリストから個々のインスタンスが勝手に互いを参照し合って どうも統制が取れてなさそうに見えないこと 上の静的でも崩壊させることができるけれど、上手く設計すれば問題は起こらないはず で、ごった煮はその問題をただ先延ばしにしてしまっているようなイメージを持っている だからアンチ >>524 そう。そう思う。 だからアンチ
- 528 名前:名前は開発中のものです。 mailto:sage [2009/03/04(水) 00:48:30 ID:43lD+2sK]
- >>どうも統制が取れてなさそうに見えないこと
どうも統制が取れているように見えないこと
- 529 名前:名前は開発中のものです。 mailto:sage [2009/03/04(水) 02:40:49 ID:hHE159vF]
- >>448 の者だが、
タスク進化系がいまだにコンシューマゲーム開発の現場で生き残っているのは単純に無駄が無いから、ってのも理由の一つ。 スーファミからPS1へ、PS1からPS2へ、PS2からPS3へ移行するたびに、こんな大量のメモリ使い切れん、と思ったものだが なぜかマスター寸前の修羅場になるといつもメモリも速度も足りなくなりチューニングに明け暮れる日々が続く。 これはメモリ128Kのスーファミ時代から256MBのPS3まで、コンシューマ開発では変わらん定例行事。 そして常にメモリとコードの無駄を減らす圧力にさらされるんだけど、タスクみたいに毎フレーム相当数呼ばれる処理に 無駄が見つかると真っ先に削られる。 この修羅場では「可読性が…」とか「OOP的に…」なんて甘い理由よりも少しでも軽量なコードで動かすことが優先される。 で、PS3時代にもタスク進化系が生き残ってる、というわけだね。 仮想メモリつんでてスペックはユーザ毎にばらばらのPC環境では特定ハード向けにガリガリにチューニングなんて意味ないので PC環境でしか作ったことの無い人間には理解できんだろうけど、 コンシューマ開発や組み込み系とみたいに固有のハード性能を120%使い切る開発スタイルではよくあること。
- 530 名前:名前は開発中のものです。 mailto:sage [2009/03/04(水) 02:55:00 ID:43lD+2sK]
- >>529
なるほど。全くコンシューマーを知らないけれど、説得力がある では潤沢過ぎる程のメモリと、無限の演算能力がもしあったとしたら 喜んでタスクシステムは棄て去る?
- 531 名前:ID:EEKBitmg mailto:sage [2009/03/04(水) 03:04:13 ID:vv/UkwCS]
- ありえない仮定を持ち出すとかスゲェな
厨だけどさすがにこれは真似できないな お前は凄い。俺は頭痛がしてきた。寝る
- 532 名前:名前は開発中のものです。 mailto:sage [2009/03/04(水) 03:13:07 ID:43lD+2sK]
- 突込みがあったので補足。
>>530は、タスクシステムが貧困な環境で使えるという>>529に対して、 ならば、十分豊かな環境だったらそうではないのか?という質問。 無限〜は *話を簡単にするため* の誇張した表現。
- 533 名前:名前は開発中のものです。 mailto:sage [2009/03/04(水) 03:29:05 ID:hHE159vF]
- >>530
無限のメモリと無限の演算能力があったら…? それでも小規模なアクションゲーム系1人で作るならタスク進化系の管理システム使うと思う。 タスク系は下手に使うとバグの温床になるけど使いどころを間違えなければ便利だし。 まぁこれは慣れの問題なので、この手のゲームならこの手法で…とかだいたいやり方の想像つくし タスク系固有のバグで苦しんだ結果、バグの温床にならない作り方が出来るようになってるから、ってのもある。 慣れた人間にとっては開発効率いいんだよね、あれ。 まぁでも新人込みのプログラマ数十人で大規模オンラインゲームを作る、とかならたぶん違う方法取るけどね。
- 534 名前:名前は開発中のものです。 mailto:sage [2009/03/04(水) 04:55:07 ID:ll33Ou9u]
- >>533
無限の資源があってもリスクと教育コスト考えれば結局C++使うだろうねー 無限の納期と無限の人材があるなら・・・遊んで暮らすだろうなー
- 535 名前:名前は開発中のものです。 mailto:sage [2009/03/04(水) 05:47:21 ID:kXQL8zXx]
- タスクシステムってソースがタスクなわけで
プロセスがタスクじゃないのね ではマルチプロセス対応というのは真っ赤な嘘になるわけだ
- 536 名前:名前は開発中のものです。 mailto:sage [2009/03/04(水) 06:56:53 ID:m+X+Qg7j]
- >>527
タスクシステムはsingletonじゃねぇぞ。 タスクのなかに別のタスクシステムをcompositionで配置してタスクを 階層化できるが、お前本当にOOPわかってんのか?
- 537 名前:名前は開発中のものです。 [2009/03/04(水) 07:31:28 ID:NGMxgsfO]
- そんなの全く意味がないじゃん
だいたいそんなのやるならはじめから分けてもてよ
- 538 名前:名前は開発中のものです。 [2009/03/04(水) 07:34:46 ID:NGMxgsfO]
- 並列化はどう考えても嘘
並列にするなら少なくとも並列にするデータは分けないと動かない ごった煮でできるわけない
- 539 名前:名前は開発中のものです。 mailto:sage [2009/03/04(水) 08:44:10 ID:mN9/jFMx]
- >>529
メモリ使用量の大半を占めるのはテクスチャ・モデル・モーションなどのデータで、 CPU使用時間の大半を占めるのはヒット判定や AI 処理。 いわゆるゲームオブジェクト (プレイヤーとか) で多少削ったところで、誤差にもならない。
- 540 名前:名前は開発中のものです。 mailto:sage [2009/03/04(水) 08:48:07 ID:m+X+Qg7j]
- >>537
> そんなの全く意味がないじゃん そんなこたあ、ない。
- 541 名前:名前は開発中のものです。 mailto:sage [2009/03/04(水) 08:49:26 ID:2ryo6+k/]
- 数人で作るレベルなら擬似タスクでいいよ。
でもそれを超えると破綻すると思う。
- 542 名前:名前は開発中のものです。 mailto:sage [2009/03/04(水) 08:49:27 ID:m+X+Qg7j]
- >>538
阿呆すぎて泣ける。 前スレ510のプログラム、あれ並列化できないの? 本当に1行でもプログラム書けるの? タスクシステム使わなくていいから、前スレ510のプログラム、並列化してみなよ。
- 543 名前:名前は開発中のものです。 mailto:sage [2009/03/04(水) 08:51:55 ID:m+yO0HqN]
- >>508
彼を養護してるアンチはいないようだが そこまでして印象操作したいの?
- 544 名前:名前は開発中のものです。 mailto:sage [2009/03/04(水) 08:52:16 ID:m+X+Qg7j]
- >>526
> それなら、最初からふつーにメンバ変数で持たせて終わりじゃない? そのメンバ変数が指しているオブジェクトが生きていることを誰がどうやって保証するんだ?
- 545 名前:名前は開発中のものです。 mailto:sage [2009/03/04(水) 08:54:00 ID:m+X+Qg7j]
- >>543
このスレのアンチタスカーのレベルが総じて低すぎる。 タスクシステムに限らずフレームワークなんて、使える範囲で使えばいいだけのことなのに 完全否定する奴は完全肯定する奴と同罪で、頭おかしい。
- 546 名前:名前は開発中のものです。 mailto:sage [2009/03/04(水) 08:55:29 ID:mN9/jFMx]
- >>542
> 前スレ510のプログラム、あれ並列化できないの? そもそも、あれは名前がタスクなだけで、>>2 と設計全然違うけど。 いずれにせよ、データに依存性があり並列化はできない。 > m_vx = m_vx*m_m/(m_m+Star2.m_m) + Star2.m_vx*Star2.m_m/(m_m+Star2.m_m); > m_vy = m_vy*m_m/(m_m+Star2.m_m) + Star2.m_vy*Star2.m_m/(m_m+Star2.m_m); たとえばこのコード、複数の Star インスタンスの m_vx, m_vy を同時に読み書きしている。 複数スレッドで走らせた場合、値が保障できなくなる。
- 547 名前:名前は開発中のものです。 mailto:sage [2009/03/04(水) 08:57:09 ID:m+yO0HqN]
- >>545
> 完全否定する奴は完全肯定する奴と同罪で、頭おかしい。 つ鏡
- 548 名前:名前は開発中のものです。 mailto:sage [2009/03/04(水) 09:08:31 ID:mN9/jFMx]
- >>544
526のコードは、ポインタではなく実体で持たせているから、保障も何も要らんと思うが。 いずれにせよハンドルクラス (整数値とインスタンスの対応付け) は用意したほうが 便利だが、その場合でもプレイヤー・敵は別の ID 体系にしておくな。 たとえば、最大 2 プレイヤー同時プレイ可能なゲームで、プレイヤーに向かって 進む敵を作りたい場合。 class PlayerID { int id_; friend class Scene; }; class EnemyID { int id_; friend class Scene; }; class EnemyEnv { virtual ~EnemyEnv() {}; virtual PLAYER_ID GetNearestPlayer(ENEMY_ID enemy_id) const = 0; virtual Vec3 GetPlayerPos(PLAYER_ID player_id) const = 0; }; class Scene : public EnemyEnv { Player player_[2]; std:::list<Enemy> enemies_; public: void Update() { player_.Update(*this); enemy_.Update(*this); } virtual PLAYER_ID GetNearestPlayer() const { ... } virtual bool GetPlayerPos(PLAYER_ID player_id, Vec3* pos) const { // 実際には、ここで player_id.id の値チェックを行い、生存していなかったら false 返す *pos = player_[player_id.id_].GetPos(); return false; } } void Enemy::Update(EnemyEnv& env) { PLAYER_ID player_id = env.GetNearestPlayer(this.GetID()); Vec3 pos = env.GetPlayerPos(player_id); // あとは pos に向かって自分の位置を調整 }
- 549 名前:名前は開発中のものです。 mailto:sage [2009/03/04(水) 09:09:02 ID:m+X+Qg7j]
- >>546
> たとえばこのコード、複数の Star インスタンスの m_vx, m_vy を同時に読み書きしている。 その言い方は不正確だし、並列化の本質をわかっていない。 そのコード、そもそも元コードがすこしおかしいのだが、タスクシステムを使おうと使うまいと Starオブジェクトの集合から任意の2体を取り出して、その振る舞いを書きたいとする。 foreach(var star1 , star2 in stars) { star1.m_vx = star1.m_vx*star1.m_m/(star1.m_m+Star2.m_m) + Star2.m_vx*Star2.m_m/(star1.m_m+Star2.m_m); star1.m_vy = star1.m_vy*star1.m_m/(star1.m_m+Star2.m_m) + Star2.m_vy*Star2.m_m/(star1.m_m+Star2.m_m); } } これは、次のようにかきかえる。 foreach(var star1 , star2 in stars) { star1.m_vx_new = star1.m_vx*star1.m_m/(star1.m_m+Star2.m_m) + Star2.m_vx*Star2.m_m/(star1.m_m+Star2.m_m); star1.m_vy_new = star1.m_vy*star1.m_m/(star1.m_m+Star2.m_m) + Star2.m_vy*Star2.m_m/(star1.m_m+Star2.m_m); } foreach(var star in stars) { star1.m_vx = star1.m_vx_new; star1.m_vy = star1.m_vx_new; } これは、コリジョン判定とそれに対するアクションを切り離すときもそう。 これをきちんと切り離しておかないと並列化できない。 前スレでコリジョン判定は並列化できないとか言ってた馬鹿がいたけど、アクションを切り離さないから出来ない。
- 550 名前:名前は開発中のものです。 mailto:sage [2009/03/04(水) 09:11:17 ID:mN9/jFMx]
- >>549
その指摘は正しいが、前スレ 510 を使うかどうかとまったく無関係だよね。 タスクとやらを使ったから並列化できるようになるわけじゃないし、並列化が 楽になるわけでさえない。 けっきょく、同じ労力を咲く必要がある。
- 551 名前:名前は開発中のものです。 mailto:sage [2009/03/04(水) 09:11:22 ID:m+X+Qg7j]
- >>548
> いずれにせよハンドルクラス (整数値とインスタンスの対応付け) は用意したほうが そんなものあえて作る意味があるか?boost::weak_ptrで済むだろ。 そもそも、548のソースは典型的なタスクシステムで記述するよりはるかに複雑なんだが、 あんたは、タスクシステムの否定派なのか肯定派なのか何なんだ?
- 552 名前:名前は開発中のものです。 mailto:sage [2009/03/04(水) 09:15:37 ID:m+X+Qg7j]
- >>550
> タスクとやらを使ったから並列化できるようになるわけじゃないし、並列化が > 楽になるわけでさえない。 それは違うね。タスクシステムの側に並列化する部分を担当してもらう。 タスクシステムを使う側は、それを利用すればいいだけ。 タスクシステムは底辺の馬鹿プログラマが書かなくとも、別の、もっと優秀なプログラマが書けばいい。 並列化効率とか、メモリcacheとか、シェーダーに対するタスクの分配とか、そういうのを考慮して効率の いい並列化プログラムを書ける奴がな。 こうして、はじめてゲームの分業が成立するんだが。 あんたはちょっとはまともなプログラマに見えるが、大規模なゲーム開発に取り組んだことはないのか?
- 553 名前:名前は開発中のものです。 mailto:sage [2009/03/04(水) 09:17:40 ID:m+X+Qg7j]
- >こうして、はじめてゲームの分業が成立するんだが。
脱字。「ゲーム開発における分業」の間違い。 いま読み返したら549は >foreach(var star in stars) >{ > star1.m_vx = star1.m_vx_new; > star1.m_vy = star1.m_vx_new; >} ここ、左辺はstar1ではなくstarだ。ごめん。
- 554 名前:名前は開発中のものです。 mailto:sage [2009/03/04(水) 09:24:16 ID:mN9/jFMx]
- >>551
> そもそも、548のソースは典型的なタスクシステムで記述するよりはるかに複雑なんだが、 以前から同じようなコード例書いてるんだけどな。前スレ 748 とか。 ・コンポジションで良いじゃん ・規模が大きいプログラムだと、どのタイミングで何が呼ばれるか、変更されるかが 分かることが重要。 この例だと Enemy::Update 時には EnemyEnv 経由で Scene のメンバ関数が呼ばれる だけと確定する。Enemy::Draw みたいな処理があったときに、EnemyEnv const& 使うか 別のクラスを用意するかは要検討(場合による)。 > そんなものあえて作る意味があるか?boost::weak_ptrで済むだろ。 スクリプトと連携するときに楽 boost::shared_ptr 使ってるとは限らない 別に weak_ptr 使える場合には、使えば良いと思うけど。
- 555 名前:名前は開発中のものです。 mailto:sage [2009/03/04(水) 09:25:22 ID:mN9/jFMx]
- >>552
> タスクシステムの側に並列化する部分を担当してもらう。 名前がタスクシステムなだけで、前スレ 510 とも >>2 ともまったく違う設計・実装について 語ってるということで FA?
- 556 名前:名前は開発中のものです。 mailto:sage [2009/03/04(水) 09:26:54 ID:m+X+Qg7j]
- 結局、並列化の本質は>>549なんだ。もう少し抽象化して書けば、こう。
foreach(var star1 , star2 in stars) { star1の新しく情報を書き込む領域 ← star1とstar2相互計算によって得る。 } foreach(var star in stars) { starの新しく情報を書き込んだ領域をcommitする。 } で、これをタスクシステム側に並列化する部分を受け持ってもらう。 例えば>>546であれば、次のように書けば上のプログラム(>>549)と等価になる構文を用意する。 foreach_parallel (var star1 , star2 in stars) { star1.m_vx = star1.m_vx*star1.m_m/(star1.m_m+Star2.m_m) + Star2.m_vx*Star2.m_m/(star1.m_m+Star2.m_m); star1.m_vy = star1.m_vy*star1.m_m/(star1.m_m+Star2.m_m) + Star2.m_vy*Star2.m_m/(star1.m_m+Star2.m_m); } このとき、左辺は、shadow(m_vx_new , m_vy_new ) に対してアクセスしていて、実際はforeachを抜けてから foreach(var star in stars) { star.m_vx = star1.m_vx_new; star.m_vy = star1.m_vx_new; } これが実行される。この仕組みをタスクシステム側に提供してもらう。これなら簡単に並列化できる。 ゲームで使うコリジョン判定などはたいていこのように並列化できる。
- 557 名前:名前は開発中のものです。 mailto:sage [2009/03/04(水) 09:31:11 ID:m+X+Qg7j]
- >>555
> 名前がタスクシステムなだけで、前スレ 510 とも >>2 ともまったく違う設計・実装について > 語ってるということで FA? 並列化とタスクシステムとは直交する概念だから、例えば>>2のタスクシステムを並列化することも出来るし 前スレ510のタスクシステムを並列化することも出来る。 どちらかと言えば、前スレ510のほうが>>2よりはある型のオブジェクト集合のうち任意の2体に対する 振る舞いが書けるのでその部分が並列化する価値が高いだけのこと。 そもそも、タスクに対して列挙したり、任意の型の2体を取り出したりする仕組みがどこにもない状態で 並列化なんて出来ないだろう。 俺がタスクシステムと呼んでいるのは、最低限、タスクシステムと名がつくなら、タスクに対する基底 クラスが存在して、それくらいの機能はあるんじゃねーの?と思うからだ。
- 558 名前:名前は開発中のものです。 mailto:sage [2009/03/04(水) 09:32:48 ID:m+X+Qg7j]
- >>554
>> そんなものあえて作る意味があるか?boost::weak_ptrで済むだろ。 >スクリプトと連携するときに楽 ふむ、それならok。
- 559 名前:510 mailto:sage [2009/03/04(水) 11:11:12 ID:5viq5cgM]
- >>556
shadowのアイデアもーらい。 transaction( hoge )//shadow初期化 { task2_parallel( hoge, hoge ) { _hoge1.x += hoge2.x;//例えば、変数の頭にアンダーバーがついていたらshadowとか。 //rollback;//ロールバックも出来るよ } task_parallel_end; } commit;//shadowコミット あと、何か頭が統合ヘッダ?の人が来てたみたいだけど、 アップロードしたプログラムのヘッダファイルがごった煮だったのは 単にサンプルプログラムだったからだ。
- 560 名前:510 mailto:sage [2009/03/04(水) 11:23:44 ID:5viq5cgM]
- shadowは書き込みさきより参照元の方が良いな。
- 561 名前:名前は開発中のものです。 mailto:sage [2009/03/04(水) 11:43:23 ID:4u8TV8ZG]
- >>557
>俺がタスクシステムと呼んでいるのは、最低限、タスクシステムと名がつくなら、タスクに対する基底 >クラスが存在して、それくらいの機能はあるんじゃねーの?と思うからだ。 あー、やはりな。以下の内容は煽り抜きだから気を悪くしないでくれ 結局これはローカル用語の解釈を巡る相違でしかない 例えばウチの社内ではあんたの解釈を振りかざしても 意思疎通はうまくいかないだろう ここでは色んな名無しが俺定義・俺解釈のローカル用語を 公衆の場に持ち出して一人相撲してる。あんたもそう タスクシステムは権威不在の定義不明瞭なローカル用語だ ということをまず再確認し、意思疎通を円滑にするために それぞれがより確かな一般的な計算機用語に換言する努力を すべきだ。でなければ、この実に不毛なすれ違いは無くならない
- 562 名前:510 mailto:sage [2009/03/04(水) 11:50:03 ID:5viq5cgM]
- 俺はソースコードアップしてその上で、これが俺のタスクシステムだって言ってるんだから良いんだよな。
皆各々ソースコードアップすればよいと思うよ。
- 563 名前:名前は開発中のものです。 mailto:sage [2009/03/04(水) 12:38:40 ID:4u8TV8ZG]
- >>562
君のコードにはもっと相応しい個性的でカッコイイ名前を付けてあげなさい 手垢で汚れたタスクシステムなんて臭い名前では>>2と勘違いされてしまう 君のコードは泣いているぞ。不敏でならない エターナル自動並列ブリザードデータベースでもなんでもいい 革新的であることを世の馬鹿共に知らしめる努力をすべきだ
- 564 名前:並列さん ◆dPfetnROQg mailto:sage [2009/03/04(水) 15:46:36 ID:m+X+Qg7j]
- >>559
なかなかいいね。 俺、そろそろコテハンにしとくわ。 ちなみに前スレ510に対して、C++としては素人の書き方だと指摘したのは俺な。 原則煽り専門だから、よろしく。
- 565 名前:名前は開発中のものです。 [2009/03/04(水) 18:27:15 ID:NGMxgsfO]
- で?
ごった煮でどうやってヒット判定の並列化をするって? 値を後で更新すると折角優先順位をつけても古い値でヒット判定をすることになるからおすすめできない 並列化を狙うならオクツリーにして位置で切らないと多分無理
- 566 名前:名前は開発中のものです。 mailto:sage [2009/03/04(水) 18:45:20 ID:4u8TV8ZG]
- 演算器いっぱいのベクトルプロセッサにやらせる場合
移動フェーズと衝突検出フェーズと衝突応答フェーズに 分割してそれぞれのフェーズでいっせーのーせでやる 物理エンジンなんかもそう もちろん空間領域分割もする
- 567 名前:名前は開発中のものです。 [2009/03/04(水) 18:51:51 ID:NGMxgsfO]
- 駄目
衝突は即座に補正かけないとそれだけでバグる 移動して衝突判定をすぐにしないと壁の向こうの敵と接触することになるぞ しかし壁の当たりの優先順位はおそらく最後だろ? でないと抜けるしね しかしそうすると壁の向こうの敵と接触する この辺をタスク縛りにするのは正直うまくない やるならなにはなくともオクツリー
- 568 名前:名前は開発中のものです。 mailto:sage [2009/03/04(水) 19:02:10 ID:sCGilUsr]
- なんで衝突判定中に衝突以外の判定を入れるの?馬鹿なの?
- 569 名前:名前は開発中のものです。 mailto:sage [2009/03/04(水) 19:02:19 ID:TXLFx8i5]
- それでバグらないようにする手法も研究されてるだろうね
考えるならなにはなくともまずはサーベイ
- 570 名前:名前は開発中のものです。 mailto:sage [2009/03/04(水) 19:04:26 ID:F+dIxfjw]
- 並列化とタスクと絡めて話してるのは極一部で
しかもタスクを使えば並列化できると主張してる人はいない。 今の話は並列化に対応したタスクがもし作れるとするなら どんなものになるかという感じ。並列化に関する部分は一般論をしてる。 つか並列化はそろそろ別スレ立てた方がいいんじゃね。 並列化が目的でタスクは手段に過ぎないんでしょ。
- 571 名前:名前は開発中のものです。 mailto:sage [2009/03/04(水) 19:08:59 ID:4u8TV8ZG]
- >>567
上のは(Id Software系のエンジンでいうところの)エンティティ対エンティティ のみに絞った話。相互作用。 壁抜けや床抜けに対するケア、これはブラシとの衝突(相互ではなく一方的作用)は 当然これは即座に補正される
- 572 名前:名前は開発中のものです。 mailto:sage [2009/03/04(水) 19:18:42 ID:4u8TV8ZG]
- >>571
即座に、ではなく、衝突検出フェーズにおいて、ブラシとの作用が先に反映される だな
- 573 名前:並列さん ◆dPfetnROQg mailto:sage [2009/03/04(水) 19:25:13 ID:m+X+Qg7j]
- >>567
> 衝突は即座に補正かけないとそれだけでバグる 俺物理エンジン書いたことあるが、そんなこたぁない。 どうせお前のプログラム、移動させて同時に衝突判定してぶつかってたら逆方向に移動とか 阿呆なことやってんだろ。本当、このスレは底辺プログラマ集まってんのな。
- 574 名前:名前は開発中のものです。 mailto:sage [2009/03/04(水) 19:26:40 ID:4u8TV8ZG]
- >>572
ついでに、高速移動体に対するケアの話もここでは割愛している あと、俺は強烈なアンチだ
- 575 名前:並列さん ◆dPfetnROQg mailto:sage [2009/03/04(水) 19:30:44 ID:m+X+Qg7j]
- ああ、ID:4u8TV8ZGは底辺プログラマではないな。俺的に除外しとく。
しかし、ID:NGMxgsfOは、底辺以下だな。俺的には、ゴミ扱い。 タスクシステムを使うと総合ヘッダが必要になるとか言ってる基地外と一緒。 ああ、ID:NGMxgsfOがその基地外なのか?
- 576 名前:並列さん ◆dPfetnROQg mailto:sage [2009/03/04(水) 19:33:21 ID:m+X+Qg7j]
- >>574
あんたは、強烈なアンチなのか。それは意外だ。 俺はじゃあ、強烈なタスク信者ってことでヨロシク! まあ、あんたとは仲良くできそうだけどな。
- 577 名前:名前は開発中のものです。 mailto:sage [2009/03/04(水) 19:44:25 ID:4u8TV8ZG]
- >>576
俺とあんたとの間に争点があるとすれば、それはタスクシステムという呼称だろうな 俺はあのローカル用語から発せられる腐敗臭が大嫌いなんだ
- 578 名前:名前は開発中のものです。 mailto:sage [2009/03/04(水) 19:50:16 ID:sCGilUsr]
- タスク(自分の信じる、おそらく誰とも同じものを指していない)信者
と 強烈なアンチ(なにに対してなのか自分でも解っていない) か。
- 579 名前:並列さん ◆dPfetnROQg mailto:sage [2009/03/04(水) 20:28:42 ID:m+X+Qg7j]
- >>577
ああ、それは同感。 まあ、俺のなかでは、タスクシステムは少なくともstd::listよりは少しはマシなことが 出来るように工夫してあんだろ、みたいな思い込みはある。 std::list以下のものなら、タスクシステムなんて大層な名前つけなくても黙って std::list使っときゃいいわけで。
- 580 名前:名前は開発中のものです。 mailto:sage [2009/03/04(水) 23:21:38 ID:m+yO0HqN]
- >>549
結局パフォーマンス向上しないだろコレ
- 581 名前:名前は開発中のものです。 [2009/03/04(水) 23:55:44 ID:NGMxgsfO]
- 全くしない(笑)
何を並列化したのかさっぱりわからん あたりでやるとしたら全く関わることのない範囲を同時に・・・ ぐらいしかないけどな こんなパラ単位で並列化なんて意味ねーよ
- 582 名前:名前は開発中のものです。 mailto:sage [2009/03/05(木) 00:22:53 ID:eF6P+SnV]
- >>580
foreach の部分を OpenMP とかで並列処理できれば、まぁ多少は。 しかし、そもそも並列化するならゲームロジックが絡むところより、モーション計算 とかエフェクト(特にパーティクル)だろう。ゲームロジックは依存関係がキツいし、 仕様変更が頻繁に起こりうるからリスク大きすぎる。 もっとも PS2 のときから、技術力があるところは VU1 に持っていってたけどな。
- 583 名前:名前は開発中のものです。 mailto:sage [2009/03/05(木) 01:46:15 ID:EYYtQjTl]
- ああくそ!
ID:NIkO1+LI祭に乗り遅れた! 書き込み規制が憎い
- 584 名前:並列さん ◆dPfetnROQg mailto:sage [2009/03/05(木) 07:31:17 ID:2NL1rK1f]
- >>580
するよ。 >>581 阿呆すぎて泣ける。どこの阿呆かと思ったら、 「衝突は即座に補正かけないとそれだけでバグる」とか言ってた阿呆か。 全然話にならんわ。 まともな物理エンジンのソース見たことないんだろうな。
- 585 名前:名前は開発中のものです。 [2009/03/05(木) 07:49:58 ID:DNYGW2s8]
- でも実際動いたら補正かけないと壁の向こうの敵に当たる
間に壁がないかみて判定しなきゃならんときもある この辺をタスク縛りにされるのは正直やりにくいにも程がある ゲームやオブジェクトによってすり抜けがどうでもいいものもあるだけに一般化はできない リングアウトだけ起こらないでは済まない場合は結構多い べつに速度がとんでもない場合じゃなくても問題は起こる
- 586 名前:並列さん ◆dPfetnROQg mailto:sage [2009/03/05(木) 08:24:43 ID:2NL1rK1f]
- >>585
あんたは、ID:NGMxgsfOか? それとも、ID:NGMxgsfO級の阿呆が何人もいるのか? いい加減、コテハンにしてくれ。 まともな幾何的なconstraint solverを書いたことすらない奴が物理エンジンを語るなよ。
- 587 名前:名前は開発中のものです。 mailto:sage [2009/03/05(木) 09:31:58 ID:eF6P+SnV]
- >>586
ここで物理エンジン語るのも、どうかと思うが。
- 588 名前:名前は開発中のものです。 mailto:sage [2009/03/05(木) 09:41:46 ID:NLOFzCy8]
- >>586
何故 >>585 の問題が起こらないのか教えて欲しい
|

|