タスクシステム総合スレ part4
■ このスレッドは過去ログ倉庫に格納されています
0001名前は開発中のものです。
2009/02/01(日) 12:38:10ID:rVEgp4cMpart3 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/
0668名前は開発中のものです。
2009/02/15(日) 11:36:30ID:kIY9LVp/で?>>510と>>641は大して変わらないソースになったけど
これがオブジェクトの種類が増えていくとどう変わる?って展望があるのかな?
そーゆーことが言いたいなら少なくともそういう色の出てるソースじゃないと意味ないよね?
つまり、この時点では>>510はなんの意味もない、そういうことだよね?
0669名前は開発中のものです。
2009/02/15(日) 11:37:31ID:kIY9LVp/>>>641 のソースだが、明らかに元のソースより読みにくい。
なんか言い出しちゃったよw
0670名前は開発中のものです。
2009/02/15(日) 11:39:29ID:OFTP7lcI明確なデメリットがあるからアンチとか
他にもっといい方法があるからアンチ
ってわけじゃなく
そもそも経験不足でメリット・デメリットや使いどころが想像つかないけど
他の人は理解してて悔しいからアンチ
って感じにしか見えん。
自分の好みに合わないなら使わなきゃいいだけなのにねぇ…
0671名前は開発中のものです。
2009/02/15(日) 11:40:50ID:pf6wVUPl> 「ドラクエ風ゲームエンジン」「横シューエンジン」「スト2風格ゲーエンジン」「アンリアル風エンジン」
> ここまで的を絞って3〜4本量産してようやくペイするってところじゃないか。
そう簡単な話じゃないんだ。
これは現場の俺から言わせてもらえれば、
エンジンを作ったり設計したりしてるのは賢い連中なのよ。
それぞれのゲームを作ってるのはもっと質の悪い、単価の安い、なんと言うか・・まあ、皆まで言わすな。
だから、プログラムのうち、難しい部分と簡単な部分とを切り分けて、難しい部分を賢い連中に
担当させるのは、理にかなってるんだよ。
0672名前は開発中のものです。
2009/02/15(日) 11:41:22ID:5MvrWTvY組み込みスクリプトには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いや、比較のためだろう。
俺は、>>641 はそういう意味ではいい仕事したと思うよ。
0675名前は開発中のものです。
2009/02/15(日) 12:01:12ID:hUQv8RGuなかなか深い観点だ。恐れ入った。
業界人じゃないから昔の話とか全然わからんけど、色々と工夫していたみたいね。
いまからゲームを作るのであれば、コルーチンで書く書かないはスクリプターのセンスに任せるとして、
データの外部化については正直必須だと思うんだ。
その辺をしっかり作っておけば、準汎用で使いまわしが便利な資産になる感じだと思ってる。(完全に汎用ではないけど)
HYPE化はしかないんじゃない?
タスクに代わる実装には選択肢が多々あるから、
1択に絞れる(1択に絞れる方法が存在する)のならそれに依存したいとおもうのは仕方ない。信仰宗教と代わらんね。
0676名前は開発中のものです。
2009/02/15(日) 12:19:02ID:D0niLPLq作るゲームの規模や種類によっても違ってくるだろうし、
万事での最善も最悪も無さそうだ。
実際にある程度の規模のゲーム作って
議論してるやつがどれだけいるか知らんがなあ。
0677名前は開発中のものです。
2009/02/15(日) 12:32:22ID:20MV6lUe1000行程度から5000行程度ならタスクシステム導入でもなんとかやりすごせる
30000行程度ならタスクシステムは糞。完全に開発ストップ。 >>641 的に書くとこから再出発。
100000行程度、、、組んだこと無い
>>641 よりタスクシステム導入した方が良いとかいうやつ、30000行以上のもの書いたことあるのか?
また話変わるぞ?
そんな小手先の技術じゃどうにもならなくなる時が来るはずなんだが
なぜそこまでたどり着かないのか不思議
0678名前は開発中のものです。
2009/02/15(日) 12:44:56ID:fgsPvXPGタスクシステム以前に設計が糞なだけだろ
0679名前は開発中のものです。
2009/02/15(日) 12:45:47ID:20MV6lUe>>620
0680名前は開発中のものです。
2009/02/15(日) 12:47:31ID:20MV6lUeタスクシステムは設計の範疇にいれないんだwww
設計じゃないならなんなんだよwww
0681名前は開発中のものです。
2009/02/15(日) 12:47:49ID:hnmq8yzx自分も同人で50Kオーバーの作品を作ったことあるけど、
総ステップと、タスクが使えるかどうかは、>>670と全く同じ考え。
タスクシステムは歪みがこの程度のサイズで出てくる。
行数で、手法を変えるというよりも、タスクでやるのが、無理になってくる。
0682名前は開発中のものです。
2009/02/15(日) 12:48:40ID:hnmq8yzx0683名前は開発中のものです。
2009/02/15(日) 13:03:59ID:pf6wVUPl3万行って、ソースで言えばたったの1MBぐらいだろ?
10万行規模のソースのあるプロジェクトに関わったことがないって、どこの弱小ゲームメーカーだよ。
ちょっとした規模の商用ゲームなら、ライブラリの一部だけでも3万行ぐらいあるだろうに。
タスクシステムに限らんが、使うに値するところには使えばいいんだ。
まあ、たいていのゲームは大規模になってくると、そのゲームに特化したエンジンにせざるを得ないので
汎用的で使い回しの利く部分は減っていくのは仕方ないが。
0684名前は開発中のものです。
2009/02/15(日) 13:08:21ID:hUQv8RGuタスクシステムは規模が大きくなるにつれ処理を追うことが困難になりやすい。
(そのためにタスク管理やタスク監視のデバッグメニューを実装する必要も出てくる)
そんな中>>641に戻すのも手だが、それなら初めから組み込みスクリプト使うかな。自分なら。
0685名前は開発中のものです。
2009/02/15(日) 13:39:19ID:h/ugUohbCGエフェクトのハードコーディングを避ける目的に使うくらいじゃねえの?
ある程度、個々のタスクの動作の選択肢が限られているからこそ、
>>2をより一層抽象化できるというか。
タスクシステムの動作原理を継承しているよな。
0686名前は開発中のものです。
2009/02/15(日) 13:48:09ID:OFTP7lcI決して見やすいソースでは無かったけど、不可能では無いわな。
ゲームのモード用メインループタスク階層。敵や味方のオブジェクト用タスク階層。
メニューシステムタスク階層とか、分割統治方式で使ってたが。
他にはswitch/caseの状態を階層化して管理してる某ステップ方式とかも見たことあるが
どれも規模が大きくなると悲惨なことには変わりなかったなぁ
ただ >>641 は何のシステムも無しに力技でベタに作ってく方法だから、そもそもタスクが使えんほど
大きなコードではまったく話にならんよ…
0687名前は開発中のものです。
2009/02/15(日) 13:59:12ID:hUQv8RGu例えば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参考になりました
0689名前は開発中のものです。
2009/02/15(日) 14:19:19ID:kIY9LVp/それは意図が全然違うじゃん
スクリプトは処理を企画に渡せるってだけでしょ?
書かなきゃいけない処理はまったく変わらない
スクリプトを話題に出してる時点で意味不明
0690名前は開発中のものです。
2009/02/15(日) 14:20:50ID:h/ugUohbスクリプトだと中間言語経由になるから、高速な相互影響処理には向いてないよね。
>WiiのFFCC
FC世代RPGの厚化粧版か。
>コード比はプログラム3割スクリプト7割
プリミティブな次元では従来のゲームからの変革はなし。
VFXだけ肥大といったところか。
タイトルの詳細をチェックしていないので、テキトーなこと言ってるけど
結局、タスクシステムは必要ってことだ。
0691名前は開発中のものです。
2009/02/15(日) 14:26:13ID:hUQv8RGu減ったりも増えたりもしない。
まずは、フレームワークとスクリプトを完全に分けます。
で、スクリプト言語の持っているコルーチンに頼って、
スクリプト実装者がゴリゴリ書く。
仕事も責任も分担できる。オススメです。
0692名前は開発中のものです。
2009/02/15(日) 14:26:58ID:FA9cfUTDムリになってくるってことだろ?
0693名前は開発中のものです。
2009/02/15(日) 14:27:13ID:kIY9LVp/じゃあ、この場所で出す話題として適切なの?どうなの?
それともその話題はタスクシステムのメリットデメリットに直結するものなの?
ちゃんと考えて発言してよ
0694名前は開発中のものです。
2009/02/15(日) 14:30:08ID:hUQv8RGuJITがあるよ。x86なら公開されてる。必要なら個人で実装すればいいけど、敷居は高いかな。
速度を稼ぐ必要があるのならCに戻すことも考慮されている。
Luaならここかな。http://luajit.org/
0695名前は開発中のものです。
2009/02/15(日) 14:34:20ID:hUQv8RGu俺の考えは、アンチタスク派で、
タスク派がコード量でプログラムが肥大化して可視性が悪いよというのであれば、スクリプト使え
ってこと。
ちゃんと考えて発言してないように見えるかい?
0696名前は開発中のものです。
2009/02/15(日) 14:43:31ID:FA9cfUTDjikiについての関数は当然別々に書くんだよな? 違うの?
0697名前は開発中のものです。
2009/02/15(日) 14:55:33ID:OFTP7lcI今後ゲーム開発はスクリプト使う方向に行くだろうし、
それ自体は賛成だけど
タスクシステムの上にスクリプトが乗っかるのか、スクリプトの上にタスクシステムを構築するのか、って感じで
スクリプト自体はタスクシステムの有無とはまた違う話だよね。
間接的にデータ駆動でコード中の複雑性が減ってタスクシステムでもコード見通しがよくなるね、という程度の話なのかな?
まぁネイティブコードの量は減るから見通しは良くなりそうだけど、スクリプトの分量が増えると
ネイティブコードと中間コードの二系統をメンテする手間で結局あまり変わらない気もする…
0698名前は開発中のものです。
2009/02/15(日) 15:03:18ID:kIY9LVp/処理よっては別になるかもわからんねぇ
敵のパーツを奪って武器・装甲を強化するタイプの自機と
経験値蓄積型のパワーアップをするタイプの自機ぐらいの違いがあると
もうプログラム自体共通部分を探すほうが難しいぐらいになるかもしれんし
まあ、仕様によるかな?
何が来てもいいように別にしておくのがいいな
もし、共通部分があったとしてもたかが数箇所(自機分)でしょ?
0699名前は開発中のものです。
2009/02/15(日) 15:03:19ID:hUQv8RGuスクリプトだけでタスクは乗らないです。
どっちも載せたりすると直感的に分かりづらくなる。
フレーム間をまたぐ処理の場合は、コルーチン(いわゆる協調スレッド、ファイバー、マイクロスレッド)を使います。
>まぁネイティブコードの量は減るから見通しは良くなりそうだけど、スクリプトの分量が増えると
>ネイティブコードと中間コードの二系統をメンテする手間で結局あまり変わらない気もする…
これは同意です。1人で実装するとなると2倍手間になりそうですが、そこは明確な作業分担でできるってことで。
スクリプトのメンテはスクリプトの動的ロードを実装すれば、プログラム実行中でも即座に反映されるようになるから便利ですぜ
0700名前は開発中のものです。
2009/02/15(日) 15:04:07ID:hnmq8yzx>>696
ごめん。よくわからない 多分自分の理解力不足だけれど
タスクでもそうでなくても、jikiを別々には書かないかと。
タスクにした場合と壮でない場合で、その点に違いが出るの?
0701名前は開発中のものです。
2009/02/15(日) 15:13:38ID:OFTP7lcI>フレーム間をまたぐ処理の場合は、コルーチン(いわゆる協調スレッド、ファイバー、マイクロスレッド)を使います。
オブジェクトの粒度をどの単位にするかにもよるけど
例えば敵の弾一個一個につき協調スレッド、ファイバー、マイクロスレッド、のどれかの生成、破壊を繰り返すの?
そりゃパフォーマンス的に厳しいんでないかなぁ…
協調スレッド、ファイバー、マイクロスレッドのどれも普通のスレッドに比べればかなり軽いけど
タスクシステムの関数コール同等の負荷とは比べ物にならないぐらい重いし。
まぁ、十年後のPC環境なら全然問題ないレベルの負荷かもしれんが。
0702名前は開発中のものです。
2009/02/15(日) 15:20:18ID:FA9cfUTDじゃ、自機が変更されると言う仕様を実装すると、それぞれの機体別jikiをswitch〜caseで
分岐して呼び分けるわけ?
>700
じゃ、jikiの内部で、機体によって処理をswitch〜caseで分岐するわけ?
0703名前は開発中のものです。
2009/02/15(日) 15:22:52ID:hUQv8RGuコルーチンはスクリプト言語が実装してくれてるから、スクリプト内で使うんです。
(LuaやSquirrelがスクリプトの実行順に関して、協調型のスレッドをスタック型で内部実装してくれている)
コルーチンの生成にはちょっとコストが掛かるので、一度作ったら再利用して呼び出すことで無駄をなくしますね。
パフォーマンス的に厳しいデメリットに関しては、ネイティブ側で対応します。
(例えばSquirrelはC++のクラスをオブジェクトとして持つことも出来ます)
0704名前は開発中のものです。
2009/02/15(日) 15:24:03ID:FA9cfUTDスクリプト上のコルーチンの中から呼んでるC/C++関数の中でyieldしたい場合は?
0705名前は開発中のものです。
2009/02/15(日) 15:26:41ID:20MV6lUe擁護派 :本来スクリプト言語を適用すべき箇所に絞ってタスクシステムの導入可否の話をしている
アンチ派:本来ネイティブ言語を適用すべき箇所に絞ってタスクシステムの導入可否の話をしている
どちらもスクリプト言語を適用すべき箇所まで >>641 で組むとは考えてないだろうし、
どちらもネイティブ言語を適用すべき箇所までスクリプト化すべきとは考えてないだろう。
多分論点はここかな
論点1:「ゲームエンジン部分=ネイティブ言語の相互作用記述+スクリプト言語解釈部」は意見一致してるよね?
論点2:「個々のスクリプト→個々のタスク」というのも性能UPが必要ならありでは?
アンチはネイティブ言語を全廃してスクリプト言語に置き換えるべきとは言ってないと思うし、
擁護派はネイティブ言語の相互作用記述を分解してタスクに置き換えるべきとは言ってないと思う。
0706名前は開発中のものです。
2009/02/15(日) 15:26:41ID:hnmq8yzxまだ理解し切れていないのだけれど、
普通に継承使っては駄目ですか?
0707名前は開発中のものです。
2009/02/15(日) 15:28:05ID:kIY9LVp/どう変更されるかによるなぁ・・・
例えば、自機Aが後方に下がるシーンと自機Bが変わりに前方に出てくるシーンなんか入る日には
もうインスタンス2ついるわけだし操作がユーザにあるって点以外はすべてが別処理じゃね?
ペカっと光ってチェーンジ!でよくてもやっぱり変更が怖いから完全に別にオブジェクトだな・・・俺なら
0708名前は開発中のものです。
2009/02/15(日) 15:29:29ID:OFTP7lcIスクリプト内で対応しているコルーチンならコンテキストスイッチとか無いからパフォーマンスは大丈夫かもね。
でもそうなるとスクリプト管理オブジェ同士の依存関係が有る場合、状態取得とかで同期処理が必要になるが…
0709名前は開発中のものです。
2009/02/15(日) 15:31:07ID:FA9cfUTDいや、別にそれでいいけど、このスレに約一名C++ワカランチンが常駐してるから、最底辺にあわせて
判りやすいレベルで話した方がいいかと思って。
じゃ、共通部分をtemplateにしてvariantsをfactoryから作るようにして対応するんだ。
常道だよね、やっぱり。
0710名前は開発中のものです。
2009/02/15(日) 15:32:53ID:pf6wVUPlはじめてのCでも猫でもわかるでも読んで出直してくるべきじゃね?
0711名前は開発中のものです。
2009/02/15(日) 15:33:04ID:hUQv8RGuこうやって実装できなくないけど、実装しない方が良いと思う
http://www.chiark.greenend.org.uk/~sgtatham/coroutines.html
速度が必要でC++で実装しつつ、関数を途中で止めて戻す場面ってのがあまり思いつかないし、
スクリプト側でcoroできれば十分かと。
なので、スクリプトからC/C++関数へはサブルーチンのみと縛るべきかな。
もし必要になればそのときに考えます。
0712名前は開発中のものです。
2009/02/15(日) 15:34:28ID:kIY9LVp/そんなことして共通部分が共通でなくなっちゃったら大変だぜ
俺は継承はやらないほうがいい派
メンバで持つ派
0713名前は開発中のものです。
2009/02/15(日) 15:37:12ID:FA9cfUTDそんなのは結局、どこまでをまとめて一つのクラスにするかの問題だから、瑣末なことだよ。
作ったものを修正せずに済むとか思ってるほうが間違いだ。たとえメンバにしたとしても、
それを分離修正する必要があれば同じこと。
0714名前は開発中のものです。
2009/02/15(日) 15:38:45ID:hnmq8yzxあ、すまん 継承って軽く書いてしまったけれど、
自分も>>712と同じく、コンポジションとかいうの派
0715名前は開発中のものです。
2009/02/15(日) 15:39:48ID:hUQv8RGuそこが一番のネックですね。
スレッドは協調型のみですので普通のスレッドのような並列処理に関しては、
同期処理が保障されていないです。
(基本はシングルスレッドのみで実装しているので試してみたことがない)
並列可能なスクリプト言語は今後の課題ですね
0716名前は開発中のものです。
2009/02/15(日) 15:39:54ID:hnmq8yzx上の修正が末代まで来るのがやだから、集約使うのではないの?
0717名前は開発中のものです。
2009/02/15(日) 15:42:33ID:FA9cfUTD修正の手間はさほど変わらないよ。とくに機能を分離する場合はね。
0718名前は開発中のものです。
2009/02/15(日) 15:50:25ID:OFTP7lcIあれ?
>フレーム間をまたぐ処理の場合は、コルーチン(いわゆる協調スレッド、ファイバー、マイクロスレッド)を使います。
ってことはフレームをまたぐオブジェクトが複数ある場合は必然的に
並列処理が必要になるんだよね?
>並列可能なスクリプト言語は今後の課題ですね
となってしまうとその方法(コルーチン)では使い物にならないんじゃない?
結局、スクリプト使ったゲームで一部データ駆動されてるものも
オブジェクト単位ではタスクシステムなりに乗っかってスクリプトのupdate部分がオブジェクト数分定期的に呼ばれる
という実装なんじゃないかな。
でないとマルチスレッドの複雑性の問題をスクリプトが抱え込むことになるような…
0719名前は開発中のものです。
2009/02/15(日) 15:54:46ID:FA9cfUTD内部の状態変更要求を外から通知された場合、どう処理するかが問題。
実行途中のcoroutineを強制的に終了したとしても大丈夫かどうか。
0720名前は開発中のものです。
2009/02/15(日) 15:55:33ID:T/3xZEUAマルチプロセッサでのネイティブスレッドとは違って並列処理にはならないので
同期制御の類は要らないはず
時分割された処理の継続をあからさまに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:FA9cfUTD0723名前は開発中のものです。
2009/02/15(日) 16:03:59ID:hUQv8RGu>>720で合ってます。
現在の組み込みスクリプト言語はシングルスレッド仕様で、
マルチスレッド化やマルチコアの恩恵は受諾できないと思います。
0724名前は開発中のものです。
2009/02/15(日) 16:08:49ID:OFTP7lcIそーなると結局
コルーチン同士のリソース同期処理はどうなったの?
これはスクリプトの仮想マシンがシングルスレッドかマルチスレッドか、というのとは
別の話なのだが。
0725名前は開発中のものです。
2009/02/15(日) 16:11:02ID:h/ugUohb詳しく
0726名前は開発中のものです。
2009/02/15(日) 16:19:47ID:hUQv8RGu同期処理はLuaやSquirrelの仕事ですね。こちらが意識する必要はないです。
そもそも走っているスクリプト解釈スレッドは1つだけです。
複数のコルーチンをつくり、中断/再開を行うことで擬似マルチスレッドっぽいことはできますが、あくまで擬似です……。
あくまでコルーチンはコードの見晴らしの為だけに使います。(使うのも使わないのもスクリプト実装者の裁量による)
0727名前は開発中のものです。
2009/02/15(日) 16:25:01ID:FA9cfUTD> 2.(1)の関数の切り替え
のあたりが違う。
>コルーチン(いわゆる協調スレッド、ファイバー、マイクロスレッド)
でFSM的なものを書くのは、関数ポインタなりswitch〜case使うなりするよりも面倒な時がままある。
特に外から状態が変更されるような場合は。
普通に、外から影響を受けないsequentialな処理を途中でyieldさせつつ、しかも並列に実行したい
場合には効果ある。
だから使う対象をよく観察すること。
0728名前は開発中のものです。
2009/02/15(日) 16:36:18ID:h/ugUohbつまり相互影響処理の無いタスクってことだろ。
関数の切り替えは、スクリプトで駆動されたタスク種類によって切り替えるという意味。
0729名前は開発中のものです。
2009/02/15(日) 16:44:48ID:FA9cfUTD関数ポインタは、FSM的な状態変数の代替という意味ではない、と言うこと?
0730名前は開発中のものです。
2009/02/15(日) 16:51:15ID:h/ugUohbさっきの例ではそう考えていた。
ところで、FSMっていうのは、例えば、
弱気→(攻撃を受ける)→好戦的→(さらに叩かれる)→発狂→・・・
みたいなタスクの状態メンバ変数の仕様がネットワーク化した場合に、
状態切り替え処理の複雑化を吸収するパターンだろ。
0731名前は開発中のものです。
2009/02/15(日) 16:59:21ID:T/3xZEUAコルーチンで楽になるのは、継続を実現するために
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:/3SpaYGWDSLで紹介されている言語はDSLに近いということ
DSLは理想言語、直感的に書ける言語、又はツール、簡単に手早く書ける言語
コストの問題でDSLに近いスクリプトがよく利用されているという
つまり、DSLについて考えるということは
出来る限り簡単に、出来る限り速く書くことを考えるということ
よくわからないけどそういうこと
0735名前は開発中のものです。
2009/02/15(日) 18:58:38ID:hUQv8RGuすまんが実装例が無い現状ではDSLは良く分からない。
しかし、ゲームプログラマが考える範疇ではないことは理解できた。
0736名前は開発中のものです。
2009/02/15(日) 19:03:00ID:TIpMetgy1.箱入り娘派。全部親が取り持つ。当人同士は直接接点を持たない。完全カプセル化。
2.お見合い派。仲介屋が縁を取り持つ。以降は当人同士の問題。半カプセル化。
3.恋愛結婚派。自分たちで勝手にやってよ。アンチカプセル化。
0737名前は開発中のものです。
2009/02/15(日) 19:14:30ID:FA9cfUTD0738名前は開発中のものです。
2009/02/15(日) 19:15:29ID:TIpMetgy//敵のアルゴリズム定義
//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文字列にしろPCMにしろmp3にしろjpgにしろ実行バイナリにしろ。
0741名前は開発中のものです。
2009/02/15(日) 19:36:15ID:hUQv8RGu説明してもらってすまんw
思ってたのとさらに違って、よりわけ分からんくなった
データ主導設計をさらに超えて、アルゴリズムやAIもデータ主導で記述しろってことかな?
全てDSLで渡したとして、どこかでDSLを解釈しなくてはならない箇所ができるから、そこのコストがゲームではネックになってるってこと?
0742名前は開発中のものです。
2009/02/15(日) 19:36:49ID:/3SpaYGWHSPで高い完成度を目指して作った方が速いし完成度も高いのが作れるDSL的に考えて
熟練した職人がのこぎりとプライドを捨てて、チェーンソーを使えば
ものすごい出力を得られるだろう
C++は実用的な言語ではなくて、亀仙人の甲羅だと思っている
脱ぎ捨てたときに初めてその真価を発揮する
0743名前は開発中のものです。
2009/02/15(日) 19:39:36ID:T/3xZEUA>>738はDSLと言っていいんじゃないのかな
正直DSLの適用範囲は非常に広いように思う
0744名前は開発中のものです。
2009/02/15(日) 19:41:04ID:kIY9LVp/DSLとかいう新ワード使ってスレを流そうと必死な奴がいるなw
0745名前は開発中のものです。
2009/02/15(日) 19:43:40ID:/3SpaYGW弾幕の軌道という問題を解決する手は数多にある
そのままコードを書く
マクロで書く
スクリプトで書く
ドローソフトで軌跡を描く
弾幕ツールを作って出力する
自動軌跡生成プログラムを作って出力する
考えられる限りの手段の中から、コストを考慮して、最適なものを選択する
難しいものをできるだけ簡単に書ければ
大量のリソースをできるだけ簡単に作ることができるなら
その問題領域をDSLとして書く意味が大きくなる
0746名前は開発中のものです。
2009/02/15(日) 19:43:44ID:pf6wVUPl> C++は実用的な言語ではなくて、亀仙人の甲羅だと思っている
> 脱ぎ捨てたときに初めてその真価を発揮する
ああ、それはマジでそれは実感するわ・・
俺、C++を10数年やってんだけど、たいていの他の言語がプーだな。
他の言語、ちょろ甘すぎる。
0747名前は開発中のものです。
2009/02/15(日) 19:44:51ID:TIpMetgyHSPではDSL用のコンパイラを書きにくい。
HSPでやり始めると、言語としてHSPしか使えない。
0748名前は開発中のものです。
2009/02/15(日) 19:50:53ID:zFAUOvvv> これでブラックホールとか自機とかさらに複数の要素が加わったら全部の要素を
> このwhile内にハードコードで追加して巨大化していくのかな?
ふつーに書く場合、まずゲーム全体を
1) ゲーム全体で利用する、比較的低レベル(システム寄り)の内容
例:非同期ファイル I/O 管理とか、デバイス管理など
2) 独立性が高く、ユーザから見た「実行中の内容」を反映する単位
例:タイトル、デバッグメニュー、ミニゲーム
「シーン」とか、ウチの社内だと「タスク」と呼ばれてる
3) シーンを構成する個々の要素
例:プレイヤー、体力ゲージ、エフェクト
と 3 レベルに分けて考える。
メインループは 1 の処理と、状態に応じてどれか特定のシーンの更新処理を
呼び出す。更新処理の結果、シーンの遷移が必要になるかもしれないので、
それはシーンから戻り値か何かで取れるようにしておく。
コードはこんな感じ。
0749名前は開発中のものです。
2009/02/15(日) 19:51:14ID:zFAUOvvv// 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:zFAUOvvvSceneDemo::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:hUQv8RGu0752名前は開発中のものです。
2009/02/15(日) 20:06:11ID:zFAUOvvv1) ぜんぜんベツモノなら別クラスにして、シーン側からもまったく別扱い
2) 外から見た振る舞いは同じ (public メンバ関数は同じ) だが中身がぜんぜん違うなら
純粋仮想関数を定義した共通の基底クラスを用意して、それを継承して作る。シーン側からは
基底クラスを介してしか見ない。
3) 中身もほとんど同じでパラメタぐらいの違いから、単一のクラス。パラメタ部分だけスクリプトか
設定ファイルに切り出す
0753名前は開発中のものです。
2009/02/15(日) 22:35:44ID:TIpMetgy当たり判定クラスは、その中の1)に入るのかな。
0754名前は開発中のものです。
2009/02/16(月) 01:42:35ID:x0hhLzknそれは>>643によれば外部DSLだよな
内部DSLを使うべきだと言っていた人とは別人か?
0755名前は開発中のものです。
2009/02/16(月) 03:43:39ID:Bs7zALYv0756名前は開発中のものです。
2009/02/16(月) 07:07:12ID:x0hhLzknそれだと怪しいマクロまみれの>>510も内部DSLだしw
おれイヤだよ21世紀にもなってそんなパラダイムw
DSLは資料読む限り現実路線に見えるんだけど、
アランケイ教の頃のOOPと同じでなんか信者がうさんくさいw
0757名前は開発中のものです。
2009/02/16(月) 07:27:13ID:lrLQRr8L0758名前は開発中のものです。
2009/02/16(月) 07:41:29ID:lrLQRr8L今は説明できなきゃただの詐欺師
新ワード出てきても論争なれてないやつは触るなよ
こういう無駄な勝負は何もにちゃんだけじゃねーぞ
会社でもそういう霞ヶ関風味の腐った人間ってのはたくさんいる
ちゃんとしたメルヘンブレイカーにまかせないと負けるぞ
ではこのスレの主旨をもう一度
で?タスクシステムのメリットって何?
0759名前は開発中のものです。
2009/02/16(月) 08:27:22ID:87EIjZ0N乙。
もう750超えたのか。誰かpart1-4をまとめてくれないかな。
また次スレで不毛なループが発生するのが面倒だ。
>>510や>>641、その他の住人が書いてくれたコードも残しておきたい。
俺はやらんが、誰かやってくれ。
0760名前は開発中のものです。
2009/02/16(月) 13:08:53ID:tnxjBeRs0761名前は開発中のものです。
2009/02/16(月) 15:23:56ID:u/rbw6HO処理を稼ぐって何だよ。実行バイナリの容量削減?処理速度の向上?
どっちにしろ現代のPCでは全くの無駄な努力どころかむしろ余計なお世話だけどな
0762名前は開発中のものです。
2009/02/16(月) 15:37:10ID:u/rbw6HOこういう固定観念に縛られたオールドタイプが若者をカルトへ誘う
0763名前は開発中のものです。
2009/02/16(月) 16:16:43ID:lbHYBkxT0764名前は開発中のものです。
2009/02/16(月) 17:05:06ID:87EIjZ0Nつーか、switch文でテーブルジャンプ利かせるほうが関数ポインタより速いと思うが。
0765名前は開発中のものです。
2009/02/16(月) 17:35:45ID:NF6DrOPp0766名前は開発中のものです。
2009/02/16(月) 18:15:54ID:lrLQRr8L十年は次スレが立たないぐらい
タスク信者ども、ボコボコにしてやろ
0767名前は開発中のものです。
2009/02/16(月) 18:18:43ID:GBQgPfdGQ.タスクシステムのメリットとデメリットを教えてください
A.ハハン、自分で考えろ
Q.タスクシステムの代わりがないだろ、文句言うなら代わりをよこせ
A.コルーチン、DSL、各種フレームワーク
Q.あーあー見えない聞こえなーい
タスクシステムとは、ジョブコンを無駄にいじって
何がなんだかよくわからなくなったものではないかという説
タスクシステムは3Dの描画についてはまったく使い物にならないようだ
全角英数使うなこのバカやろう
■ このスレッドは過去ログ倉庫に格納されています