PCで描画と内部処理の非同期処理ってどうやんの?
■ このスレッドは過去ログ倉庫に格納されています
0001(;´д⊂ヽ
02/04/29 16:14ID:Gsu.P7Dk実装したいんですが、具体的に、どういう風な構造にすればいいのか全然わかりません助けて
キー入力とかタイミングに厳しい処理を別スレッドで回すとして
描画担当スレッドはどーすればいいんでしょう?
(描画途中で別スレッドにより内部変数が書き換えられるケースが出てきますよね?)
0002名前は開発中のものです。
02/04/29 16:19ID:???0003名前は開発中のものです。
02/04/29 16:20ID:???0004名前は開発中のものです。
02/04/29 16:56ID:???0005名前は開発中のものです。
02/04/29 16:57ID:???0006名前は開発中のものです。
02/04/29 16:59ID:???お約束
3.簡単な質問やあいまいな(問題点の良く分からない)質問は汎用Q&Aスレッドへ
0007(;´д⊂ヽ
02/04/29 17:23ID:Gsu.P7Dk本でも扱ってないし
2Dゲーみたく、スプライトレジスタみたいのだとマスクとか多重化も
簡単なんだけど、3Dゲーでクラスだと色々面倒でねぇ
可変フレームレートつってもリフレッシュレートの関係で上限は120と
しても問題ないわけで、なんか上手く処理できんものんかと思ったわけです
ゲーム内ではよくある、1フレーム前の位置参照するような場合でも
前フレームが何ミリ秒前なのか可変だと困ると思うのです
仮に計算で逆算するにしても、ソウルキャリバーの剣の軌道なんかの
多段数の前フレーム参照は難しいかなと思うのです
そんな訳で僕の中では、上限120FPSで、処理落ちするときだけ描画を飛ばす
ような完全非同期ではない方法が正解だと思うのですが、ご意見聞きたいなぁと
0008名前は開発中のものです。
02/04/29 17:26ID:???それでいいんじゃない。
はい終了。
0009名前は開発中のものです。
02/04/29 17:30ID:???0010名前は開発中のものです。
02/04/29 17:45ID:???0011名前は開発中のものです。
02/04/29 17:58ID:???>>1=3=7=9
0012名前は開発中のものです。
02/04/29 17:59ID:???描画についていけないならデータ更新する、という>>7の方法でよい。
yaneSDKあたりにそれ関係の記事があったと思うので興味があればどうぞ。
それと、3Dゲームだと描画速度がFPS30位でも結構滑らかに見えてしまうので、
データ更新速度はFPS120ほど高くなくてもよいと思うよ。
質問内容がアレだったこともあるので、削除依頼は出しておいたほうが吉かと。
ログには残しておきたい内容だけれどねぇ。
0013名前は開発中のものです。
02/04/29 18:08ID:???だからといって1/60秒単位で変数を更新した場合、60FPSより早い描画だと、描画側が困っちゃうよね
ミサイルの先端はどんどん進むのに、後端(保存された数フレーム前情報)は1/60単位でしか更新されないと
煙の全長長くなっちゃうよね
(気付かないだろうけど、マシン毎になんか結果がことなるプログラムって気持ち悪い)
じゃぁミサイルの先端位置から後端の位置が計算できるか つーとそうでない場合もあるし
0014名前は開発中のものです。
02/04/29 18:19ID:???FPSが60頭打ちじゃ、手抜き!とか叩かれる。技術力もないみたいだし
キャラは同じ位置のままで再描画だけして、Over60FPS表示にしる!
どーせ人間の目では60fps以上区別つかないって言うしー
でも、中には区別できる人もいる罠
0015名前は開発中のものです。
02/04/29 18:38ID:qMxpqTZMこれはゲームにも当てはまるのか。
WindowのGUIをプライマリスレッドで管理し、
Direct3Dの描画をワーカースレッドで管理なんてOK?
軽く試してみたら、微妙に不具合が起きたのだけど。
0016名前は開発中のものです。
02/04/29 18:49ID:???実際に自分で簡単なサンプル作ってみればわかるが、
意外に誰でも区別できるぞ。
しかも、見るだけよりも操作するとはっきりわかる。
0017(;´д⊂ヽ
02/04/29 18:58ID:Gsu.P7Dk残影とか軌道が残るモノさえなければ、何にも考えなくていい気はするけど
0018名前は開発中のものです。
02/04/29 19:13ID:???0019名前は開発中のものです。
02/04/29 19:15ID:???期限切れはあぼ〜ん。
0020名前は開発中のものです。
02/04/29 19:22ID:???内部計算と入力処理と描画処理をうまいこと回すっていうのは面白いネタだと
思うがなー。OS側の制約がうざいけど。
>>15
SetCooperativeLevel に DDSCL_MULTITHREADED というフラグがある
0021名前は開発中のものです。
02/04/29 19:23ID:qMxpqTZMせっかく描画とそれ以外に処理を分けているんだから、
描画の具合が内部処理に影響を与える仕様にはするべきではない。
内部処理から描画ルーチンへのデータの流れは一方通行にするべき。
002321
02/04/29 19:30ID:qMxpqTZMヘルプに書いてあった。
>この設計は、暗にマルチスレッド アプリケーションを意図している。
>特に、アプリケーションはウィンドウ メッセージ処理スレッドを
>Direct3D スレッドから完全に分離しなければならない。
>1 つのスレッドでモード変更を行いながら、
>別のスレッドで Direct3D の呼び出しを行うアプリケーションは、
>デッドロックの危険性がある。
>
>このような理由から、Direct3D では、Reset、CreateDevice、TestCoorperativeLevel、
>または IDirect3DDevice8 の最後の Release の各メソッドは、
>ウィンドウ メッセージを処理するスレッドと同じスレッドからのみ呼び出すことができるように設計されている。
つまりこれさえ気をつければ、Windowスレッドとの兼ね合いを気にする必要はない訳だね。
0024名前は開発中のものです。
02/04/29 19:46ID:???でも、描画と内部、別スレッドで回すっても、クラス多用だと変数の二重化が面倒だよなぁ
保存する変数がいろいろ散らばってるもんなぁ
行列だったり、オイラー、Quaternion、ブレンド係数だったり
その辺、どー書くのがスマート?
0025名前は開発中のものです。
02/04/29 20:04ID:???みんなが使うデータは管理するクラスをひとつ作ってそいつが管理。
0026名前は開発中のものです。
02/04/29 20:10ID:???描画開始時に必要なデータをバッファにコピーしてきて、それから描画するとかな。
BeginCopyでデータをロックして読み出し開始、EndCopyでロック解除するみたいな。
(注:そんなAPIありません。自作でねw)
データが多いと大変だけど…設計次第。
0027名前は開発中のものです。
02/04/29 21:29ID:kRVsyEhUキャラclassには、標準として
Render系インターフェイスとFrame系インターフェイスと
別けて実装すればスッキリすると思う。
0028名前は開発中のものです。
02/04/29 21:29ID:???どうやってるんだろ?
ちなみに俺は持ってるけど読んでません
0029名前は開発中のものです。
02/04/29 21:51ID:???描画は1フレームごとのタイマー割りこみで処理する。
内部処理側は1フレーム分の描画オブジェクトのセットが完成したら
渡す。
でも内部処理と描画を分けるのは賢くないので、waitvに描画処理を
埋め込む事を推奨する。
0030名前は開発中のものです。
02/04/29 22:36ID:???市販のゲームは、描画にかかった時間を計って、その分データを更新するって
方法が一般的じゃない?速いマシンではいくらでも速くなるように作らないとね。
0031名前は開発中のものです。
02/04/30 03:27ID:???まともじゃない方法ならそれ以上だせるが、そっちのほうが手抜きだな。
■ このスレッドは過去ログ倉庫に格納されています