質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

3198閲覧

参考書でフレームレートの固定するコードの説明が足りないのでわからない部分の意味を理解したい。

退会済みユーザー

退会済みユーザー

総合スコア0

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/07/27 03:43

void Game::UpdateGame(){ } 関数部の///////コメント内部のコードですがこれはフレームレートの制御コードです。
if (deltaTime > 0.05f){ } if文のコードですが参考書には
"
デバッグガーでブレークポイントで5秒の停止時間を入れただけでも巨大なデルタタイムが発生し、シュミレーションでは何もかもが、はるか先へと飛んでしまう この問題を解決するにはデルタタイムの値をある最大値以下に制限するこうすればゲームのシュミレーションがただの1フレームではるか遠くに飛んで行ってしまうことはなくなる。
"
と解説がありますがこれはどういう意味なのでしょうか?**ある最大値以下に制限すればという文章ですがなぜ0.05;**なのでしょうか?

//計算 void Game::UpdateGame() { ////////////////////////////////////////////////////////////////////////////// while (!SDL_TICKS_PASSED(SDL_GetTicks(), mTicksCount + 16)); float deltaTime = (SDL_GetTicks() - mTicksCount) / 1000.0f; if (deltaTime > 0.05f) { deltaTime = 0.05f; } mTicksCount = SDL_GetTicks(); /////////////////////////////////////////////////////////////////////////////// mUpdatingActors = true;//すべてのアクターを更新 for(auto actor : mActors) { actor->Update(deltaTime); } mShip->UpdateActor(deltaTime);//プレイヤー mUpdatingActors = false; //待ちになっていたアクターをmActorsに移動 for(auto pending : mPendingActors) { mActors.emplace_back(pending); } mPendingActors.clear(); std::vector<Actor*> deadActors; for(auto actor : mActors) { if(actor->GetState() == Actor::EDead) { deadActors.emplace_back(actor); } } //死んだアクターを消す(mActorsから削除される) for(auto actor : deadActors) { delete actor; } } //レンダリング void Game::GenerateOutput() { SDL_SetRenderDrawColor(mRenderer,0,0,255,255);//背景色を青に設定 SDL_RenderClear(mRenderer);//バックバッファをクリア // 全てのスプライトをバックバッファに書き込む for (auto sprite : mSprites) { sprite->Draw(mRenderer); } SDL_RenderPresent(mRenderer);//バックバッファをフロントバッファへ書き込み }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

これはどういう意味なのでしょうか?

文章通りの意味だと思いますが,一体何が疑問なのでしょう?
実時間が経過しすぎた際に,シミュレーションの時刻が一度に大きく飛ばないように細工を入れたというだけの話にしか見えませんが.

なぜ0.05

そのコード書いた人が,何かしらの基準によって定めた値というだけでしょう.
(それ,ここでそのコードが何なのかも知らない他人に訊いてわかる話だと思いますか?)


ゲームのシュミレーション

というのが具体的に何なのか全く不明ですが,
例えば,等速直線運動なりを単純なオイラー法でやることを考えて見てはどうでしょう.
ざっくりと,位置xを速度vを用いて,
x = x + v*dt
と更新するとして,
このdtの値が異常にでかい値になったら,xの値は「すっ飛んで」しまうでしょう.
あるいは,ちょっとでかすぎな値なら,座標xが空間を一気にワープするように見える
(実際にこの計算で行っていることは「ワープ」であるが,それが鮮明に見えすぎる結果になる)でしょう.
じゃあ,どの程度のdtの値までは許容範囲なのか?
それに従ってdtの最大値を定めておけば,一度に「でかすぎるワープ」をしなくなる.
…という話.
(0.05というのは,そのプログラムの内容に対して,「許容できる」(と筆者が考えた)何らかの値かと.)

投稿2020/07/27 03:49

編集2020/07/27 03:59
fana

総合スコア11996

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/07/27 03:53

すいませんでした。
fana

2020/07/27 03:57

なぜ謝るのです? > 何が疑問なのでしょう? が,質問文から読み取れないというだけです. とりあえず,ちょっと具体的な例を書いてみました.
yumetodo

2020/07/27 04:00

0.05ってのは1秒あたりに直せば20fpsですね。30fpsなら0.033333...、60fpsなら0.016666..にしますね。
退会済みユーザー

退会済みユーザー

2020/07/27 04:05

どの値がいいのでしょうか?
fana

2020/07/27 04:13 編集

いや,だから,その値の良さなんて,具体内容次第でしょうから,我々に訊いてても仕方ないでしょっていう. > actor->Update(deltaTime); 等が引数の値をどう扱っているかわからんですやん. シミュレーション時間の刻みがでかすぎると問題が起きる系のよくある話としては, ワープする距離がでかすぎると,何かを「すり抜けてしまう」みたいな話とか, あるいは,一度に大きくめり込むせいで反発力が圧倒的になって物体がすっとぷとか. そういう,「実装内容固有の不都合が起きないような値」であれば良い. 問題が起きないなら制限なんてなくてもいいわけだし.
退会済みユーザー

退会済みユーザー

2020/07/27 05:27

参考書にはデバッグするためにブレークポイントで5秒止めたときと書いてるのですが1フレームつまり 0.016でもいいのでしょうか?
fana

2020/07/27 05:34

(この話があなたの作っているプログラムにおいても必要なのであれば)あなたのプログラムにとって適切な値を設定すれば良いのであって,どんな値が適切なのかはあなたしか知らない(判断できない)わけですが. > 0.016 なる値を > while (!SDL_TICKS_PASSED(SDL_GetTicks(), mTicksCount + 16)); と一緒に使うならば,もうそれ実経過時間とか考えないで,0.016固定でやってりゃいいんじゃないかな,という気がしますが.
Daregada

2020/07/27 05:38

ここまで会話していても、参考書が何なのか(書名など)、どんなシミュレーションなのか、を一言も回答者に説明しないあたりに、話の通じなさを感じる。
fana

2020/07/27 05:50

とあるシミュレーションの世界の時間刻み幅がどの程度細かくないと困るのか? というのは,そのシミュレーションの世界の処理アルゴリズムやらデータ値やらに依存する話なのであって, そのシミュレーションに関して熟知していない第三者に「時間刻み幅は1.0でOKすかね?」とか尋ねる行為自体がまったく無意味だという話なんだけども.
fana

2020/07/27 06:17

まぁ,そんな閾値は「実際にやってみて」決めても良いんじゃないかと. 実際上は,かなりイレギュラーな時にしか働かないガードなんだろうし,最初はとりあえずてきとーな値: e.g. 一般的な(=イレギュラーでない)場合の経過時間の数倍とか にでもしておいて,実際にdtのデカさに起因する問題が出たらならば→値をちょっと小さくしてやる,とかでも.
退会済みユーザー

退会済みユーザー

2020/07/27 06:23

なるほど、デバッグで一時停止してると値が大変なこといなるのでそれを防止するためみたいです。デルタタイムを使って移動を行っているみたいので
yumetodo

2020/07/27 07:11 編集

ぶっちゃけいうと、そんなに厳密に止めたい要求があるなら、現実時刻に依存しないようにしたほうがいいと思いますけどね。だってデバッグ抜きにして負荷がかかってるときに、処理がとんでしまう可能性があるわけじゃないですか。フレームレートを落とすけど処理はきちんと完結するならば、極端な話描画結果を録画しといてあとで倍速編集すればよかったりするわけで。
fana

2020/07/27 07:59

想像するに… ・"ゲームのシュミレーション"とか言っているから,きっと入力に応じて出力が変わるゲーム的な何かを作っている. ・その世界においては,dtがある範囲内であれば,相応に妥当な演算結果が得られる. ・dtをその範囲内で可変にすることで処理負荷に対抗しよう(処理負荷が高いときには歩幅を大きくする). ・で,その仕組みの実装たる提示されたコードでは,極端に現実時間に開きがある場合には問題が起きる.だから「『一定以上には歩幅を大きくしない』という一文を入れておくぜ!」 …っていう話であろう. 極端に現実時間に開きが生じる例として「デバッガがどうの」とかいう話を持ってきているんだろうけども,このような話の上では例としていまいちな気がする.(「負荷が想定よりも高いとき」とか言えばわかりやすい予感)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問