ゲームにおけるデータ構造・クラス設計・パターン
レス数が950を超えています。1000を超えると書き込みができなくなります。
0001名前は開発中のものです。
2006/08/10(木) 20:27:06ID:BnvyxuCBどのようにクラス設計をすればよいか、
継承・委譲関係はどのようにすればよいか、
使えそうなパターンは何かなど語るのもよし。
自作ゲームの内容とクラス図を書いて
改善案を聞くもよし。
設計に関して困ったことを質問するもよし。
関数の具体的な実装内容やゲーム内容に関しては他スレに譲る。
大いに語れ。
0873名前は開発中のものです。
2008/03/24(月) 00:59:42ID:tkEWMZpBその辺は柔軟に、ってことね
0874862
2008/03/24(月) 01:09:59ID:KE3DiPkZえーと…
ごめん。なんか混乱してきた。
自分が何か読み違えているのかもしれないけど
>>864が>>861の翻訳であるとあったので
>>864に書いてあることを
「モンスター の 派生で スライム みたいな(哺乳類 の 派生で 犬 みたいな)
クラスの構成は間違っている。
外部データを読み込む際に便利なるような継承の仕方が実はあるよん。」
―と解釈したんだけど誤解している?
で、>>870を読むと「継承なんて使わずにデータを弄ることで挙動を変えるんだ」
と解釈したんだけど、それだと>>864の主張と矛盾するのでアレ??と思った。
どっちを勘違いしているんだろう俺は。
0875名前は開発中のものです。
2008/03/24(月) 01:23:08ID:tkEWMZpB0876名前は開発中のものです。
2008/03/24(月) 01:33:58ID:KE3DiPkZ読み違えてはいないけど矛盾もしていない?
余計にわからなくなって混乱してきたので一晩寝て考えてみる。
色々有難う。
0877名前は開発中のものです。
2008/03/24(月) 01:41:01ID:tkEWMZpB>864氏の主張を僕なりに解釈
●前半
敵データを記述するにしても、
テキストファイル(CSV)の場合もあれば、バイナリデータの場合もある。
ゲームによっては、ネット越しにデータベースへアクセスするかもしれない。
そういう部分を汎用的に書くのに継承は有効。
●後半
スライムとスライムベスとホイミスライムとドラゴンとオオアリクイと彷徨う鎧とで
いちいちクラス作ってたら一生終わんなくね?
0878名前は開発中のものです。
2008/03/24(月) 08:29:41ID:lmwW1pW4自分自身の意見としては>>877の通りなんだが、
種類ごとにクラスを作るような継承の使い方が全く見当がつかなかったので質問させてもらった。
本気で全種類分クラスを作るのか、
それともスライムとスライムベスはスライムクラスにまとめてしまうのか、
その場合出現テーブルなど外から参照するときはどうするんだ(クラス名?)とか、興味が尽きない。
実際どうやるんだ?
>>872のはどちらかというと戦闘時イベント(HP半減で台詞とか死亡エフェクトとか)など特殊処理を意識したものだと思うので
>>869の話を聞いてみたい。
0879名前は開発中のものです。
2008/03/24(月) 12:03:07ID:nPahSoi8と869ではないが予想
0880名前は開発中のものです。
2008/03/24(月) 14:53:51ID:GL5PdgnZクラス分けして幾つもの「科」を作り、何十もの「目」を作った
そして何百もの「種」を作ろうとしたとき、僕は秀丸のマクロで
大量のクラス(hpp、cpp)を作っていた
何かを間違えていることに気付き始めたのはその時だった
あれは14歳の夏休みでした
0881名前は開発中のものです。
2008/03/24(月) 14:58:03ID:kALgXEvY0882名前は開発中のものです。
2008/03/24(月) 15:00:11ID:GL5PdgnZ本気で作ったよ。リビルドにかかる時間の長さに興奮した
0883名前は開発中のものです。
2008/03/24(月) 15:00:26ID:T1jBR36AIronPythonでスライムクラスとか全部継承で作ったら面白いかも
0884名前は開発中のものです。
2008/03/24(月) 15:09:53ID:ajtWFMqv0885名前は開発中のものです。
2008/03/24(月) 16:18:36ID:gcKvtXCR>class EnemyBase : public IEnemy {};
まだこんな命名規則使うやつ居たのか
0886名前は開発中のものです。
2008/03/24(月) 16:25:13ID:kALgXEvYおまいは 変数hoge や Func()関数にまで突っ込むのか
0887名前は開発中のものです。
2008/03/24(月) 18:49:57ID:lmwW1pW4ひさしぶりに勇者を見た。
>>883
行動パターンとかをスクリプトにして外出しにするわけか。
でも動的に作成するのはなんだかコストが高そうな気がする。
0888872
2008/03/24(月) 21:24:32ID:KE3DiPkZ昨日のあらすじ
>>864継承使うよ(外部データ読み込むのにね)
>>870継承使わないよ(外部データで弄えばいいじゃん)
>>874(俺)矛盾しているやん!どっちやねん!?
>>875矛盾してるように思えないんだが
>>876(俺)え?!!
↑は置いといて取り敢えず1番の疑問の解消から…
>>864
>継承って、外部ファイル読み込みを外部データベース読み込みに変えるとき楽になるとか
ごめん。この継承の使い方、どんな使い方なのかまるで想像できない。
どんなの?
0889名前は開発中のものです。
2008/03/24(月) 22:09:39ID:kALgXEvY0890872
2008/03/24(月) 22:16:59ID:KE3DiPkZ0891名前は開発中のものです。
2008/03/24(月) 22:45:28ID:kALgXEvY0892872
2008/03/24(月) 22:48:16ID:KE3DiPkZもうちょっと考えてみるわ。
0893名前は開発中のものです。
2008/03/24(月) 22:56:35ID:kALgXEvY>>864継承使うよ(外部データ読み込むのにね)
>>870継承使わないよ(外部データで弄えばいいじゃん)
この時点で間違えてる。
0894872
2008/03/24(月) 23:01:16ID:KE3DiPkZうん。たぶん自分が曲解しているんだろうと
そう思って>>874を書いたんだけど
>>875で矛盾していないっていわれたもんで
>>876 え、別に読み違えていないの?に到って
>>877読めば>>888にはならんだろと言われて余計に????
0895名前は開発中のものです。
2008/03/24(月) 23:23:01ID:kALgXEvY>894の疑問に関してだけ言うとだ。
>874と>888とでは、お前さんの言ってる内容が異なる……と、自分は感じた。
>874の文章を読んだ限りでは、ちゃんと理解しているように見える。
>888は間違って理解しているように見える。
>864は
・データの読み込み方法(外部ファイルとかデータベースとか)については、派生クラスを作るべき
・データだけが違うオブジェクトについて、いちいちクラス分割するのはどうなんよ? 正しいの?(疑問系)
の2点について述べている。
具体的には>877を参照してほしい。
>870は
データが違うだけのオブジェクトについて、クラスを分けるのは最適ではないのでは?と述べている。
データの読み込み方法については何も述べていない。
よって、両者は矛盾していない。
0896872
2008/03/24(月) 23:54:26ID:KE3DiPkZおけ。落ち着いたw
やっと謎が解けた。
俺が単純に 「継承使う」←→「継承使わない」で相反していることをいっているように
感じて何故かそこに噛み付いて「矛盾している!」叫んでいただけで
ずっと
「外部データの読み込みの為には派生クラスを作るけど、
データの違いで吸収できるようなことにまで派生クラス作ってどうすんの?」
って主張してるだけで別に矛盾なんてしてねーじゃん
―と。
うん。それなら問題ない。確かに自分は読み違えてはいなかった。
変な方向にこだわって混乱させてスマン。
元々>>860でいうように継承使わない派だからクラスをうじゃうじゃ派生しない方が
良いのはわかるし。
残る疑問は「外部データを読み込みを楽にするために派生クラス」ってやつ。
これ、さっぱり実現方法がわからない。
0897名前は開発中のものです。
2008/03/25(火) 00:54:06ID:MCdo/Bj3インターフェースさえ揃えておけば
差し替えが楽になるってだけの話でしょ。
virtual void Img::Load(DestPtr* dst, FilePtr* src);
を継承したクラス郡
void Jpg::Load(DestPtr* dst, FilePtr* src);
void Png::Load(DestPtr* dst, FilePtr* src);
void Gif::Load(DestPtr* dst, FilePtr* src);
を作って差し替えるのが楽ってだけの。
0898872
2008/03/25(火) 01:22:10ID:kctvHJ5z有難う。
説明するまでもないほど常識的なやり方なのね。
勉強不足ですまん。勉強になった。
ファイル形式が違うのを読み込むときに記述が楽出来るのね。
0899名前は開発中のものです。
2008/03/25(火) 01:41:22ID:8j9nw6j10900名前は開発中のものです。
2008/03/25(火) 02:09:10ID:+wFlCySYお前は本当に872か?w
0901872
2008/03/25(火) 02:11:16ID:kctvHJ5zそもそも>>860でRPGを例に出したのが間違いだった。
敵の名前を皆が知ってるゲームでぱっと思いついたので安直に選んだ。
今思えばスーパーマリオの方が例としては良かった。
継承アレルギーの自分ならENEMYクラスひとつだけにして
全部データの違いで吸収するかなと。
ゲーム制作中にメットっていうファイヤーボールの効かない亀を思いついたとしても
ノコノコからの特化キャラとして派生させたりせずに
メンバ変数fireArmorを追加してメット以外のキャラを0に設定するかな。
0903名前は開発中のものです。
2008/03/25(火) 03:09:13ID:GnFPDA7Uという理由で継承の木にあてはめてしまうのはダメだよ
ていうかそんなのならやらない方がいいswitch文でよろしい
インターフェイスやスーパークラスを使う側に何が必要かということ
隠蔽のニーズのほうを第一に考えるべき
0904名前は開発中のものです。
2008/03/25(火) 06:25:37ID:lx9o+WS20906名前は開発中のものです。
2008/03/25(火) 14:06:40ID:OGAdbkNY0907名前は開発中のものです。
2008/03/25(火) 21:21:33ID:AbKMyTJI継承は多態が必要なときにしか使わないな。
0908名前は開発中のものです。
2008/03/25(火) 22:47:32ID:qKRP+2ua委譲の形に書き直す際に、書き直す前の委譲元オブジェクトの継承関係を
委譲先オブジェクトがそのまま引き継いでしまうようなソースを書いても
何の疑問も持たない奴が意外と多いから注意な。
どの部分を委譲すればよいか、粒度は適切かどうかを見極めたうえで
コーディングすべき。
0909名前は開発中のものです。
2008/03/25(火) 23:18:21ID:k9P0z5/O0910名前は開発中のものです。
2008/03/26(水) 00:49:14ID:WLaSa3Gs当り前だと認識する(定石・パターンを共有する)のが
設計・パターンの学習の第一歩なわけだから、
>>909は最も必要な思考ではあるが
最もレスしてはいけない文章でもあるな。
0911名前は開発中のものです。
2008/03/26(水) 05:21:20ID:AnrQAT7Uということだよ
そういうローカルな問題を解決するのに使ってしまうと
もっと大局的な構造を記述するために使われている継承との一貫性がなくなる
名前のつけ方からして一貫した目線であるべきなんだよ
ゲームを作ってる俺達はApplicationやSystemやEngineって呼べる一番高い位置から
見ているのだから敵キャラをEnemyと呼ぶのはおかしいよ
こんなのたまたまプレイヤーに敵対的なAIが乗ってるだけのゲームオブジェクト
に過ぎないんだから
データの入出力の種類どうこうはそんなの多分インスタンスが生成される必要も
ないんだろうからswitch文かなにかで書けば充分
「現実世界ではこれは〜の一種類とされています」なんてのを継承で
示してみせたところで後で見たとき何の役にも立たないわけだよ
0912名前は開発中のものです。
2008/03/26(水) 08:27:56ID:WLaSa3GsEnemyクラスを作ろうが、一ゲームオブジェクトの処理内容をベタ書きしようが、
どちらもApplicationが敵を直接意識して操作しているという悪例に他ならず
そういった意味で両者の違いなんてほとんどないに等しいから
「現実世界のものどおりに継承関係構築するのは無意味だ」という主張の
引き合いとして「名前の付け方からして〜」以下の文章を出すのは
あまりにも不適当で意味不明。
0913名前は開発中のものです。
2008/04/08(火) 17:58:37ID:o8llBZSA「1回目にここへ来たときはこっちのシナリオ、2回目以降はこっち」
「○○のアイテムを持ってるときに○○を調べるとこっちのシナリオ」
「○○への好感度が80以上のときに話しかけるとこっちのシナリオ」
様々な切り分け方があると思うのですが、そういう条件式とルートを
統括的に扱えるような設計というかやり方ってあるのでしょうか。
今やってるのはもうごちゃごちゃで、テストが不安で仕方ありません…
0914名前は開発中のものです。
2008/04/08(火) 22:19:28ID:XhbGzrYyいろいろなタイプがあると思うけど、それぞれのシーン内の分岐は
基本的にはif分の羅列になると思うんだ
あとこういう枯れたジャンルなら既にある優秀なツール、例えば
RPGならRPGツクールを、ADVなら吉里吉里とかNスクを
それぞれ参考にするといいんでねの
サンプル見たりチュートリアルに沿って使ってみたりすれば
イベントの基本構造とかが何となく見えてくるぞ
0915名前は開発中のものです。
2008/04/09(水) 10:51:18ID:2MmRi2Sh基本的には if 文の羅列だけど、たとえば RPG なら
・基本となるスクリプト
を用意しておいて、その上で条件が成立したときだけ
オーバーライドする内容を列挙した
・派生スクリプト
を上にかぶせるような作りにしておくと、多少は管理が楽になる。
0916名前は開発中のものです。
2008/04/12(土) 15:28:03ID:yutaDgBeちょっと考えたけど難しいわ。降参。
とりあえず綺麗にソースを書いといて。
シナリオそれぞれに分かりやすい名前付けといたがよさそうね。
300件以上とかあるだろうから、どうやって名前付けるんだろう・・・
0917名前は開発中のものです。
2008/04/12(土) 21:03:35ID:JhGNA0fRif文の羅列で凄まじいネストになってしまったりして見難くなるんだろうなぁ。
まぁそういう制御の部分を、コードではなくスクリプトでなるべく見易くするってのはいいよね。
これらの方法は、全ての状態をグローバルなフラグなどで管理することになるのだろうから
セーブやロードとかの処理は、結構簡単で良さそうだね。
915のいうような感じで、条件や処理を一つのオブジェクトに見立てて
それらを動的に拡張していくような構造なら、いままでのフラグ的なものを
上手いこと隠蔽化してくれそうに思うので、一歩進んでいると感じるなぁ。
ただこれは、とあるポイントに複数の拡張が生じる場合を考えると、
優先順位が必要になると思うので、そこは考慮しないといけないね。
場合によっては一つの拡張の優先順位が複数存在することもありそうだし、
拡張の呼び出し元を拡張要求ってなものにして、それに優先順位と実拡張への参照を持たせるといいのかな。
あと現在の拡張状態をセーブするのがちょっと面倒なのかなって思う。
0918名前は開発中のものです。
2008/04/12(土) 21:12:31ID:mZOjOCQT0919名前は開発中のものです。
2008/04/12(土) 21:40:58ID:mVEHbkLg> 優先順位が必要になると思うので、そこは考慮しないといけないね。
実際には、ほとんど必要ない。そこまでやると、シナリオ担当がついてこられなく
なるから。
0920名前は開発中のものです。
2008/04/12(土) 22:32:44ID:arZb3bS0ステートマシンって一般的な単語なのかな
波動やってないとたぶん分からないきもするが
でもそんなににきがつくならこんなアホな質問はせんか
スクリプトだろうがコードだろうがっどっちも同じプログラムであって根本の話ではないし
0921名前は開発中のものです。
2008/04/12(土) 23:04:47ID:mVEHbkLg> ステートマシンって一般的な単語なのかな
プログラマには常識だと思うな。
学生さんでも、大学で情報系専攻してれば必修だし。
0922名前は開発中のものです。
2008/04/12(土) 23:11:40ID:JhGNA0fRさっき書いた動的拡張をスクリプトにするとして俺ならこんな感じ。
object 村人
abstract action 会話
object 村人A extends 村人
action 会話
message("おいらは村人A!")
action 魔王を倒した
object 喜ぶ村人
action 会話
message("あんたのお陰で村は平和だぜ!")
dynamic extend 喜ぶ村人 on derived(村人)
action なんか知らんが魔王が復活した
cancel dynamic extend 喜ぶ村人 on derived(村人)
>>920
ステートマシンて情報処理系の試験に出ないっけ?
波動(?)と何か関係あるの?
0923名前は開発中のものです。
2008/04/12(土) 23:31:33ID:f378qNQi0924名前は開発中のものです。
2008/04/12(土) 23:37:53ID:jbkv2Yti0925名前は開発中のものです。
2008/04/12(土) 23:45:24ID:arZb3bS0ハードだと普通に使う、というかこの考え方がないと組み込みのコードもかけないだろ
0926名前は開発中のものです。
2008/04/12(土) 23:48:56ID:8n/EoXt3誰でも一度は考えるなw
とはいえ、”いかに綺麗な構造を実現するか”より、
”いかに大量のフラグを管理するか”を中心に据えてツール類を整備した方が
スクリプターも楽だし、メンテもし易く、バグも出づらく、高速なコードができあがるという罠。
0927名前は開発中のものです。
2008/04/13(日) 00:12:34ID:lFCr4Kneがあって、List<Event> に全イベントをステージ最初にぶち込む。
で、各フェーズ毎に全イベントに、発動可能かを問い合わせる。
発動可能なら、キャラの位置を調べて、イベントの位置と合致する
なら実際にイベントを発動。
これ、chain of responsibility
0928名前は開発中のものです。
2008/04/13(日) 00:29:46ID:IybI8btp描画担当をエンティティから切り離すのはいいとして
その描画担当がシーンツリーの奥深くまでLPD3DDEVICEをもっていって
最底辺でd->SetRenderStateとかやってるのは
最近マルチパスレンダリングとか外部ファイルになったシェーダー等を考えるに
適当でないと感じるようになってきた
何かいいデザインがあるでしょうか
0929名前は開発中のものです。
2008/04/13(日) 00:35:14ID:uiXughV8MTFrameworkやPSSG(はちょっと違うが)も似たような方式だし。
[シーンツリー] --(生成)--> [中間パケット配列] --(最適化)--> [最終中間パケット] --> [描画]
って流れで。
DirectX本体は、パケットの配列を読んで実行するのみで、シーンツリーには一切関与しない。
描画部を完全に切り離せる上、最適化部もシーンツリーのトラバースと分離できるメリットがある。
ただ、マテリアルやマルチレンダーターゲットの表現が難しい(的確なパケットを定義しないと冗長になってしまう)から、
パケットの設計が一番大変かと。
0930名前は開発中のものです。
2008/04/13(日) 00:44:07ID:GyzKnOlk確かにその通りだよね。
今目に見えているものだけで動作を予測できるか、
ってとこがポイントなのかな。
自分でも、さっきのスクリプトみたいなのをスクリプターが頑張って書いても、
いざ実行してみて( ゚д゚)ポカーンってなってるのが目に浮かぶし。
でもそれは、専用のスクリプトエディタ的なアプリを作って
今見えているスクリプトに関連する情報を注釈としてオーバーレイ表示して
直ぐに関連を理解させることさえ出来れば結構改善できる気がするんだよね。
プログラムでクラス指向が普及しているのも、IDEによる直感的な補佐の
影響が効いているからだと個人的には思ってるし。
でもまぁ、一般的に想定出来る量の分岐のゲームで
ここまでやることはきっと割に合わないのだろうなぁと思う。
ただ、最近はオブリビオン(やったことないけど)とかいう、
莫大なスクリプトが存在するらしいゲームも出てるらしいじゃん。
そういったゲームリソースの肥大化から考えると、
こういうの考えておいて損はしないと思うんだよね。
0931名前は開発中のものです。
2008/04/13(日) 00:57:00ID:lFCr4Kneこう書いたが良かった。List<Event*>
判定処理はConcreteEventクラス毎に違う
0932名前は開発中のものです。
2008/04/13(日) 02:22:04ID:ojGRG7jT0933名前は開発中のものです。
2008/04/13(日) 04:39:58ID:IybI8btpMTFrameworkとかよくわからんけどデバイスコンテキストを持ちたくないとか、
ステートマシンにかかわりをもちたくないとか
単純なそういうものの隠蔽を望んでるわけじゃないのです
たとえば各個がDraw()を実装するような構造だと、シーンに一回デプスバッファだけ描かせるようにする
とかいう改変をしなくちゃならない場合に全部にDrawDepth()みたいな名前で同じようなことを
しなくちゃならん実装をしないといけないのはちょっと変だと思うわけです。
具体的な描画の手続きが末端におしつけられてる構造がなんとかならないかなと思ってるのかも。
わかりません。
0934名前は開発中のものです。
2008/04/13(日) 05:37:30ID:GyzKnOlk自分でも分かってないのかよwww
まぁ俺は末端の描画処理に上層から介入したいのだと見たよ。
その前提で答えてみる。
現状ツリー上に階層化された描画物は、上層から
IDirect3DDevice*を引数としてリレーしたものを使って描画してるわけだよね。
んでこれらの描画物の描画処理に変化を加えたいということであれば、
上層で、IDirect3DDeviceを拡張したインスタンスを作りそれを下層へ放流すれば良い。
分かるかも知れんが詳細にやり方を書くと、IDirect3DDeviceって確かクラスだったよね?
であれば単純に継承して各メソッドで本物のインスタンスへの委譲メソッドを書く。
そしたら自分が拡張したいメソッド、この場合SetRenderStateか?を好きなように変更する。
そんな感じでどうよ。
もちっと考えると、そもそもIDirect3DDeviceなんかを末端から直接触らせずに
自作クラスでラップしたものを使わせるようにすると見易いし色々と便利かと思うな。
こういう考え方、きっとよく知られてる知識なんだと思うけど、俺はJavaやって初めて知ったよ。
0935名前は開発中のものです。
2008/04/13(日) 09:09:47ID:D4Mfl7O80936名前は開発中のものです。
2008/04/13(日) 10:23:53ID:lFCr4Kneなるほど意味分かった。
形状描画とマテリアル(描画嗜好)分離されてるから それでいいねえ
0937名前は開発中のものです。
2008/04/13(日) 11:40:53ID:GyzKnOlkインタフェースなんだから直接継承しても問題ないんじゃないの?
あれ、ごめん、C++だとIDirect3DDeviceのメソッド郡はvirtualじゃないのか?
となると単純に継承しても元の型でアクセスされると拡張されたメソッドが呼ばれないのか。
じゃああれだ、自前クラスにするだな。
0938名前は開発中のものです。
2008/04/13(日) 14:26:45ID:8OQWd29C0939名前は開発中のものです。
2008/04/13(日) 14:39:55ID:Z1kaHYoi0940名前は開発中のものです。
2008/04/13(日) 18:58:15ID:IybI8btpシーングラフの各最小単位に分散してしまうのを僕は懸念してるのだと思うのです。
優先度みたいな古臭いタスクの仕組みが採用さられてるようだけれど結局
「あれ?この直前の優先度は何番だtったっけ」とかいって探し回るマヌケな姿が目に浮かぶ
です。
MTFrameworkでぐぐってもimpressのアレしかでてこないのでこんな批判ですが
何か他に資料が公開されてるのでしょうか?
0941名前は開発中のものです。
2008/04/13(日) 20:37:38ID:/WeMxb9Qjk。
0942名前は開発中のものです。
2008/04/13(日) 20:59:07ID:Z1kaHYoi>優先度みたいな古臭いタスクの仕組み
意味わからん
ハードウェアに渡す描画コマンドに優先順位があるのは今も昔も同じだし
よって投げるパケットに優先順位があるのも別に古臭くもなんとも無い
つか必須
「タスクの仕組み」がナニを指すのか知らんが、タスクシステムスレで言うところの
タスクシステム(=ギャラクシアンの実装)の話をしてるのなら、あれは
エンティティ処理も描画処理も何もかも内包してる概念だから、ここでその話題を
持ってくるのは何か違う気がする
エンティティを線形リストに入れるだけなんて古臭い、シーングラフを使うのが現代的
などという話をしたいなら、それはここでは無関係の話題と思われ
0943名前は開発中のものです。
2008/04/13(日) 21:14:21ID:Z1kaHYoiないない。MTFrameworkだろうがその他のミドルウェアだろうがそれはない
各エンティティがグラフに入ってようが何であろうが自由だし
そのグラフ走査の順序でエンティティ更新処理が決定していようが
GPUに投げる情報の順序とは独立した、全く別の話
0944名前は開発中のものです。
2008/04/13(日) 21:47:18ID:IybI8btp>GPUに投げる情報の順序とは独立した、全く別の話
はい。MTFrameworkがいい、だめ、といったことを話したいんじゃなくて
MTFrameworkみたいなのの上の層の、中間描画パケットや描画の手続きを投げつける
構造のほう
のアイデアを伺いたいんです。
でもシーングラフ的構造を改めて設計でやりくりしようとせず
そこはそのままの形を留めたまま横断的事象を管理するために
一旦描画手続きをバッファにまとめる、というのもひとつの現実解なのかもしれないですね。
0945944
2008/04/15(火) 05:27:06ID:TYyaNvw/>ないない。MTFrameworkだろうがその他のミドルウェアだろうがそれはない
「手続き」というのは適当ではない表現だったとおもいます。
中間描画パケットはシーングラフの構成とは無関係に共通するシェーダをまとめあげる
役には立つと思うんだけど(そのためにつくられた仕組みなんでしょうし)
描画の主体は依然としてシーンのノードにあるのが普通だと思います。
全体としてみればシーングラフのツリーが描画をしていると言うことができるはず。
具体的にはシーンの最小単位がdrawとかいう名前のインターフェイスを持っていて
ここがパケットを発行するようになっているはず。
しかし一回のフレームを描画するのに全く異なる性質のものを複数回描画させられる
時代になった昨今、drawがここにあるのに違和感を感じる場面に遭遇することが多くなりました。
たとえばあるポストエフェクトのためにバックバッファとは別のバッファへデプスを描きだしていたとします
ユーザーの設定や場面によってそのエフェクトをばっさり無効にしたい場合
このバッファを描画する必要もなくなるわけです。ここでもしもシーンの各最小単位が
各々判断してバッファへの描き出しをやっていると大変なことに。シーンの最小単位が
描画の主体であるがゆえにこういった非効率が生じるわけです。
シーングラフとは別に描画の主体が存在するべきなのかもしれません。わかりませんが。
0946名前は開発中のものです。
2008/04/15(火) 08:22:02ID:wLZjKUHH0947名前は開発中のものです。
2008/04/15(火) 15:18:31ID:Pz8UivIt>描画の主体は依然としてシーンのノードにあるのが普通だと思います。
>全体としてみればシーングラフのツリーが描画をしていると言うことができるはず。
>具体的にはシーンの最小単位がdrawとかいう名前のインターフェイスを持っていて
>ここがパケットを発行するようになっているはず。
シーングラフのノードにdraw()があるのが「普通」だと言いたいのか?
普通というからには有名どころの3Dゲームエンジンの少なくとも過半が
そういう設計になってることを実際に確認したんだろうな?
脳内妄想で普通とか言ってるとか言うなよ?
0948名前は開発中のものです。
2008/04/15(火) 17:13:48ID:805Lw7LR>しかし一回のフレームを描画するのに全く異なる性質のものを複数回描画させられる
>時代になった昨今
昨今?
見た目(形状、材質)が異なる複数種のインスタンスを効率よく描画するとか
そういう要請は10年以上前からほとんど変わってないよ
ところで俺の作文を見てくれ
GPUのモンスターパワーに物を言わせ、パフォーマンスアナライザの類を一切用いずに
呑気なコードを組んでもグリグリ動くちょい派手エフェクトの3Dアクションゲーがリリースできる
時代になった昨今
どう思う?
0949名前は開発中のものです。
2008/04/15(火) 17:29:08ID:Pz8UivItって俺なのか?w
0950名前は開発中のものです。
2008/04/15(火) 17:45:14ID:805Lw7LR× >>947
○ >>945
>ここでもしもシーンの各最小単位が各々判断してバッファへの描き出しをやっていると
あれ、中間描画ナンチャラの話はどこへ行ったんだ
「各最小単位」がシーングラフの階層構造内の各ノードのことで
そのノードのdrawメソッドが「バッファへの描き出し」をやるのか?
それ中間描画ナンチャラも何もなく、drawメソッド内で
直接DrawPrimitiveとか呼び出してね?
0951名前は開発中のものです。
2008/04/16(水) 07:55:31ID:gjjFZ6S4シーングラフを使ったことの無い俺が頓珍漢なことを言うけど、
一概にシーングラフって言っても、グラフ構造以外の
動作の実装って、各エンジンによってバラバラなんじゃないの?
その辺をどういう風に実装してるのかを>>944が情報開示しなきゃ、
具体的なアドバイスって出来ないんじゃないの?
ググってみたけどこれに近いの?各個が描画処理を持ってる。
http://www.quatouch.com/products/hisui/doc/scenegraph.html
こんな風に直に描画メソッドを呼び出しているから、
描画の主体がシーンの最小単位って言ってるの?
であれば「各ノードの描画要求」を仲介する管理者を立てればいいよね。
これは末端まで伝播されるコンテキストをその管理者とすると都合が良さそう。
管理者にエフェクト描画フラグとノード描画(node)メソッドを作って、その内部実装は、
if (
(!nodeはエフェクト) ||
(nodeはエフェクト && エフェクト描画フラグ)
){
node.draw(this);
}
これで良いんじゃないのかな。
ただ、各ノードが描画メソッドを持ってしまっているとすると、
ゲームの実行状態と関係してくる複数の描画処理を、
一つのノードに内包させてしまっているのかなという気がするので、
その場合は、描画処理を一つずつノードへ分解しなければいけないと思うよ。
0952名前は開発中のものです。
2008/04/16(水) 08:14:41ID:gjjFZ6S4「エフェクトをばっさり無効にしたい」ってとこだけ意識してしまって、
それが要求だと勘違いしてしまった。
半透明系のエフェクトの描画処理を無効化したいものだと思って
書いてしまったので、変なところは読み飛ばして欲しい。
ほんとの要求は、「描画先バッファを上層で制御したい」ってことだよね。
まあこれも多分、先に書いた管理者のノード描画部分で制御出来るんじゃないのかな。
0953名前は開発中のものです。
2008/04/16(水) 21:55:02ID:oFemimm/>ググってみたけどこれに近いの?各個が描画処理を持ってる。
そんなかんじです。drawをもってるcompositeパターン
>>952
>ほんとの要求は、「描画先バッファを上層で制御したい」ってことだよね
制御できるかできないかという意味では
シーングラフがdrawを実装した今のままでも十分制御できます。
リファクタリングの動機は不可能を可能にとか、そういうところにはないと思います。
0954名前は開発中のものです。
2008/04/16(水) 23:08:47ID:R79eU4CuVisitor風の実装に変えてみたら?
シーングラフはモデルとマテリアル情報だけ持って、
Visitorがシーングラフをトラバースして必要があれば描画する
ポストエフェクトを切りたければ、ポストエフェクトのVisitorを無視すればいい、的な。
でも、どんなに描画とデータを分離したところで、実際にゲームを作ることになれば
ノード単位でのエフェクト制御(シャドウを落とすかどうか、とか)がどうしても必要になってきて、
末端に細かいフラグが蓄積してしまってあまり意味がないんだよね。
結局、描画エンジンに限っていえば、データと処理の分離は、
最大公約数的な情報を末端のノードに持たせることになって、逆に効率を落としちゃうし、
タイムクリティカルなゲームの最適化を阻害するのが実情。
先進的なエンジンほど、制約がきつい(拡張性が無い、固定機能ばかり)のが現実だから、
何かいい構造を思いついたら発表すれば、一儲けできるかもよ?
0955名前は開発中のものです。
2008/04/16(水) 23:24:47ID:6tcgJhqC君のシーングラフというのは
ノード(特にdrawインタフェース付きのやつ)同士の接続は何を表しているの
まぁ典型的なものなら座標系(例えば姿勢行列)の親子関係になるわけなんだけど
この場合、巡回目的は行列スタックを積み上げてながら仮想空間上の各ノードの
ワールド座標を得ることだったりするわけだが、その処理の中でdrawを呼び出すの?
0956名前は開発中のものです。
2008/04/17(木) 03:10:24ID:3m8+g+3b大枠のコンセプトとしてはVisitorということになるのかもしれません。
ただ、VisitorそのものはC++ではその真価を発揮できない、
Compositionツリーの方に新しい要素が頻繁に追加されることが予想される
等、その弱点がちょうど今回のケースにあてはまり、そのままでは適用しずらそうです。
さらに個人的な感想をかけば、型と場合に応じて関数がいくつもできあがるのは好みません。
それこそ中間描画パケットのようなローテクなアプローチが必要なのかもしれないです。
0957名前は開発中のものです。
2008/04/17(木) 07:36:26ID:FHbVDin2> ただ、VisitorそのものはC++ではその真価を発揮できない、
コードを書いてみてくれ。なんか勘違いしてるような気がするんで。
0958名前は開発中のものです。
2008/04/17(木) 10:20:54ID:CViJCy2oゲームに使う分には、ノードに種類フラグを持たせて、適切にアップキャストするのが常套手段だね。
Visitorは対応している種類のノードだけ処理する。
Visitorの関数の数の爆発にも、ノードの種類の増加にも簡単に対応できる。
ダブルディスパッチが目的ではないから、Visitorとはコンセプトが少し違うな。
イテレータに近いかも。
0959名前は開発中のものです。
2008/04/22(火) 22:42:37ID:Z5McnRHOつNVSG
Traverserあたりを調べればそういう基本的な悩みは解決すると思う。
0960名前は開発中のものです。
2008/04/23(水) 18:23:23ID:BqXPf/Oaとても参考になりました。
シーングラフはあくまでデータの一群であって
それぞれの目的をその名に冠したtraversalがそれを利用してそれぞれの目的を果たすと。
レンダリングもtraversalの一種に過ぎないと。そんな解釈みたいですね。
ただコレ、NodeHintsなるものとか、ShadowMappingがなぜか埋め込まれてるとか
ちょっと気味が悪い部分もありますね。
0961名前は開発中のものです。
2008/04/23(水) 19:09:53ID:U3C9KQJ3具体的に言ってごらん
0962名前は開発中のものです。
2008/04/23(水) 20:47:19ID:M28cm74p>>954 に
> ノード単位でのエフェクト制御(シャドウを落とすかどうか、とか)がどうしても必要になってきて、
> 末端に細かいフラグが蓄積してしまってあまり意味がないんだよね。
ってちゃんと書いてあるじゃねえか
NVSGはその典型例だよ
0963名前は開発中のものです。
2008/04/25(金) 00:41:21ID:vc7Q6jEY属性を処理すればいいだけ。C#のAttributeなんかが同じ要求から出てきたものじゃないかと思う。
プロパティグリッドの情報はオブジェクトにとって本質的じゃないけど、オブジェクト側に埋め込んでおきたい
みたいな。
0964名前は開発中のものです。
2008/04/25(金) 00:47:43ID:zJzd1rCbオブジェクトには付けられない
0965名前は開発中のものです。
2008/04/25(金) 01:13:35ID:vc7Q6jEYじゃまぁ、s/オブジェクト/クラス・メンバ/ということで。
0966名前は開発中のものです。
2008/05/05(月) 14:08:00ID:+Zvy5eoD0967名前は開発中のものです。
2008/05/11(日) 16:38:51ID:5xrxRK37ゲームを作ろうと思い、デザインパターンの勉強をしてるんですが
Singletonをどんな風に使うのか今一ピントきません。
Singletonじゃないと困る場合。
Singletonだと助かる場合。
出来たら例を示して貰えないでしょうか。
0968名前は開発中のものです。
2008/05/11(日) 16:57:46ID:XzXZ0r0X0969名前は開発中のものです。
2008/05/11(日) 17:02:04ID:tAMxfx7F0970名前は開発中のものです。
2008/05/11(日) 17:24:11ID:3Mda4QHxいい気になってる自称天才が一番伸びねえよ。
0971名前は開発中のものです。
2008/05/11(日) 17:28:01ID:iOBnIUaU少なくとも「糞だって他の人が言っていたから」
という理由だけで、一度も使ったことのないモノを非難する人よりはマシ。
0972名前は開発中のものです。
2008/05/11(日) 17:42:18ID:J2J0EAvRレス数が950を超えています。1000を超えると書き込みができなくなります。