トップページgamedev
1001コメント529KB

タスクシステム総合スレ part4

■ このスレッドは過去ログ倉庫に格納されています
0001名前は開発中のものです。2009/02/01(日) 12:38:10ID:rVEgp4cM
タスクシステムについての議論、相談、質問、雑談などのスレです

part3 http://pc11.2ch.net/test/read.cgi/gamedev/1226199100/
part2 http://pc11.2ch.net/test/read.cgi/gamedev/1196711513/
part1 http://pc11.2ch.net/test/read.cgi/gamedev/1173708588/
0654名前は開発中のものです。2009/02/15(日) 10:58:26ID:OFTP7lcI
>>653
>タスクシステムで書かなくてよくなる処理を○でもつけてみろw
タスクシステムは書かなきゃいけない処理を書かなくてもよくするためのものじゃないぞ。
そもそもそんなシステムは無いだろ。

関係するオブジェクトの増減やゲームの状態推移を統一した扱いにできて便利、ぐらいのもの。

自機、敵、弾だけで完結できるほどシンプルなサンプルレベルのなら使わなくてもいいんでない?
0655名前は開発中のものです。2009/02/15(日) 10:59:18ID:pf6wVUPl
>>649
抽象化するコストって、TaskSystem自体は再利用できるんだから、たくさんゲームを作るなら
ゼロに近づいていくんだが。

まさかあんたは一本だけゲームを作って一生を終えるつもりか?
0656名前は開発中のものです。2009/02/15(日) 11:08:15ID:kIY9LVp/
>>654
>タスクシステムは書かなきゃいけない処理を書かなくてもよくするためのものじゃないぞ。
>関係するオブジェクトの増減やゲームの状態推移を統一した扱いにできて便利、ぐらいのもの。
はぁ?じゃ、何がメリットなんだよw
さっさと言えよ
とりあえず>>510のサンプルなんてなんの役にも立たないってわかった?
目的もなく動いたって無駄なんだよ
ホント馬鹿だな
無駄、呼吸してること自体が無駄
>>510のサンプルに飛びついてたゴミはすべて無能

>自機、敵、弾だけで完結できるほどシンプルなサンプルレベルのなら使わなくてもいいんでない?
だから、そういうだろwお前等w
>>510のサンプルはなんの意味もねーって言ってるのに
わかんねぇかなぁw
0657名前は開発中のものです。2009/02/15(日) 11:14:35ID:hUQv8RGu
>自機、敵、弾ってあってそれぞれが関係するなら
>自機x敵、自機x弾、敵x弾の関連の処理は絶対に省略できないってw
処理が似たり寄ったりなら、そこはクラスの「抽象化」の一言で済むんじゃない?
タスクの範疇じゃないでしょ。タスクについて勘違いしてるよ〜
0658名前は開発中のものです。2009/02/15(日) 11:14:44ID:OFTP7lcI
>>656
>はぁ?じゃ、何がメリットなんだよw
>>642 でタスク使えばこーかける、ってのが出てるけど。
これじゃ理解できないかな?

まぁ、メリットデメリットが理解できないなら使わなければいいだけなんだが。
誰か君にタスク使うよう強要してるの?
0659名前は開発中のものです。2009/02/15(日) 11:16:56ID:kIY9LVp/
>>657-658
うーん?
何?言ってることさっぱりわからない
苦し紛れに意味わかんないこと言わないでよw
0660名前は開発中のものです。2009/02/15(日) 11:19:37ID:hUQv8RGu
何を言っているのか分からないのなら、デザインパターン/クラス設計についてもうちょっと勉強してくれ。
GoFのデザインパターンとか、その辺から見てみるといいよ。
あくまでタスクは状態遷移のためのもので、データの抽象化等とか根本的に違うっしょ。
0661名前は開発中のものです。2009/02/15(日) 11:20:48ID:kIY9LVp/
>>660
えーだって結局>>510のサンプルはなんの意味もなしてないわけでしょ?
あのソースにあれこれ言ってた人はどこ行ったの?
0662名前は開発中のものです。2009/02/15(日) 11:22:49ID:OFTP7lcI
>>661
タスクシステムの実装の一例として
>>641のサンプルよりは意味があるんでない?
0663名前は開発中のものです。2009/02/15(日) 11:24:37ID:kIY9LVp/
>>662
おいおい>>641>>510がなんの意味もなくね?っていうのを表現するために作ったんだぜ
んでそれは納得できた?YES?orNO?
0664名前は開発中のものです。2009/02/15(日) 11:29:11ID:hUQv8RGu
俺はまだ510のサンプルはぱらっとしてしか読んでないが、
従来のタスクよりは、可読性について大幅に改善していると思うよ。
今までのタスクは処理が飛びまくるから目で追うのが大変だったからね。
0665名前は開発中のものです。2009/02/15(日) 11:33:51ID:OFTP7lcI
>>663
>>510 タスクシステムを使ったサンプル(実装例として意味ある)
>>641 何も使ってないサンプル(実装例として意味無い)

だけの話でしょ…

というか、タスクシステムごとき単純な考え方を煽りじゃなく本当に理解できないとしたら
プログラマとしてどーかと思うぞ。
0666名前は開発中のものです。2009/02/15(日) 11:34:44ID:/3uMAyPp
まあ、抽象化された部分がコストに見合った働きをするならOK。
扱う問題が巨大になったとき、>>510版と>>641版でどれほどの差が出るかなんだが。
なんかあるの?

単にタスクシステムの分だけオーバーヘッドになってるように見えるんだけど。
>>510を使えば使うほど何らかのコストが浮くのかな?

一体何がラクになるのだ。
どんな問題を解決しているのだ。

もともと制御部っていうのは本質的に複雑だから再利用は難しい。
汎用的にすればするほど中身がなくなっていく部分。
「ドラクエ風ゲームエンジン」「横シューエンジン」「スト2風格ゲーエンジン」「アンリアル風エンジン」
ここまで的を絞って3〜4本量産してようやくペイするってところじゃないか。
マルチスレッドに注目したMTフレームワークなんかは、デバッグのしやすさや移植しやすさも売りにして抽象コストをキッチリ回収している。
実行環境/開発環境として、実行/開発において誰もがぶち当たるありふれた問題を一手に引き受けて解決している。
単にforループで済む部分を別のやり方でやって偉ぶっているわけではないので混同しないようにな。

>>510
これはHOW。結局タスクシステムはどの問題を解決しているのか。
ただのforループ以上の何があるんだ。ただのforループに勝ってるのか。
そうでないならforループを使うほうが遥かに良い。単純明快説明不要でコスト0だ。


>>620
「ここに処理を書けば自動で並列化できますよ」

まず、何がどう自動なんだか分からない。
実のところ、何も自動化されていない。
0667名前は開発中のものです。2009/02/15(日) 11:35:19ID:pf6wVUPl
>>661
お取り込み中のところ横からで済まないが
>>641 のソースだが、明らかに元のソースより読みにくい。

forがロジック部に出てきてるのだとか、null判定してcontinueしているのとか
Starの空きを探す部分だとか。

結局、
・もし事前に510のタスクシステムが存在していてこの開発コストが0だと見なせるなら、
641のコードのほうが工数が多いのは明らか。

・もし事前に510のタスクシステムが存在していてこの開発コストが0だと見なせるなら、
が成り立たないなら641の書き方でいいんじゃね?とは思うけどな。
0668名前は開発中のものです。2009/02/15(日) 11:36:30ID:kIY9LVp/
>>665
で?>>510>>641は大して変わらないソースになったけど
これがオブジェクトの種類が増えていくとどう変わる?って展望があるのかな?
そーゆーことが言いたいなら少なくともそういう色の出てるソースじゃないと意味ないよね?
つまり、この時点では>>510はなんの意味もない、そういうことだよね?
0669名前は開発中のものです。2009/02/15(日) 11:37:31ID:kIY9LVp/
>>667
>>>641 のソースだが、明らかに元のソースより読みにくい。
なんか言い出しちゃったよw
0670名前は開発中のものです。2009/02/15(日) 11:39:29ID:OFTP7lcI
結局、アンチって

明確なデメリットがあるからアンチとか
他にもっといい方法があるからアンチ

ってわけじゃなく
そもそも経験不足でメリット・デメリットや使いどころが想像つかないけど
他の人は理解してて悔しいからアンチ
って感じにしか見えん。

自分の好みに合わないなら使わなきゃいいだけなのにねぇ…
0671名前は開発中のものです。2009/02/15(日) 11:40:50ID:pf6wVUPl
>>666
> 「ドラクエ風ゲームエンジン」「横シューエンジン」「スト2風格ゲーエンジン」「アンリアル風エンジン」
> ここまで的を絞って3〜4本量産してようやくペイするってところじゃないか。

そう簡単な話じゃないんだ。

これは現場の俺から言わせてもらえれば、
エンジンを作ったり設計したりしてるのは賢い連中なのよ。

それぞれのゲームを作ってるのはもっと質の悪い、単価の安い、なんと言うか・・まあ、皆まで言わすな。

だから、プログラムのうち、難しい部分と簡単な部分とを切り分けて、難しい部分を賢い連中に
担当させるのは、理にかなってるんだよ。
0672名前は開発中のものです。2009/02/15(日) 11:41:22ID:5MvrWTvY
>>650
組み込みスクリプトには2種類のメリットがあると思う

1.フレームをまたいだ継続処理の記述が平易にできる
  コルーチンがもてはやされるけど、実はコルーチンでなくても
  コンテキストを保ったままフレームをまたげる実装であれば良い
  そういう意味では目新しいものではなく、今までも各社独自でこのようなスクリプト実装は行っていた

2.データをソースコードの外部に出すことができる
  Game Programing Gems1巻で最初に触れられるのがこれ(データ主導設計)
  今風に言うとXMLよりJSONだよね的な話だが、もちろんコレも新しいものではない

こうして見ると、結局コルーチンもデータ主導設計もDSLと同じで、
それと意識されることなく昔から使われていた手法だよね
考え方に名前を付けるのは必要なことだけど、普及しはじめるとHYPE化するのはどうしてなんだろう


みんな銀の弾丸が欲しくてHYPEに踊らされすぎなんじゃないか?
#もちろん"タスクシステム"もHYPEであり、タスク厨はそれに踊らされ、アンチはそれを嫌うクセに別のHYPEに群がるんだ
0673名前は開発中のものです。2009/02/15(日) 11:42:11ID:hUQv8RGu
非タスク版は車輪の再開発すぎるっしょ。
わざわざ>>510から戻した理由がわからん……。
0674名前は開発中のものです。2009/02/15(日) 11:43:39ID:pf6wVUPl
>>673
いや、比較のためだろう。
俺は、>>641 はそういう意味ではいい仕事したと思うよ。
0675名前は開発中のものです。2009/02/15(日) 12:01:12ID:hUQv8RGu
>>672
なかなか深い観点だ。恐れ入った。
業界人じゃないから昔の話とか全然わからんけど、色々と工夫していたみたいね。
いまからゲームを作るのであれば、コルーチンで書く書かないはスクリプターのセンスに任せるとして、
データの外部化については正直必須だと思うんだ。
その辺をしっかり作っておけば、準汎用で使いまわしが便利な資産になる感じだと思ってる。(完全に汎用ではないけど)

HYPE化はしかないんじゃない?
タスクに代わる実装には選択肢が多々あるから、
1択に絞れる(1択に絞れる方法が存在する)のならそれに依存したいとおもうのは仕方ない。信仰宗教と代わらんね。
0676名前は開発中のものです。2009/02/15(日) 12:19:02ID:D0niLPLq
結局、実際にいろいろ使ってみて自分でレビューするしかないな。
作るゲームの規模や種類によっても違ってくるだろうし、
万事での最善も最悪も無さそうだ。

実際にある程度の規模のゲーム作って
議論してるやつがどれだけいるか知らんがなあ。
0677名前は開発中のものです。2009/02/15(日) 12:32:22ID:20MV6lUe
1000行以下なら構造無しで気合でどうにかなる
1000行程度から5000行程度ならタスクシステム導入でもなんとかやりすごせる
30000行程度ならタスクシステムは糞。完全に開発ストップ。 >>641 的に書くとこから再出発。
100000行程度、、、組んだこと無い

>>641 よりタスクシステム導入した方が良いとかいうやつ、30000行以上のもの書いたことあるのか?
また話変わるぞ?
そんな小手先の技術じゃどうにもならなくなる時が来るはずなんだが
なぜそこまでたどり着かないのか不思議
0678名前は開発中のものです。2009/02/15(日) 12:44:56ID:fgsPvXPG
行数で手法を変えなくてはならないのは
タスクシステム以前に設計が糞なだけだろ
0679名前は開発中のものです。2009/02/15(日) 12:45:47ID:20MV6lUe
>>673
>>620
0680名前は開発中のものです。2009/02/15(日) 12:47:31ID:20MV6lUe
>>678
タスクシステムは設計の範疇にいれないんだwww
設計じゃないならなんなんだよwww
0681名前は開発中のものです。2009/02/15(日) 12:47:49ID:hnmq8yzx
昨日 >>510 面白い面白い って言ってた奴だけど、
自分も同人で50Kオーバーの作品を作ったことあるけど、
総ステップと、タスクが使えるかどうかは、>>670と全く同じ考え。
タスクシステムは歪みがこの程度のサイズで出てくる。
行数で、手法を変えるというよりも、タスクでやるのが、無理になってくる。
0682名前は開発中のものです。2009/02/15(日) 12:48:40ID:hnmq8yzx
>>670 でなくて >> 677 か
0683名前は開発中のものです。2009/02/15(日) 13:03:59ID:pf6wVUPl
>>677
3万行って、ソースで言えばたったの1MBぐらいだろ?
10万行規模のソースのあるプロジェクトに関わったことがないって、どこの弱小ゲームメーカーだよ。

ちょっとした規模の商用ゲームなら、ライブラリの一部だけでも3万行ぐらいあるだろうに。

タスクシステムに限らんが、使うに値するところには使えばいいんだ。

まあ、たいていのゲームは大規模になってくると、そのゲームに特化したエンジンにせざるを得ないので
汎用的で使い回しの利く部分は減っていくのは仕方ないが。
0684名前は開発中のものです。2009/02/15(日) 13:08:21ID:hUQv8RGu
規模が大きくなるとタスクで使えなくなるのは同意。
タスクシステムは規模が大きくなるにつれ処理を追うことが困難になりやすい。
(そのためにタスク管理やタスク監視のデバッグメニューを実装する必要も出てくる)
そんな中>>641に戻すのも手だが、それなら初めから組み込みスクリプト使うかな。自分なら。
0685名前は開発中のものです。2009/02/15(日) 13:39:19ID:h/ugUohb
複雑な組み込みスクリプトってさ、
CGエフェクトのハードコーディングを避ける目的に使うくらいじゃねえの?

ある程度、個々のタスクの動作の選択肢が限られているからこそ、
>>2をより一層抽象化できるというか。

タスクシステムの動作原理を継承しているよな。
0686名前は開発中のものです。2009/02/15(日) 13:48:09ID:OFTP7lcI
50万行規模の某シュミレーションで全てタスクで実装してるのを見たことあるが。
決して見やすいソースでは無かったけど、不可能では無いわな。

ゲームのモード用メインループタスク階層。敵や味方のオブジェクト用タスク階層。
メニューシステムタスク階層とか、分割統治方式で使ってたが。

他にはswitch/caseの状態を階層化して管理してる某ステップ方式とかも見たことあるが
どれも規模が大きくなると悲惨なことには変わりなかったなぁ

ただ >>641 は何のシステムも無しに力技でベタに作ってく方法だから、そもそもタスクが使えんほど
大きなコードではまったく話にならんよ…
0687名前は開発中のものです。2009/02/15(日) 13:59:12ID:hUQv8RGu
組み込みスクリプトは洋3Dメジャータイトルで積極的に採用されている。
例えばLuaの適用ゲームはこんな感じ。
http://en.wikipedia.org/wiki/Lua_(programming_language)#Applications

どの程度使ってるのかは、ゲーム内によって異なるので定かではないが、
CEDECでスクエニの中の人が発表していた内容では、
WiiのFFCCというゲームの開発ではSquirrelを使っていて、
コード比はプログラム3割スクリプト7割だってさ。
0688名前は開発中のものです。2009/02/15(日) 14:10:51ID:h/ugUohb
>>687
参考になりました
0689名前は開発中のものです。2009/02/15(日) 14:19:19ID:kIY9LVp/
>>684
それは意図が全然違うじゃん
スクリプトは処理を企画に渡せるってだけでしょ?
書かなきゃいけない処理はまったく変わらない
スクリプトを話題に出してる時点で意味不明
0690名前は開発中のものです。2009/02/15(日) 14:20:50ID:h/ugUohb
>>687
スクリプトだと中間言語経由になるから、高速な相互影響処理には向いてないよね。

>WiiのFFCC
FC世代RPGの厚化粧版か。

>コード比はプログラム3割スクリプト7割
プリミティブな次元では従来のゲームからの変革はなし。
VFXだけ肥大といったところか。
タイトルの詳細をチェックしていないので、テキトーなこと言ってるけど

結局、タスクシステムは必要ってことだ。
0691名前は開発中のものです。2009/02/15(日) 14:26:13ID:hUQv8RGu
もちろん書かなくちゃいけないコードは変わらないよ。
減ったりも増えたりもしない。
まずは、フレームワークとスクリプトを完全に分けます。
で、スクリプト言語の持っているコルーチンに頼って、
スクリプト実装者がゴリゴリ書く。
仕事も責任も分担できる。オススメです。
0692名前は開発中のものです。2009/02/15(日) 14:26:58ID:FA9cfUTD
その『○万行を超えたらタスクで管理するのがムリになってくる』っていうのは、結局FSMにするのが
ムリになってくるってことだろ?
0693名前は開発中のものです。2009/02/15(日) 14:27:13ID:kIY9LVp/
>>691
じゃあ、この場所で出す話題として適切なの?どうなの?
それともその話題はタスクシステムのメリットデメリットに直結するものなの?

ちゃんと考えて発言してよ
0694名前は開発中のものです。2009/02/15(日) 14:30:08ID:hUQv8RGu
>>690
JITがあるよ。x86なら公開されてる。必要なら個人で実装すればいいけど、敷居は高いかな。
速度を稼ぐ必要があるのならCに戻すことも考慮されている。
Luaならここかな。http://luajit.org/
0695名前は開発中のものです。2009/02/15(日) 14:34:20ID:hUQv8RGu
>>693
俺の考えは、アンチタスク派で、
タスク派がコード量でプログラムが肥大化して可視性が悪いよというのであれば、スクリプト使え
ってこと。
ちゃんと考えて発言してないように見えるかい?
0696名前は開発中のものです。2009/02/15(日) 14:43:31ID:FA9cfUTD
アンチタスク派に一つ聞きたいんだが、例えば自機選択式のSTGがあったとして、機体それぞれの
jikiについての関数は当然別々に書くんだよな? 違うの?
0697名前は開発中のものです。2009/02/15(日) 14:55:33ID:OFTP7lcI
>>695
今後ゲーム開発はスクリプト使う方向に行くだろうし、
それ自体は賛成だけど

タスクシステムの上にスクリプトが乗っかるのか、スクリプトの上にタスクシステムを構築するのか、って感じで
スクリプト自体はタスクシステムの有無とはまた違う話だよね。

間接的にデータ駆動でコード中の複雑性が減ってタスクシステムでもコード見通しがよくなるね、という程度の話なのかな?

まぁネイティブコードの量は減るから見通しは良くなりそうだけど、スクリプトの分量が増えると
ネイティブコードと中間コードの二系統をメンテする手間で結局あまり変わらない気もする…
0698名前は開発中のものです。2009/02/15(日) 15:03:18ID:kIY9LVp/
>>696
処理よっては別になるかもわからんねぇ
敵のパーツを奪って武器・装甲を強化するタイプの自機と
経験値蓄積型のパワーアップをするタイプの自機ぐらいの違いがあると
もうプログラム自体共通部分を探すほうが難しいぐらいになるかもしれんし
まあ、仕様によるかな?
何が来てもいいように別にしておくのがいいな
もし、共通部分があったとしてもたかが数箇所(自機分)でしょ?
0699名前は開発中のものです。2009/02/15(日) 15:03:19ID:hUQv8RGu
>>697
スクリプトだけでタスクは乗らないです。
どっちも載せたりすると直感的に分かりづらくなる。
フレーム間をまたぐ処理の場合は、コルーチン(いわゆる協調スレッド、ファイバー、マイクロスレッド)を使います。

>まぁネイティブコードの量は減るから見通しは良くなりそうだけど、スクリプトの分量が増えると
>ネイティブコードと中間コードの二系統をメンテする手間で結局あまり変わらない気もする…
これは同意です。1人で実装するとなると2倍手間になりそうですが、そこは明確な作業分担でできるってことで。
スクリプトのメンテはスクリプトの動的ロードを実装すれば、プログラム実行中でも即座に反映されるようになるから便利ですぜ
0700名前は開発中のものです。2009/02/15(日) 15:04:07ID:hnmq8yzx
アンチです。

>>696
ごめん。よくわからない 多分自分の理解力不足だけれど
タスクでもそうでなくても、jikiを別々には書かないかと。
タスクにした場合と壮でない場合で、その点に違いが出るの?
0701名前は開発中のものです。2009/02/15(日) 15:13:38ID:OFTP7lcI
>>699
>フレーム間をまたぐ処理の場合は、コルーチン(いわゆる協調スレッド、ファイバー、マイクロスレッド)を使います。
オブジェクトの粒度をどの単位にするかにもよるけど
例えば敵の弾一個一個につき協調スレッド、ファイバー、マイクロスレッド、のどれかの生成、破壊を繰り返すの?
そりゃパフォーマンス的に厳しいんでないかなぁ…
協調スレッド、ファイバー、マイクロスレッドのどれも普通のスレッドに比べればかなり軽いけど
タスクシステムの関数コール同等の負荷とは比べ物にならないぐらい重いし。

まぁ、十年後のPC環境なら全然問題ないレベルの負荷かもしれんが。
0702名前は開発中のものです。2009/02/15(日) 15:20:18ID:FA9cfUTD
>698
じゃ、自機が変更されると言う仕様を実装すると、それぞれの機体別jikiをswitch〜caseで
分岐して呼び分けるわけ?

>700
じゃ、jikiの内部で、機体によって処理をswitch〜caseで分岐するわけ?
0703名前は開発中のものです。2009/02/15(日) 15:22:52ID:hUQv8RGu
>>701
コルーチンはスクリプト言語が実装してくれてるから、スクリプト内で使うんです。
(LuaやSquirrelがスクリプトの実行順に関して、協調型のスレッドをスタック型で内部実装してくれている)
コルーチンの生成にはちょっとコストが掛かるので、一度作ったら再利用して呼び出すことで無駄をなくしますね。
パフォーマンス的に厳しいデメリットに関しては、ネイティブ側で対応します。
(例えばSquirrelはC++のクラスをオブジェクトとして持つことも出来ます)
0704名前は開発中のものです。2009/02/15(日) 15:24:03ID:FA9cfUTD
>703
スクリプト上のコルーチンの中から呼んでるC/C++関数の中でyieldしたい場合は?
0705名前は開発中のものです。2009/02/15(日) 15:26:41ID:20MV6lUe
話はすれ違ってるが設計は多分同じだ。

 擁護派 :本来スクリプト言語を適用すべき箇所に絞ってタスクシステムの導入可否の話をしている
 アンチ派:本来ネイティブ言語を適用すべき箇所に絞ってタスクシステムの導入可否の話をしている

どちらもスクリプト言語を適用すべき箇所まで >>641 で組むとは考えてないだろうし、
どちらもネイティブ言語を適用すべき箇所までスクリプト化すべきとは考えてないだろう。

多分論点はここかな
論点1:「ゲームエンジン部分=ネイティブ言語の相互作用記述+スクリプト言語解釈部」は意見一致してるよね?
論点2:「個々のスクリプト→個々のタスク」というのも性能UPが必要ならありでは?

アンチはネイティブ言語を全廃してスクリプト言語に置き換えるべきとは言ってないと思うし、
擁護派はネイティブ言語の相互作用記述を分解してタスクに置き換えるべきとは言ってないと思う。
0706名前は開発中のものです。2009/02/15(日) 15:26:41ID:hnmq8yzx
>>702
まだ理解し切れていないのだけれど、
普通に継承使っては駄目ですか?
0707名前は開発中のものです。2009/02/15(日) 15:28:05ID:kIY9LVp/
>>702
どう変更されるかによるなぁ・・・
例えば、自機Aが後方に下がるシーンと自機Bが変わりに前方に出てくるシーンなんか入る日には
もうインスタンス2ついるわけだし操作がユーザにあるって点以外はすべてが別処理じゃね?

ペカっと光ってチェーンジ!でよくてもやっぱり変更が怖いから完全に別にオブジェクトだな・・・俺なら
0708名前は開発中のものです。2009/02/15(日) 15:29:29ID:OFTP7lcI
>>703
スクリプト内で対応しているコルーチンならコンテキストスイッチとか無いからパフォーマンスは大丈夫かもね。
でもそうなるとスクリプト管理オブジェ同士の依存関係が有る場合、状態取得とかで同期処理が必要になるが…
0709名前は開発中のものです。2009/02/15(日) 15:31:07ID:FA9cfUTD
>706
いや、別にそれでいいけど、このスレに約一名C++ワカランチンが常駐してるから、最底辺にあわせて
判りやすいレベルで話した方がいいかと思って。

じゃ、共通部分をtemplateにしてvariantsをfactoryから作るようにして対応するんだ。
常道だよね、やっぱり。
0710名前は開発中のものです。2009/02/15(日) 15:32:53ID:pf6wVUPl
C++わからんとか、510のプログラム読めんとかは、ゲームなんか悠長に作ってる場合じゃねぇだろ。

はじめてのCでも猫でもわかるでも読んで出直してくるべきじゃね?
0711名前は開発中のものです。2009/02/15(日) 15:33:04ID:hUQv8RGu
>>704
こうやって実装できなくないけど、実装しない方が良いと思う
http://www.chiark.greenend.org.uk/~sgtatham/coroutines.html
速度が必要でC++で実装しつつ、関数を途中で止めて戻す場面ってのがあまり思いつかないし、
スクリプト側でcoroできれば十分かと。
なので、スクリプトからC/C++関数へはサブルーチンのみと縛るべきかな。
もし必要になればそのときに考えます。
0712名前は開発中のものです。2009/02/15(日) 15:34:28ID:kIY9LVp/
>>709
そんなことして共通部分が共通でなくなっちゃったら大変だぜ

俺は継承はやらないほうがいい派
メンバで持つ派
0713名前は開発中のものです。2009/02/15(日) 15:37:12ID:FA9cfUTD
>712
そんなのは結局、どこまでをまとめて一つのクラスにするかの問題だから、瑣末なことだよ。
作ったものを修正せずに済むとか思ってるほうが間違いだ。たとえメンバにしたとしても、
それを分離修正する必要があれば同じこと。
0714名前は開発中のものです。2009/02/15(日) 15:38:45ID:hnmq8yzx
>>709
あ、すまん 継承って軽く書いてしまったけれど、
自分も>>712と同じく、コンポジションとかいうの派
0715名前は開発中のものです。2009/02/15(日) 15:39:48ID:hUQv8RGu
>>708
そこが一番のネックですね。
スレッドは協調型のみですので普通のスレッドのような並列処理に関しては、
同期処理が保障されていないです。
(基本はシングルスレッドのみで実装しているので試してみたことがない)
並列可能なスクリプト言語は今後の課題ですね
0716名前は開発中のものです。2009/02/15(日) 15:39:54ID:hnmq8yzx
>>713
上の修正が末代まで来るのがやだから、集約使うのではないの?
0717名前は開発中のものです。2009/02/15(日) 15:42:33ID:FA9cfUTD
集約のメリットは、その部分を丸ごと交換できること。
修正の手間はさほど変わらないよ。とくに機能を分離する場合はね。
0718名前は開発中のものです。2009/02/15(日) 15:50:25ID:OFTP7lcI
>>715
あれ?
>フレーム間をまたぐ処理の場合は、コルーチン(いわゆる協調スレッド、ファイバー、マイクロスレッド)を使います。
ってことはフレームをまたぐオブジェクトが複数ある場合は必然的に
並列処理が必要になるんだよね?

>並列可能なスクリプト言語は今後の課題ですね
となってしまうとその方法(コルーチン)では使い物にならないんじゃない?

結局、スクリプト使ったゲームで一部データ駆動されてるものも
オブジェクト単位ではタスクシステムなりに乗っかってスクリプトのupdate部分がオブジェクト数分定期的に呼ばれる
という実装なんじゃないかな。

でないとマルチスレッドの複雑性の問題をスクリプトが抱え込むことになるような…
0719名前は開発中のものです。2009/02/15(日) 15:54:46ID:FA9cfUTD
実際の話、C/C++のcoroutine使うにしてもスクリプトのcoroutine使うにしても、それが中断してる最中に
内部の状態変更要求を外から通知された場合、どう処理するかが問題。

実行途中のcoroutineを強制的に終了したとしても大丈夫かどうか。
0720名前は開発中のものです。2009/02/15(日) 15:55:33ID:T/3xZEUA
>>715は現状ではシングルスレッド&コルーチンを使っているんじゃないの
マルチプロセッサでのネイティブスレッドとは違って並列処理にはならないので
同期制御の類は要らないはず
時分割された処理の継続をあからさまにFSMのような形で実装するのと
違って、自然に書けるのがコルーチンの利点で、プログラムカウンタや
スタックのリストアを処理系がやってくれる

>>715が「課題」と言っているのは、マルチコアでのパフォーマンスが求められる
ようになった場合にどうするか、という類の話では
0721名前は開発中のものです。2009/02/15(日) 16:00:34ID:h/ugUohb
遅レスだが、

>>699
>コルーチン(いわゆる協調スレッド、ファイバー、マイクロスレッド)
ってのは結局・・・

//万里ゆうじ氏が著書で紹介していたタスクシステムを参考
struct Task
{
//(1) データ更新・描画処理用関数ポインタ
void (*Update_n_Draw)(Task*);

//(2) データ記録用バッファ。場合によってはメンバ変数に分解して固定。
char WorkBuf[WOKK_BUF_SZ];

//以下省略
:     //タスク・チェーン結合用ポインタ
};

上のタスクシステムで言うところの、
1.Task構造体の生成・破棄
2.(1)の関数の切り替え
3.(2)のメンバ変数への分解
の処理パターンを、ある程度、限定・抽象化して、スクリプト駆動でルーチン化してるだけなんじゃね、実質?
コルーチンの生成・フレーム間維持・破棄のために、結局バックグラウンドで、タスクシステムが必要でしょ。
データのまとまりって言うのは、結局構造体だ。
0722名前は開発中のものです。2009/02/15(日) 16:03:52ID:FA9cfUTD
全然違うよw
0723名前は開発中のものです。2009/02/15(日) 16:03:59ID:hUQv8RGu
>>718
>>720で合ってます。
現在の組み込みスクリプト言語はシングルスレッド仕様で、
マルチスレッド化やマルチコアの恩恵は受諾できないと思います。
0724名前は開発中のものです。2009/02/15(日) 16:08:49ID:OFTP7lcI
>>723
そーなると結局
コルーチン同士のリソース同期処理はどうなったの?

これはスクリプトの仮想マシンがシングルスレッドかマルチスレッドか、というのとは
別の話なのだが。
0725名前は開発中のものです。2009/02/15(日) 16:11:02ID:h/ugUohb
>>722
詳しく
0726名前は開発中のものです。2009/02/15(日) 16:19:47ID:hUQv8RGu
コルーチン同士のリソース同期処理??
同期処理はLuaやSquirrelの仕事ですね。こちらが意識する必要はないです。
そもそも走っているスクリプト解釈スレッドは1つだけです。

複数のコルーチンをつくり、中断/再開を行うことで擬似マルチスレッドっぽいことはできますが、あくまで擬似です……。

あくまでコルーチンはコードの見晴らしの為だけに使います。(使うのも使わないのもスクリプト実装者の裁量による)
0727名前は開発中のものです。2009/02/15(日) 16:25:01ID:FA9cfUTD
>725
> 2.(1)の関数の切り替え
のあたりが違う。

>コルーチン(いわゆる協調スレッド、ファイバー、マイクロスレッド)
でFSM的なものを書くのは、関数ポインタなりswitch〜case使うなりするよりも面倒な時がままある。
特に外から状態が変更されるような場合は。

普通に、外から影響を受けないsequentialな処理を途中でyieldさせつつ、しかも並列に実行したい
場合には効果ある。

だから使う対象をよく観察すること。
0728名前は開発中のものです。2009/02/15(日) 16:36:18ID:h/ugUohb
>>727
つまり相互影響処理の無いタスクってことだろ。
関数の切り替えは、スクリプトで駆動されたタスク種類によって切り替えるという意味。
0729名前は開発中のものです。2009/02/15(日) 16:44:48ID:FA9cfUTD
>728
関数ポインタは、FSM的な状態変数の代替という意味ではない、と言うこと?
0730名前は開発中のものです。2009/02/15(日) 16:51:15ID:h/ugUohb
>>729
さっきの例ではそう考えていた。

ところで、FSMっていうのは、例えば、
弱気→(攻撃を受ける)→好戦的→(さらに叩かれる)→発狂→・・・
みたいなタスクの状態メンバ変数の仕様がネットワーク化した場合に、
状態切り替え処理の複雑化を吸収するパターンだろ。
0731名前は開発中のものです。2009/02/15(日) 16:59:21ID:T/3xZEUA
>>730みたいな本質的な状態遷移は素直に状態遷移として書くのがよいでしょう
コルーチンで楽になるのは、継続を実現するために
FSMを使わなければならないようなケースではないかと

Xをやって→nフレーム寝て→Yをやる
みたいなのを、ある関数(コルーチン)の中に
単に三つの文を繋げて記述できるか
FSMとして書かなければならないかの違いは大きい
0732名前は開発中のものです。2009/02/15(日) 17:30:58ID:kIY9LVp/
で?なんかタスクシステムと関係あるの?
0733名前は開発中のものです。2009/02/15(日) 17:42:03ID:hUQv8RGu
フレーム間をまたぐような連続した処理を書きたいときはコルーチンという手もあるよって事だよ
コルーチンを使うのは、タスクでもいいし、非タスクでも良い
それにより見通しの良いコードが書ける ってだけ

自分は以前はタスク派だったのが、スクリプトとコルーチンを扱うことで、
アンチタスク派になりました。
(タスクが絶対必要ってわけじゃなく、無くてもコードが書けるよね。
タスクシステムでも別にいいけどさ、正直読みづらくねぇ? という意見)
0734名前は開発中のものです。2009/02/15(日) 18:42:32ID:/3SpaYGW
DSLはスクリプトと同義じゃないよ
DSLで紹介されている言語はDSLに近いということ
DSLは理想言語、直感的に書ける言語、又はツール、簡単に手早く書ける言語
コストの問題でDSLに近いスクリプトがよく利用されているという
つまり、DSLについて考えるということは
出来る限り簡単に、出来る限り速く書くことを考えるということ
よくわからないけどそういうこと
0735名前は開発中のものです。2009/02/15(日) 18:58:38ID:hUQv8RGu
DSLは難しい。スクリプト≠DSLであり、スクリプト≒DSLなんだよね。
すまんが実装例が無い現状ではDSLは良く分からない。
しかし、ゲームプログラマが考える範疇ではないことは理解できた。
0736名前は開発中のものです。2009/02/15(日) 19:03:00ID:TIpMetgy
問題は結婚にも似てるよね。
1.箱入り娘派。全部親が取り持つ。当人同士は直接接点を持たない。完全カプセル化。
2.お見合い派。仲介屋が縁を取り持つ。以降は当人同士の問題。半カプセル化。
3.恋愛結婚派。自分たちで勝手にやってよ。アンチカプセル化。
0737名前は開発中のものです。2009/02/15(日) 19:14:30ID:FA9cfUTD
出来ちゃった婚派と不倫泥沼略奪婚派が無いな。
0738名前は開発中のものです。2009/02/15(日) 19:15:29ID:TIpMetgy
>>735
//敵のアルゴリズム定義
//aは動くで、bは止まる。
#define ZAKO_ALGORITHM_DSL "abaaababaaaabababaaab"
#define BOSS_ALGORITHM_DSL = "aaaaaaaaaabababaaaba";

〜〜〜

teki *zako = new teki(ZAKO_ALGORITHM_DSL);
teki *boss = new teki(BOSS_ALGORITHM_DSL);
0739名前は開発中のものです。2009/02/15(日) 19:17:28ID:kIY9LVp/
みるからにタスクシステム関係ないな
0740名前は開発中のものです。2009/02/15(日) 19:26:49ID:TIpMetgy
まぁ要するに所謂データは全部DSLってことだよ。
文字列にしろPCMにしろmp3にしろjpgにしろ実行バイナリにしろ。
0741名前は開発中のものです。2009/02/15(日) 19:36:15ID:hUQv8RGu
>>738
説明してもらってすまんw
思ってたのとさらに違って、よりわけ分からんくなった
データ主導設計をさらに超えて、アルゴリズムやAIもデータ主導で記述しろってことかな?
全てDSLで渡したとして、どこかでDSLを解釈しなくてはならない箇所ができるから、そこのコストがゲームではネックになってるってこと?
0742名前は開発中のものです。2009/02/15(日) 19:36:49ID:/3SpaYGW
あのごちゃごちゃしたC++のタスクシステムを作る能力があるんだったら
HSPで高い完成度を目指して作った方が速いし完成度も高いのが作れるDSL的に考えて
熟練した職人がのこぎりとプライドを捨てて、チェーンソーを使えば
ものすごい出力を得られるだろう
C++は実用的な言語ではなくて、亀仙人の甲羅だと思っている
脱ぎ捨てたときに初めてその真価を発揮する
0743名前は開発中のものです。2009/02/15(日) 19:39:36ID:T/3xZEUA
正規表現や埋め込みSQLも一種のDSLと捉えられるようだから
>>738はDSLと言っていいんじゃないのかな

正直DSLの適用範囲は非常に広いように思う
0744名前は開発中のものです。2009/02/15(日) 19:41:04ID:kIY9LVp/
タスク信者完全に論破されもんだから
DSLとかいう新ワード使ってスレを流そうと必死な奴がいるなw
0745名前は開発中のものです。2009/02/15(日) 19:43:40ID:/3SpaYGW
DSLは問題領域を限定して、その領域の問題を解決するために理想を追求する
弾幕の軌道という問題を解決する手は数多にある

そのままコードを書く
マクロで書く
スクリプトで書く
ドローソフトで軌跡を描く
弾幕ツールを作って出力する
自動軌跡生成プログラムを作って出力する

考えられる限りの手段の中から、コストを考慮して、最適なものを選択する
難しいものをできるだけ簡単に書ければ
大量のリソースをできるだけ簡単に作ることができるなら
その問題領域をDSLとして書く意味が大きくなる
0746名前は開発中のものです。2009/02/15(日) 19:43:44ID:pf6wVUPl
>>742
> C++は実用的な言語ではなくて、亀仙人の甲羅だと思っている
> 脱ぎ捨てたときに初めてその真価を発揮する

ああ、それはマジでそれは実感するわ・・

俺、C++を10数年やってんだけど、たいていの他の言語がプーだな。

他の言語、ちょろ甘すぎる。
0747名前は開発中のものです。2009/02/15(日) 19:44:51ID:TIpMetgy
>>742
HSPではDSL用のコンパイラを書きにくい。
HSPでやり始めると、言語としてHSPしか使えない。
0748名前は開発中のものです。2009/02/15(日) 19:50:53ID:zFAUOvvv
>>642
> これでブラックホールとか自機とかさらに複数の要素が加わったら全部の要素を
> このwhile内にハードコードで追加して巨大化していくのかな?
ふつーに書く場合、まずゲーム全体を

1) ゲーム全体で利用する、比較的低レベル(システム寄り)の内容
例:非同期ファイル I/O 管理とか、デバイス管理など

2) 独立性が高く、ユーザから見た「実行中の内容」を反映する単位
例:タイトル、デバッグメニュー、ミニゲーム
「シーン」とか、ウチの社内だと「タスク」と呼ばれてる

3) シーンを構成する個々の要素
例:プレイヤー、体力ゲージ、エフェクト

と 3 レベルに分けて考える。

メインループは 1 の処理と、状態に応じてどれか特定のシーンの更新処理を
呼び出す。更新処理の結果、シーンの遷移が必要になるかもしれないので、
それはシーンから戻り値か何かで取れるようにしておく。

コードはこんな感じ。
0749名前は開発中のものです。2009/02/15(日) 19:51:14ID:zFAUOvvv
void Game::MainLoop() {
 // 1) の処理実行
 AsyncFileIO::GetInstance().Update();
 Pad::GetInsstance().Update();
 // 状態に応じてシーン実行
 switch (scene_) {
 case SCENE_INIT:
  title_.reset(Title::Create());
  scene_ = SCENE_TITLE:
  break;
 case SCENE_TITLE:
  switch (title_.Update()) {
  case TITLE_DEMO_BEGIN:
    title_.reset();
    demo_.reset(Demo::Create());
  case TITLE_GAME_START:
    if (title->GetGameMode() == GAMEMODE_SINGLE_PLAYER) {
    }

  // 以下略

 }
0750名前は開発中のものです。2009/02/15(日) 20:00:55ID:zFAUOvvv
シーンは、シーンを構成する各要素のコンポジションになる。

SceneDemo::Update() {
 player_.Update(*this);
 for_each(enemies.begin(), enemies.end(), boost::bind(&Enemy::Update, ::_1, boost::ref(*this));
 // ヒット判定など
}

ヒット判定など、シーン更新時に必要になる処理は

1) シンプルならシーンの Update() 関数に直接書く (player_.Update() とかね)
2) ちょっと複雑になってきたら、Scene のプライベートメンバ関数に分割
3) もっと複雑なら、別クラスを用意して、そっちに処理を分ける

とする。3 の例としては、たとえば敵とプレイヤーのヒット判定を行う (総当りではなく
BSP とか使って) ような処理が考えられる。そうすると、SceneDemo はこんな感じ。

class SceneDemo {
 Player player_;
 std::list<Enemy*> enemies_;
 HitManager hitmgr_;

 void AddEnemy(const EnemyCreateInfo& info) {
   Enemy* enemy_ = Enemy::Create(info);
   enemies.push_back(enemy);
   hitmgr_.add(enemy);
 }
public:
 void Update();
};
0751名前は開発中のものです。2009/02/15(日) 20:05:32ID:hUQv8RGu
自分も>>748の書き方で必要十分だと思う。支持しますわ
0752名前は開発中のものです。2009/02/15(日) 20:06:11ID:zFAUOvvv
>>696
1) ぜんぜんベツモノなら別クラスにして、シーン側からもまったく別扱い

2) 外から見た振る舞いは同じ (public メンバ関数は同じ) だが中身がぜんぜん違うなら
純粋仮想関数を定義した共通の基底クラスを用意して、それを継承して作る。シーン側からは
基底クラスを介してしか見ない。

3) 中身もほとんど同じでパラメタぐらいの違いから、単一のクラス。パラメタ部分だけスクリプトか
設定ファイルに切り出す

0753名前は開発中のものです。2009/02/15(日) 22:35:44ID:TIpMetgy
>>748
当たり判定クラスは、その中の1)に入るのかな。
■ このスレッドは過去ログ倉庫に格納されています