DxlibのFPSとリフレッシュレートについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ざこすけ

DxlibのFPSとリフレッシュレートについて

#1

投稿記事 by ざこすけ » 5年前

プログラミングに対する基本的な知識や認識が不足している状態なのですが質問を投稿します。
ご不快にさせてしまったらごめんなさい。

環境
Windows10
VisualStudio C++ 2010 Express
DXライブラリ

リフレッシュレートが40Hzの設定でゲームを制作してしまい、60Hzの設定でゲームをプレイすると想定していたよりゲームスピードを速めることになってしまいました。
これを直そうと
https://dixq.net/g/03_14.html
こちらのページに記載されているやり方でFPSの設定を40に変更しました。
しかし、ゲームスピードは想定していたものになってくれたのですが、頻繁に画面がかくつくようになってしまいました。
調べてみるとScreenFlip()がリフレッシュレートに合わせて動作を変えるらしく、これが関係しているのかと考えましたが、その同期を切るためのWaitVSyncFlagの使い方が自分では理解できませんでした。
ScreenFlip()やプログラミングの概念をしっかり理解していればわかることなのだろうと思いますが、なかなか答えを出せそうになかったので掲示板に質問を投稿しました。
WaitVSyncFlagを偽にする記述の仕方、また、FPSを変更すると画面がかくつく原因が他にあるならそれを教えてほしいです。
よかったらよろしくお願いします。

ざこすけ

Re: DxlibのFPSとリフレッシュレートについて

#2

投稿記事 by ざこすけ » 5年前

自己解決とは少し違うのですが、WaitVSyncFlagの使い方について、DxLib_Init()の前にSetWaitVSyncFlag(FALSE);と記述すれば垂直同期をとらない設定にすることがわかりました。
また、
https://dixq.net/g/03_14.html
こちらのサイトに載ってあるコードのSleepの部分をWaitTimerに変えることで少し処理が軽くなったような気がしなくもなかったです(確証はありません)。

それでもリフレッシュレートを40Hzに設定してゲームをプレイしたときと、リフレッシュレートを60HzにしてFPSを40に設定してプレイしたときでは感覚がかなり異なり、前者が滑らかに画面が動くのに対して後者が常にがくがくしているような印象を受けました。

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: DxlibのFPSとリフレッシュレートについて

#3

投稿記事 by ISLe » 5年前

リフレッシュレートが60Hzのとき、60を超える値をFPSに設定しても、実際のFPSは60で頭打ちになりません?

ざこすけ

Re: DxlibのFPSとリフレッシュレートについて

#4

投稿記事 by ざこすけ » 5年前

返信ありがとうございます。
はい、おそらく頭打ちになって意味がないと思います。
リフレッシュレートを40Hzに設定してFPSが60になるようにゲームを動かしても40FPSのままでしたので。

ただ、今回自分がやりたいのは60HzのリフレッシュレートでFPSを40にして動かすことなので、それを画面の違和感なく実現することはできないのかと思い質問を書きました。
自分なりにいろいろ試してみましたが、ゲームスピードを想定のものにすることはできたものの、どうしても画面全体ががくがくしていて操作感が重い、滑らかさがたりないと感じます。

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: DxlibのFPSとリフレッシュレートについて

#5

投稿記事 by ISLe » 5年前

フルスクリーンモードでもカクつきますか?
ウィンドウモードではWaitVSyncFlagをFALSEに設定しても、VSYNC同期が強制されます。
デスクトップがクラシックテーマであれば有効なのですが、Windows10ではクラシックテーマが廃止されました。

館のコードは、時間が余ったらウェイトを入れるだけで、時間が足らなかったとき(いわゆるコマ落ち)が考慮されていません。
リフレッシュレート60Hzで40FPSなら、コマ落ちするはずないじゃないかと思われるでしょう。
ところが、60分割のタイミングと40分割のタイミングを重ねてみると、待ち時間はバラバラになり、余裕がないときはコマ落ちが発生します。
ゲームスピードを想定のものにすることはできたとおっしゃっていますが、おそらく長時間動かし続けると少しずつズレていくのではないでしょうか。


40FPSを正確に維持したいのであれば、VSYNCを解除したフルスクリーンモードで動かすしかありません。
そのとき、画面が途中で裂けたように表示される現象(テアリング)が発生する場合があります。

ウィンドウモードでは、コマ落ち対策を含めたFPS制御をおこなう必要があります。
カクつきは残ります。
現状よりは改善されるように思いますが、改善されたとは思えないという感想を持たれる方もいると思います。

グラフィックドライバ側でVSYNC同期の制御ができる場合がありますが、ユーザー毎の環境に依存します。

コマ落ち対策を含めたFPS制御については、この掲示板で過去に投稿していますので、過去ログを検索してみてください。

ざこすけ

Re: DxlibのFPSとリフレッシュレートについて

#6

投稿記事 by ざこすけ » 5年前

フルスクリーンモードだとカクつきませんでした。
ウィンドウモードではWaitVSyncFlagをFALSEにしても意味がないのですね・・・。
自分の調べが足りずそうなっているとは全くわかりませんでした。
また、自分が使用させてもらったコードでうまくいかない理由も、わかりやすく説明していただいたおかげで理解することができました。
教えていただいたこと本当に感謝します。

コマ落ち対策を含めたFPS制御のコードは昨晩DLして拝見しました。
しかし自分には内容が難しく実装には至れないかもしれません。
なんとかコードを読み解こうと試みたのですが、C言語やいろんな概念に対する理解が足りず難しかったです。


・ウィンドウモードだと垂直同期が切れないのでコマ落ちを考えて処理の時間がたりないときに処理をスキップする必要がある、そうした場合でもカクつきは完全には消せない
・フルスクリーンモードでは40FPSを維持できるもののテアリングが発生する
自分の考えていたことを実現することは難しそうですが、以上のことが理解でき、頭がすっきりして気持ちを切り替えることができました。
60Hzなのに40FPSで何故コマ落ちが起きるのかもわかりやすく説明していただき非常にありがたかったです。
コマ落ち対策を含めたFPS制御のコードを公開してくれていることも含めて、いろいろと助かりました。ありがとうございました。

返信

“C言語何でも質問掲示板” へ戻る