2ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

PCで描画と内部処理の非同期処理ってどうやんの?

1 :(;´д⊂ヽ:02/04/29 16:14 ID:Gsu.P7Dk
PCならではの可変フレームレートで、かつ安定したキー入力とか演算の微分処理とか
実装したいんですが、具体的に、どういう風な構造にすればいいのか全然わかりません助けて

キー入力とかタイミングに厳しい処理を別スレッドで回すとして
描画担当スレッドはどーすればいいんでしょう?
(描画途中で別スレッドにより内部変数が書き換えられるケースが出てきますよね?)

2 :名前は開発中のものです。:02/04/29 16:19 ID:???
みんな頑張ってるから

3 :名前は開発中のものです。:02/04/29 16:20 ID:???
書き換えられたくないタイミングをマスクするしかおもいつかんのだが。

4 :名前は開発中のものです。:02/04/29 16:56 ID:???
多重に持てば良いんじゃないの

5 :名前は開発中のものです。:02/04/29 16:57 ID:???
単発スレ立てんなボケ。

6 :名前は開発中のものです。:02/04/29 16:59 ID:???
ローカルルールをよく読めやGW厨

お約束
 3.簡単な質問やあいまいな(問題点の良く分からない)質問は汎用Q&Aスレッドへ

7 :(;´д⊂ヽ :02/04/29 17:23 ID:Gsu.P7Dk
すんません。単発つーか、結構深いテーマな気がしたんで
本でも扱ってないし

2Dゲーみたく、スプライトレジスタみたいのだとマスクとか多重化も
簡単なんだけど、3Dゲーでクラスだと色々面倒でねぇ

可変フレームレートつってもリフレッシュレートの関係で上限は120と
しても問題ないわけで、なんか上手く処理できんものんかと思ったわけです

ゲーム内ではよくある、1フレーム前の位置参照するような場合でも
前フレームが何ミリ秒前なのか可変だと困ると思うのです
仮に計算で逆算するにしても、ソウルキャリバーの剣の軌道なんかの
多段数の前フレーム参照は難しいかなと思うのです

そんな訳で僕の中では、上限120FPSで、処理落ちするときだけ描画を飛ばす
ような完全非同期ではない方法が正解だと思うのですが、ご意見聞きたいなぁと

8 :名前は開発中のものです。:02/04/29 17:26 ID:???
>>7
それでいいんじゃない。
はい終了。

9 :名前は開発中のものです。:02/04/29 17:30 ID:???
でも海外のFPSとかで、ロケット砲なんかのビルボードな煙軌道なんかは、そうでもない気がする

10 :名前は開発中のものです。:02/04/29 17:45 ID:???
内部にカウンタ持ってるか、数フレーム前まで位置を保存しときゃ済む話だろ

11 :名前は開発中のものです。:02/04/29 17:58 ID:???
ジサクジエン乙カレ。
>>1=3=7=9

12 :名前は開発中のものです。:02/04/29 17:59 ID:???
3Dゲームに限らず、殆どのゲームは描画で多くの時間を費やしてる。
描画についていけないならデータ更新する、という>>7の方法でよい。
yaneSDKあたりにそれ関係の記事があったと思うので興味があればどうぞ。

それと、3Dゲームだと描画速度がFPS30位でも結構滑らかに見えてしまうので、
データ更新速度はFPS120ほど高くなくてもよいと思うよ。

質問内容がアレだったこともあるので、削除依頼は出しておいたほうが吉かと。
ログには残しておきたい内容だけれどねぇ。

13 :名前は開発中のものです。:02/04/29 18:08 ID:???
>>7みたいに 1/120秒の内部ループはゲームによっては処理が重いかもしれん
だからといって1/60秒単位で変数を更新した場合、60FPSより早い描画だと、描画側が困っちゃうよね

ミサイルの先端はどんどん進むのに、後端(保存された数フレーム前情報)は1/60単位でしか更新されないと
煙の全長長くなっちゃうよね
(気付かないだろうけど、マシン毎になんか結果がことなるプログラムって気持ち悪い)

じゃぁミサイルの先端位置から後端の位置が計算できるか つーとそうでない場合もあるし

14 :名前は開発中のものです。:02/04/29 18:19 ID:???
PCの場合スペック自慢つーかベンチ代りだったりするので
FPSが60頭打ちじゃ、手抜き!とか叩かれる。技術力もないみたいだし

キャラは同じ位置のままで再描画だけして、Over60FPS表示にしる!
どーせ人間の目では60fps以上区別つかないって言うしー
でも、中には区別できる人もいる罠

15 :名前は開発中のものです。:02/04/29 18:38 ID:qMxpqTZM
Windowsアプリだと、描画はプライマリスレッド以外関与するなって鉄則があると思うんだけど
これはゲームにも当てはまるのか。
WindowのGUIをプライマリスレッドで管理し、
Direct3Dの描画をワーカースレッドで管理なんてOK?
軽く試してみたら、微妙に不具合が起きたのだけど。

16 :名前は開発中のものです。:02/04/29 18:49 ID:???
>>14
実際に自分で簡単なサンプル作ってみればわかるが、
意外に誰でも区別できるぞ。
しかも、見るだけよりも操作するとはっきりわかる。

17 :(;´д⊂ヽ:02/04/29 18:58 ID:Gsu.P7Dk
どうすればいいんでしょう
残影とか軌道が残るモノさえなければ、何にも考えなくていい気はするけど

18 :名前は開発中のものです。:02/04/29 19:13 ID:???
残影とか軌道が残るモノをなくす。

19 :名前は開発中のものです。:02/04/29 19:15 ID:???
残像オブジェクトに賞味期限もたせて、毎回チェック。
期限切れはあぼ〜ん。

20 :名前は開発中のものです。:02/04/29 19:22 ID:???
可変フレームレートな環境(つまるところPC)で
内部計算と入力処理と描画処理をうまいこと回すっていうのは面白いネタだと
思うがなー。OS側の制約がうざいけど。

>>15
SetCooperativeLevel に DDSCL_MULTITHREADED というフラグがある

21 :名前は開発中のものです。:02/04/29 19:23 ID:qMxpqTZM
つーか残像とか軌跡とかも1つのインスタンスとして保持すればいいんじゃないの?
せっかく描画とそれ以外に処理を分けているんだから、
描画の具合が内部処理に影響を与える仕様にはするべきではない。
内部処理から描画ルーチンへのデータの流れは一方通行にするべき。

22 :21:02/04/29 19:26 ID:qMxpqTZM
>>19そのまんまでした。
>>19に同意。

23 :21:02/04/29 19:30 ID:qMxpqTZM
>>20
ヘルプに書いてあった。

>この設計は、暗にマルチスレッド アプリケーションを意図している。
>特に、アプリケーションはウィンドウ メッセージ処理スレッドを
>Direct3D スレッドから完全に分離しなければならない。
>1 つのスレッドでモード変更を行いながら、
>別のスレッドで Direct3D の呼び出しを行うアプリケーションは、
>デッドロックの危険性がある。

>このような理由から、Direct3D では、Reset、CreateDevice、TestCoorperativeLevel、
>または IDirect3DDevice8 の最後の Release の各メソッドは、
>ウィンドウ メッセージを処理するスレッドと同じスレッドからのみ呼び出すことができるように設計されている。

つまりこれさえ気をつければ、Windowスレッドとの兼ね合いを気にする必要はない訳だね。

24 :名前は開発中のものです。:02/04/29 19:46 ID:???
なるほど賞味期限にすればいいのかも
でも、描画と内部、別スレッドで回すっても、クラス多用だと変数の二重化が面倒だよなぁ
保存する変数がいろいろ散らばってるもんなぁ
行列だったり、オイラー、Quaternion、ブレンド係数だったり

その辺、どー書くのがスマート?

25 :名前は開発中のものです。:02/04/29 20:04 ID:???
ローカルでしか使わないデータはローカルで管理。
みんなが使うデータは管理するクラスをひとつ作ってそいつが管理。

26 :名前は開発中のものです。:02/04/29 20:10 ID:???
描画スレがデータに影響与えない設計にすべきだろ。
描画開始時に必要なデータをバッファにコピーしてきて、それから描画するとかな。
BeginCopyでデータをロックして読み出し開始、EndCopyでロック解除するみたいな。
(注:そんなAPIありません。自作でねw)
データが多いと大変だけど…設計次第。

27 :名前は開発中のものです。:02/04/29 21:29 ID:kRVsyEhU
例えば、インターフェイスを使う場合
キャラclassには、標準として
Render系インターフェイスとFrame系インターフェイスと
別けて実装すればスッキリすると思う。

28 :名前は開発中のものです。:02/04/29 21:29 ID:???
Quake系のソースとか読んだ人いないの?
どうやってるんだろ?
ちなみに俺は持ってるけど読んでません

29 :名前は開発中のものです。:02/04/29 21:51 ID:???
どうしても別処理したいなら
描画は1フレームごとのタイマー割りこみで処理する。
内部処理側は1フレーム分の描画オブジェクトのセットが完成したら
渡す。

でも内部処理と描画を分けるのは賢くないので、waitvに描画処理を
埋め込む事を推奨する。

30 :名前は開発中のものです。:02/04/29 22:36 ID:???
>>28
市販のゲームは、描画にかかった時間を計って、その分データを更新するって
方法が一般的じゃない?速いマシンではいくらでも速くなるように作らないとね。

31 :名前は開発中のものです。:02/04/30 03:27 ID:???
まともにやろうと思えばWindowsシステムじゃせいぜい100〜200FPSで限界が来る。
まともじゃない方法ならそれ以上だせるが、そっちのほうが手抜きだな。

32 :名前は開発中のものです。:02/04/30 11:02 ID:???
>>7
>単発つーか、結構深いテーマな気がしたんで
その結果がこれかよ…

33 :名前は開発中のものです。:02/04/30 14:35 ID:???
スーファミ等のエミュレータが綺麗に処理していると思うんだけど
ソース公開しているのもあるよね。誰か調べたことのある人いる?

34 :名前は開発中のものです。:02/04/30 16:03 ID:???
CAPCOMのエミュレーターはトリプルバッファとかでやってたな

リフレッシュ論争だけど、60FPSのゲームをリフレッシュレート85とかにしてれば
どうやってもガタツクよね?

35 :名前は開発中のものです。:02/04/30 16:14 ID:a3cFuDTc
ゲームにおけるマルチスレッドの運用って感じで
このスレもまだまだ存在意義があると思うな。
んで質問。スレッド間通信で最もゲーム向きなもん(軽い)て何?
やっぱりメッセージかな?

36 :名前は開発中のものです。:02/04/30 16:53 ID:???
>>32
質問スレって初歩的な事しかわかんないじゃん
玄人は読んでる人少ないし

37 :名前は開発中のものです。:02/05/01 00:46 ID:T8nyusCw
一般的かどうかはともかく、俺の場合。

1)内部描画コマンドを定義する
2)ゲームのメインループとは別に描画スレッドを回す
3)メインループはタイマで毎秒60回ぶん回して、描画コマンドをキューに突っ込む
4)描画スレッドはキューに入っている描画コマンドを元に画面を作る

という感じ。
もちろん、描いてる途中で描画コマンドキューが書き換わったり、描画コマンドキュー
が構築されていないうちに描画されないようにするための工夫は必要。
(キューの多重化とか排他制御とか)

38 :名前は開発中のものです。:02/05/01 06:46 ID:???
>>37
60回以上描き換えることがあっても、
内部処理は60回超えないってこと?
遅い場合は有利だけど、速い場合は利点はないってことでよいのかな?

39 :37:02/05/02 01:16 ID:nbxhpyDs
>>38
自分のやり方の場合、そうなります<60回/sec超えない

前フレームの処理にかかった時間を元に今フレームでの移動速度を補正
させつつ全力でぶん回す、というやり方もやったことはあるけど、個人的に
あまりエレガントだとは思えなかったので・・・。

40 :名前は開発中のものです。:02/05/02 02:06 ID:???
あれ、>>37のやりかたで60回以上描きかえることがあるの?
描画コマンドが60回までしか発生しないから、描きかえも60回まででは?

41 :名前は開発中のものです。:02/05/02 02:19 ID:???
ソースコードと実装のエレガントさをとるか、やってることのクールさをとるか。

42 :37:02/05/02 02:33 ID:ZkWoqS7A
>>40
あー、言葉足らずですみませんでした。
もちろん1フレーム描いたら、描画コマンドキューが更新(表裏切り替え)
されるまでは描画もしません(_o_)

43 :名前は開発中のものです。:02/05/02 02:48 ID:???
やっぱ>>7にもどって 内部120回ループとかが行けてる?

44 :名前は開発中のものです。:02/05/02 03:26 ID:iMh3R/Ps
>>43
120回なんか回したって意味ないんだから
60回上限にして、その分アイドルに回した方が
全然いいと思うがナ。

45 :名前は開発中のものです。:02/05/02 12:13 ID:???
>>44
ウィンドウモードのことを考慮してるんじゃない?
フルスクリーン60Hz限定のゲームならいいんだけどね
更新60Hzでディスプレイ75Hzだと相当がたつく

46 :名前は開発中のものです。:02/05/03 00:35 ID:???
>更新60Hzでディスプレイ75Hzだと相当がたつく

これって2Dモノはよくわかるけど、3Dだとわかる?
それ以前にWindows特有の処理落ちみたいのがあるし、FPSとか場面毎のポリゴン数によって
処理落ちしたりして、何が原因だかよくわからないんだよねー

ダブルバッファをスマートに書くのはテンプレート使えばいいんじゃない?
描画と完全に分けるならトリプルバッファが必要だと思うけど。
でも、そんな面倒な構造にする必要あるかね?

47 :名前は開発中のものです。:02/05/03 01:42 ID:6JPEwFK2
>>44
PCでやる以上、それは割り切るしかないと思う。
タイマで計って廻した所で、完全にVSyncと同期させるのは無理だし〜

48 :名前は開発中のものです。:02/05/03 03:03 ID:???
あのーここってリフレッシュレート論争と大差ないんですけど・・・・

49 :名前は開発中のものです。:02/05/03 03:17 ID:???
>>46
60fps固定で処理してると、3Dでもガタつくよ。
モーションが飛ぶんじゃなくて、速度が不安定になるというか、ブレる感じ。

内部処理を固定するなら、描画処理は1フレーム分遅延させるのがベスト。
描画処理の方が速く回る場合は、補間させて滑らかな動き。

50 :名前は開発中のものです。:02/05/03 11:13 ID:???
新リフレッシュレート論争スレの予感。

過去スレより
http://piza.2ch.net/tech/kako/972/972165437.html
>命題:「『1フレーム後に、変数v がa増加する』をどのように実装するか?」
>
>◆A宗:「v += a * dt」
>v-syncに同期。リフレッシュレートは任意。
>
>◆B宗1派:「v += a」
>タイマーに同期。一定間隔で値を更新する。
>
>◆B宗2派:「v += a」
>v-syncに同期。何らかの方法でリフレッシュレートを固定する。

私は一時A宗に傾きかけたが、結局B宗に戻りつつあるような気がする。

51 :名前は開発中のものです。:02/05/03 12:03 ID:???
ゲームクリエイターズバイブルに描画と内部処理の分け方の話があったね。

52 :名前は開発中のものです。:02/05/03 13:17 ID:???
>>50
そのスレ読んでないけど、内部処理と描画処理を分けるこのスレの趣旨とは
微妙に違うぞ。
このスレは内部処理はB宗で描画だけA宗にするって話。
それがいいか悪いかはともかく、どうやって実装するのかというスレ。

53 :名前は開発中のものです。:02/05/03 13:20 ID:???
実のところ話していることは同じだという罠

54 :名前は開発中のものです。:02/05/03 18:25 ID:???
内部処理では座標などの値を過去フレームと次回フレームの2つを持っておく。
描画スレッドでは描画開始時間と内部処理の過去フレームの時間から補完?

 float t = (render_time - old_time -) * (60 / 1000);
 D3DXVec3Lerp(&currnt[i], &prev[i], &next[i], t);

てのを全部に対してやるだけだったらそれなりにエレガントかも。

55 :名前は開発中のものです。:02/05/03 19:15 ID:???
>>54
それだと、キーフレームアニメーションなんかやると
アニメーションの終端を突破したりしないか?
IF文で終端で止めにすればいいという問題でもない
(アニメーションAが終わったらアニメーションBにスイッチする場合とか)

56 :名前は開発中のものです。:02/05/04 12:02 ID:???
>>55
たいした問題じゃない。

57 :名前は開発中のものです。:02/05/04 16:15 ID:???
>>54はスレッドを分けなくてもできるね。
排他制御しないぶん楽。

58 :名前は開発中のものです。:02/05/04 19:49 ID:???
毎ループ数値積分してるやつはどうなるの?

59 :名前は開発中のものです。:02/05/04 20:29 ID:DoQwTAVw
内部処理回数が決まってないと リプレイの実装が面倒でないか?
車ゲーのリプレイは適当でいいけど

まぁ、最低60回は回すように組んでおくとして、数値微分なんかの
凾狽ェ小さすぎて問題になることなんてあるだろうか?

60 :名前は開発中のものです。:02/05/04 20:53 ID:???
ない。

61 :名前は開発中のものです。:02/05/04 23:03 ID:???
丸め誤差にさえ気をつけていれば大丈夫

62 :名前は開発中のものです。:02/05/05 00:10 ID:PKpkIeKE
FPS制御用にワーカースレッドを使ったクラスを作ったが
普通の関数バージョンに比べて遅くなった。
つーかフレームのコールにPostMessage使ってるし当然か。
なんだか設計思想が間違ってたようで激しく鬱。

63 :名前は開発中のものです。:02/05/05 00:42 ID:???
>>62
PostMessageはまずいでしょ…ガタガタになっちゃう。
ま、誰しも一度は通る失敗だけどね。

64 :名前は開発中のものです。:02/05/05 01:07 ID:PKpkIeKE
>>63
でもさ、それ以外思い浮かばんのよね。
それ以外だと、メッセージループに
if( pFPS30->BeCalled() ){
RenderMain();
}
を埋め込む以外なくなる。

65 :名前は開発中のものです。:02/05/05 02:14 ID:QlZCUdc2
グローバル変数だ!

66 :名前は開発中のものです。:02/05/05 02:29 ID:???
volatile bool g_BeCalled より
PostMessage(arg->hWnd, WM_PAINT, 0, 0)を
選ぶ62たんはWindowsプログラマの鏡!

67 :62:02/05/05 03:42 ID:yqpWzWOE
俺のプログラムだと、
FPS用のスレッドでパフォーマンスタイマーの
ビジーループをぐるぐる回して処理している為
たとえ内部処理、描画処理を1FPSに設定しても
CPU占有率が100%になってしまう。
何かスマートな実装方法は無いかえ?

68 :名前は開発中のものです。:02/05/05 03:59 ID:???
HALT

69 :名前は開発中のものです。:02/05/05 04:06 ID:yqpWzWOE
>>68
Sleep系とパフォーマンスタイマーの併用ってこと?
パフォーマンスタイマーから大まかなSleep時間を
求めて眠らすとか?
それとも精度には不安があるがSleep系のみで管理とか?
ビジーループを使わず、タイマーを使う良い方法が
あったら教えて欲しい。

70 :名前は開発中のものです。:02/05/05 04:29 ID:XpophaTo
精度に不安って他にプログラム走らせてない場合も不安定なんだろうか。

71 :69:02/05/05 05:40 ID:CUy74S1o
>パフォーマンスタイマーから大まかなSleep時間を
>求めて眠らすとか?
MsgWaitForMultipleObjectsを使ってこの案を実践したら
60FPSでCPU使用率100%だったのが0%まで落とす事に成功しました。
なんだか上手くいき過ぎて怖い。^^
でも試して上手くいった時は快感!だったりする。

>>70
60FPSの場合、精度は16msec程度必要。
まあSleep系は悪くても誤差10msecらしいから
一応大丈夫といえばそうらしい。

72 :名前は開発中のものです。:02/05/05 10:34 ID:???
>>70
Windowsで、他にプログラムを走らせない状況を作るのは不可能。

73 :名前は開発中のものです。:02/05/05 11:42 ID:???
ゲームで使うタイマーって、タイマーだけ別スレッドにするの?

74 :名前は開発中のものです。:02/05/05 11:50 ID:???
俺はいちいちスレッド分けずに書いてるのだが…(FPS可変)
やっぱり描画とその他って分けるべき?

75 :名前は開発中のものです。:02/05/05 13:39 ID:???
このスレは分けて書くためのスレなので、そういう質問は不適切。

ちなみに描画と内部処理を同期させてるゲームの場合、壁にぶつかる瞬間にわざと
負荷をかけてフレームレートを落とすと壁をすり抜けたりする。
かつて、リアルタイムで解像度が切り換えられるゲームがあったけど、解像度切り
換えで1秒くらい時間が飛ぶから、それで壁を突き抜けたりミサイルをすり抜けた
りなんてことができたよ。

76 :名前は開発中のものです。:02/05/05 14:02 ID:???
>>75
えー、それはつくりがヘボイだけでは。

77 :名前は開発中のものです。:02/05/05 14:05 ID:???
>>75
冲 が 3.25なら、 1, 1, 1, 0.25でループ回す

78 :名前は開発中のものです。:02/05/05 14:06 ID:???
でも弾が壁抜けるのはやり方がヘボイ。
前回と今回の座標でレイとばせ。

79 :69:02/05/05 16:00 ID:Qufy7xrs
>>73-74
いや別ける必要はないと思う。
俺の場合、ビジーループのCPU負荷を下げたいと
模作した結果、こんな形になってしまったが
メリットは無かった。
>>71のMsgWaitForMultipleObjectsを
メインメッセージプロシャージャーに組み込む方法をとるか
FPS制御クラスにSleep系を組み込むようにする設計にすれば
スレッドを作らなくても同じことが出来るはず。

80 :69:02/05/05 16:02 ID:Qufy7xrs
あ、でもプライマリスレッドをスリープさせちまうのはヤバいか?
>>79は撤回。やっぱスレッドは必要かも。

81 :69:02/05/05 16:08 ID:Qufy7xrs
ああそれに俺の場合そもそもアプローチの方向が違うなぁ。
>>1その他の方向性は、CPUパワーに余裕がある場合FPSを増やす可変方式なのに対し
俺の場合、安定したFPSでCPUパワーに余裕がある場合眠らせるって形だからなぁ。
やねおうら氏のスーパープログラマーへの道にも、Sleepを用いたFPS制御を話題に挙げていた回があったが
あれは、プライマリとは別にゲーム用メインスレッドを作っているから可能な方法だな。 

82 :名前は開発中のものです。:02/05/05 17:10 ID:???
FF11は30fps固定でくると思う人いる?

83 :名前は開発中のものです。:02/05/05 22:52 ID:???
>>82
ネットゲームは通信速度が一定じゃないからfps固定はできないんじゃ?

84 :名前は開発中のものです。:02/05/06 01:34 ID:???
>>83
「固定」の意味もイマイチ不明だけど、「通信速度が一定じゃないから」ってのも違う気がする

85 :名前は開発中のものです。:02/05/06 01:42 ID:???
通信速度が一定しない所為でフレームレートが固定「できない」
なんていうヘタレな実装をしている市販3Dゲーが思いつかないが。

86 :85:02/05/06 01:44 ID:???
85は>>83へのレスね。というか、かぶりまくりだった。スマソ。

87 :名前は開発中のものです。:02/05/06 03:06 ID:???
>>82
通信速度は関係ないと思うが、
ゲームの性質上FPS固定ってのはありえんと思う。
画面上に人がイパーイでたりするからね。

88 :名前は開発中のものです。:02/05/06 07:01 ID:???
FPS固定でもラグったら飛ばさないといけないよな。
結局やることはFPS非固定と対して代わらないような。

89 :名前は開発中のものです。:02/05/06 07:02 ID:???
というか非固定で作っておいて、
固定にするくらい出ないとだめか。

90 :名前は開発中のものです。:02/05/06 16:25 ID:???
>>85
DIABLOとかやったことないの?
魔法使いまくるとフレームレート落ちるよ。

91 :名前は開発中のものです。:02/05/06 16:48 ID:???
>>90
DIABLOやったことないので質問するが、それは描画処理が増大して
モタついてるということではないのか。

例えば、FPS系のメジャー所では通信速度はフレームレートに
影響しない。Lagの激しい奴はパケットロスということで
前フレームの移動パラメータを使って補間アニメーションする。

92 :91:02/05/06 18:17 ID:???
あ、FPS系てところは
First Person Shooting系 と読み替えてくれ。

93 :名前は開発中のものです。:02/05/06 19:45 ID:???
通信前提で作ればローカル(一人)プレイ版も簡単に作れると思うんだけど
普通に作っちゃうとローカルプレイ版が先にできちゃって
後から通信対応させるのにスゲエ苦労して一ヶ月泊り込んじゃったよ
っていう人いますか

94 :名前は開発中のものです。:02/05/06 21:46 ID:???
83≒90?
ネットゲーは毎フレームデータのやり取りしてると思ってるのかな?
Doomならそうだったけど、今はそんなことしてるゲームは少ないよ。
元々アーケード用に作ったゲームを移植のついでにネットワーク対戦に
対応させるときはやったりするけど(某DC用のゲームとか)

95 :69:02/05/06 23:05 ID:5hxqOZms
ぐああダメだぁ〜!!
Direct3Dを使ったプログラムで、>>71で作った
スレッドを用いたFPSのクラスを使うと
モーダルダイアログを呼んだ瞬間に(::DialogBoxIndirectParam)
固まってしまう。
モーダルダイアログは親ウインドウと同じスレッドです。
FPSのスレッドをサスペンドにすると固まる、
スレッドを終らせてからダイアログを呼ぶと固まらない、
デバック出力用APIを1行加えると固まらない、
FPSクラスのフレームの呼び出しがメッセージだと固まる、
FPSクラスのフレームの呼び出しをファンクションコールにすると固まらない、
D3Dで描画しないと固まらない、
これって何が原因だかわかります?

96 :名前は開発中のものです。:02/05/06 23:18 ID:???
ダイアログ自前これ最強。
スキン対応も簡単だからいいだろ。

97 :名前は開発中のものです。:02/05/06 23:20 ID:???
今DirectX7で開発してる人は割合少ない肝

98 :名前は開発中のものです。:02/05/07 02:41 ID:???
>>95
それは、Win32とかマルチスレッドプログラミングの参考書を
一冊手に入れて目を通したほうがいいような気もする。

99 :名前は開発中のものです。:02/05/07 07:05 ID:???
>>95
んなの聞いたことない。
ぼんミスでバグってるだけだろ。

100 :名前は開発中のものです。:02/05/07 10:10 ID:???
マルチスッドレはデバッグが面倒だよね。

101 :69:02/05/07 11:13 ID:H21ddL0Q
マルチスレッドといえばそうなんですけど、
FPSのスレッドがしていることは、
一定時間Sleepして::PostMessageでユーザー定義メッセージを
ウインドウに送っているだけです。
それ以外、変数を操作したりWindowsのシステムにアクセスしたりとかは
何もしていません。
Window、Direct3D、その他もろもろは同一スレッドなんで
実質シングルスレッドと殆ど変わりません。
キーを押された→WM_KEYDOWNメッセージハンドラで、
FPSスレッド停止しダイアログ呼び出し、こんな感じです。
このFPSスレッド停止をSuspendにするとダメ、DestroyにするとOKなんですよね。
まあダイアログをモードレスして作り直してどうなるか試してみます。

102 :名前は開発中のものです。:02/05/07 21:10 ID:???
>>101
まぁ内心では気付いてるだろうと思うが、
そういうあいまいな文章による状況説明では他人に問題点を指摘してもらうのは難しい。
(orバグを作った本人の状況分析だけを頼りに問題点を見つけ出すのは難しい)
ソース見せられるなら添削してもらうこともできるだろうが
それが無理なら「頑張ってね」としか言えんよ、実際。

とりあえずDirectXとか余計なものから一つ一つ外してみたらどうか。

103 :69:02/05/08 01:33 ID:LDZ.FZgI
>>102
その通りですね。
なんだかすいません。

104 :処理安定:02/05/09 02:02 ID:???
Windowsがリアルタイムゲームに向かない理由、それは突如、原因不明な
ブロッキングに悩むからだと思うんだけど、ちょっとだまされたと思って
以下の設定してみてください。
「マイコンピュータ」->「プロパティ」->「デバイスマネージャ」->「ディスクドライブ」の設定で
オプションに DMA という項目があります。
Windowsの出荷状態では、ここはOFFなのですが、これをONにしてWindowsを
再起動してみてください。謎のブロッキングがかなり解消されますよ!

仮に解消されなくてもファイルアクセスなどがぐんと速くなるので損することは
ないと思います。(ただ一部のハードではこのDMAは無効になってるかもです)

60FPS以上のゲームで「ガクン!」というのがなくなると思いますよ、お勧め。

じゃ、眠いので僕は寝ます。おやすみ〜

105 :名前は開発中のものです。:02/05/09 04:21 ID:???
>>104
そんなこと自慢されてもなぁ。XPじゃ最初から有効にされてるし。
プロセスとスレッドの優先度を最大まで上げる方が効果あるよ。
絶対に苦情くるけど。

106 :名前は開発中のものです。:02/05/09 14:16 ID:???
>>105
104のどこが自慢っぽく見えるのか、俺には不思議。
性格ゆがんでない?

107 :名前は開発中のものです。:02/05/09 15:54 ID:???
>>104
普通やん.
別に画期的なネタでもないわ.

108 :名前は開発中のものです。:02/05/09 16:24 ID:???
>普通やん.
MSの公示では、普通じゃないだろ >>FD,HD-DMA
DMA無効になってるのが普通。

問題は、ドライバの設定を変えた時に再起動させること。
自分のマシンだけリブートすればいい問題ではないので。

有名なネタではあるが。

109 :名前は開発中のものです。:02/05/09 18:44 ID:???
>>105
いちいちくだらねえことつっこむなよ。
>プロセスとスレッドの優先度を最大まで上げる方が効果あるよ。
これこそわかりきってることを自慢すんなよ。障学生が。

110 :名前は開発中のものです。:02/05/09 19:14 ID:???
PC房ってやつですか

111 :名前は開発中のものです。:02/05/09 19:51 ID:???
>>104
それって98/95あたりの話じゃ、、、

112 :名前は開発中のものです。:02/05/09 20:44 ID:???
をーーーーーーー!見事安定した!マジかよ。
ガタ落ちゼロになった。
ちなみに俺の環境はWin98.
今までの苦労、水の泡。

なんでディフォルトでDMA-ONじゃないのだ?>>MS

というか、配布するソフトでも是非、DMA-ONの状態にしたいのだが、
アプリケーションからそれを操作する方法ってないのか?

113 :名前は開発中のものです。:02/05/09 20:51 ID:???
昔はDMAをオンにすると不安定になるハードが結構あったからねえ、、、
マザボのチップセットと相まって、かなりヤバイことになってた。
だからデフォルトOFFなんだと思う。
Socket7の頃の話だけどね。

114 :名前は開発中のものです。:02/05/09 21:24 ID:V/9kUMis
Win2000の場合はデバイスマネージャーの
IDE ATA/ATAPIコントローラーの
プライマリIDEチャネルとセカンダリIDEチャネルで設定出来る。

115 :名前は開発中のものです。:02/05/09 21:31 ID:???
>>112
DMAオフでガタつくゲームってのも、問題アリだと思うが。

116 :名前は開発中のものです。:02/05/09 21:50 ID:???
>DMAオフでガタつくゲームってのも、問題アリだと思うが。
CPUが高速なHDのデータコピーを汗かきながらI/Oへ書き込むので
全てのアプリで停止するのだよ。特に最近のHDは高速だから、
DMAなしではやってられない。
0.3秒くらいCPUがHDの転送に専念することもしばしば。

117 :名前は開発中のものです。:02/05/09 22:01 ID:???
>>116
ゲーム中はHDへアクセスしないようにするべし。

118 :名前は開発中のものです。:02/05/09 22:08 ID:???
自アプリがやらなくても他アプリがやったり
ライトバックキャッシュのフラッシュや
ページアウトでアクセスが発生しちまいますな

119 :名前は開発中のものです。:02/05/09 22:28 ID:???
>>118
そうゆう話じゃないと思われ。
他のゲームはガタつかないのに自分のゲームはガタつく!ってのが問題。

120 :名前は開発中のものです。:02/05/10 04:19 ID:???
>>119
>他のゲームはガタつかないのに自分のゲームはガタつく

そんなこと誰か書いたっけ?

121 :名前は開発中のものです。:02/05/10 06:45 ID:???
誰も書いてない

122 :名前は開発中のものです。:02/05/10 19:29 ID:???
人に頼ってちゃダメだよ。
自分から行動を起こさなきゃ。

123 :名前は開発中のものです。:02/05/11 04:24 ID:???
>ゲーム中はHDへアクセスしないようにするべし。
んー、学生さんかのぉ?
Windowsやlinuxなどのような高度なOSでは、
例えば malloc() などのヒープもアプリケーション実行開始直後は
物理メモリに存在しないことしばしばなのじゃよ。
new を呼んだ瞬間、物理メモリが存在しなかったら、そこでHDアクセス。
スタックがオーバーしたら、HDアクセス。
他のアプリが使用していたメモリをHDへ書き戻す作業であることが
ほとんどなのじゃがな。

ゲームなど連続描画がシビアな環境では
Windows上だとガタガタに見えてしまうのも、そこが原因だったりするんじゃ。

124 :名前は開発中のものです。:02/05/11 15:53 ID:???
>>123
>Windows上だとガタガタに見えてしまうのも

見えませんが?

125 :69:02/05/11 17:18 ID:HivZaZZA
>>101解決?しました。
FPSを表示するのにFPSの抽出を60FPSとかにすると
更新が激しくて見づらいので、2FPS等で抽出させる
別のFPS制御クラスを作っていたんだけど、
ダイアログを表示する際にこいつは関係ないと思って
サスペンドしていなかった為に、デッドロックが起こっていたようです。
結果論であり、デッドロックの理由はわかりませんが。

::CreateWaitableTimerという便利そうなAPIを発見したんで
こりゃ使えると思ってFPS制御クラスに組み込んだら、
こいつしっかりCPU時間を消費しやがんの。
使えね〜、精度も低いしサ。

>>123
そういうことをやっているかどうかは知らんけど、
やっていたとしても、それは単に物理メモリが少ない場合の
回避処置でしか無いと思うんだけど。
そりゃメモリが足りなくてスワップしまくりな環境なら
ゲームもカクつくよ。

126 :99:02/05/11 17:22 ID:.Lvp8gPk

-------風俗の総合商社・MTTどこでも-------

〇デリバリーヘルス〇デートクラブ〇女性専用ホストクラブ〇
〇ハードSM奴隷クラブ〇レズビアン倶楽部〇ホモ・オカマ倶楽部
〇変態痴女と遊ぶ会〇痴漢・覗き趣味の会〇変態同好会・各種!
●楽しく遊べます! 090-8002-8356番
-----------美男・美女会員など多数在籍中-----------
  http://www.mttdocomo.jp/
-----女性アルバイト随時募集・高収入(日払い)月100万円可能-----
-----レズビアン・スタッフ●ホモスタッフ●女性専用ホストスタッフ同募-----
http://www.mttdocomo.jp/

127 :名前は開発中のものです。:02/05/12 08:31 ID:???
>やっていたとしても、それは単に物理メモリが少ない場合の
>回避処置でしか無いと思うんだけど。
WinXPだとか、物理メモリあっても初アクセスまではアプリ用にメモリをcommit
しないというのに、何を逝ってるのかな?
10秒後に初めてアクセスした変数がメモリにまだcommitされてないページだった
らHDアクセス決定じゃん。

128 :名前は開発中のものです。:02/05/12 19:48 ID:IYwn5BLg
>>127
コミットされていないページ=スワップアウトされてHDに退避させられているページ
じゃないんじゃないの?
単に仮想メモリが物理メモリにマップされてないだけで。
MSDNでVirtualAllocのページ見てみ。
つーかイチイチメモリ確保の度にHDDアクセスする訳ないじゃん。
常識的にアホ仕様だろそれじゃ。

129 :名前は開発中のものです。:02/05/12 20:43 ID:???
その話題はスレ違いっぽいので他でやってくれんか

たとえば
http://pc.2ch.net/test/read.cgi/tech/1017072275/

130 :名前は開発中のものです。:02/05/14 21:35 ID:ru/D90z6
 

131 :名前は開発中のものです。:02/05/19 11:18 ID:ajzZw3lo
>>128

>コミットされていないページ=スワップアウトされてHDに退避させられているページ じゃないんじゃないの?

コミットされていないページ=まだ存在していないページ

>つーかイチイチメモリ確保の度にHDDアクセスする訳ないじゃん。
Windows はダーティなページを極力メモリに保持し続ける方針で設計されている為、
いざページをコミットしようとすると、すぐに使えるメモリが足りなくて、結果的にページアウトが発生してしまう。
当然未使用メモリがある場合は、 HD へのアクセスは無い。

132 :名前は開発中のものです。:02/05/19 15:25 ID:???
だからスレ違いだっての。日本語わからないのか?

133 :名前は開発中のものです。:02/05/20 01:16 ID:???
>>132
まぁ言いたいことは分かるが
あまり騒ぐと自治厨氏ねとか不本意な罵りを浴びるぞ。

134 :名前は開発中のものです。:02/06/01 20:55 ID:???
別に俺はここでこの話題をしてもいいと思うが…
3、4レスのためだけに別スレに移動なんてしてたら、
話の一貫性がなくなってしまうだろう。

135 :名前は開発中のものです。:02/06/02 11:58 ID:???
だって知識が乏しい連中ばっかなんだもん

136 :名前は開発中のものです。:02/06/03 11:14 ID:???
では貴殿の知識を開陳せよ。
他人を蔑むだけのカキコって、技術レベルに関係なくなんかむかつく。

137 :名前は開発中のものです。:02/07/22 05:33 ID:???
可変フレームレートってどういういうものでしょう。
60FPS出るように作って、処理が遅れたら処理落ちすれば
いいだけなのでは、、、?

3Dのゲームなら30FPSくらいが普通でしょうか。

138 :名前は開発中のものです。:02/07/24 05:29 ID:???
>137
v' += v * dt みたいな感じかな…。

具体的な実現方法は何パターンかあると思います。
どっかのスレでそんな議論してたと思った。役に立たなくてスマソ

139 :オマンコー&rlo;ー゚ホンィテ&lro;:02/10/26 08:35 ID:???


140 :名前は開発中のものです。:02/11/01 08:50 ID:???
漏れら極楽人道のageブラザーズ!
良スレっぽいものは強制的にageてやるからな!
 ̄ ̄∨ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
  ∧_∧   ∧_∧    age
 (・∀・∩)(∩・∀・)    age
 (つ  丿 (   ⊂) age
  ( ヽノ   ヽ/  )   age
  し(_)   (_)J


141 :あぼーん:あぼーん
あぼーん

142 :名前は開発中のものです。:02/11/28 05:24 ID:EVnGiSza
     ______
    /_      |
    /. \ ̄ ̄ ̄ ̄|
  /  /  ― ― |
  |  /   (・) (・)|
  ||| (6      > |
 | | |     ┏━┓|   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
| | | |     ┃д┃|  < 正直、ageてすまん
|| | | |  \ ┃  ┃/    \________
| || | |    ̄  ̄|

143 :あぼーん:あぼーん
あぼーん

144 :名前は開発中のものです。:02/11/28 07:20 ID:Ib7kWWVj
自分の考えだと時間でDTだして変数にかけるのは駄目。
当たり判定なんかで絶対死ぬ。
面倒臭くて作ってられない。
よしんば自分は制御できても他の人はできないでしょ。
ネトゲはしかたないけど。
別に必要がないならフレーム飛ばしで対応が一番楽。

145 :あぼーん:あぼーん
あぼーん

146 :名前は開発中のものです。:02/11/29 00:07 ID:MjrDrSuB
厳密にやろうとしなければOKでしょ。
ピンボールゲームとかビリヤードとかだとそれじゃまずいんだけどさ。

39 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.02.02 2014/06/23 Mango Mangüé ★
FOX ★ DSO(Dynamic Shared Object)