トップページ > 記事閲覧
FPSの固定化に関して
名前:名無三 日時: 2024/10/13 21:58

お疲れ様です。すいません、FPSの固定方法に関しまして、以前以下のスレッドで建てられていた方法で待機した際の挙動に関して確認です。 dxlib.xsrv.jp/cgi/patiobbs/patio.cgi?mode=view&no=5399 こちら、ScreenFlip内で時間がかかる場合(シェーダーでSSRを追加した際や多量の頂点があるモデルを表示した際など)には前フレームでの待機がずれ込み、待機時間が不安定となるようです。 垂直同期を有効にした際には60Hzなら60FPSで安定するのですが、垂直同期を無効にした際の上記挙動を安定化させる方法はありますでしょうか? 参考に現状のプロジェクト共有となります。DXLib_ref_40_DXDraw.cppのDXDraw::Screen_Flip内で上記の待機をしております 実行の際にはProject\DxLib_VC\DX_VCにDXライブラリを追加後、Project\DX_VR\Mcraft\Mcraft.slnをリリースで実行ください(デバッグ実行の場合はDXLib_ref.slnをデバッグでリビルドください) drive.google.com/file/d/1uUqKSwMZwsGcHyRPTYnvCs-7RBYHI0zV/view?usp=sharing
メンテ

Page: 1 |

Re: FPSの固定化に関して ( No.1 )
名前:名無三 日時:2024/10/13 22:00

すいません、別件で質問です。 素のDrawPolygon3D系(DrawPolygon32bitIndexed3D等)でノーマルマップ、スペキュラマップを指定する方法はない(自前のシェーダーを用意する必要がある)認識でよろしいでしょうか?
メンテ
Re: FPSの固定化に関して ( No.2 )
名前:管理人 日時:2024/10/14 01:45

> こちら、ScreenFlip内で時間がかかる場合(シェーダーでSSRを追加した際や多量の頂点があるモデルを表示した際など)には前フレームでの待機がずれ込み、待機時間が不安定となるようです。 > 垂直同期を有効にした際には60Hzなら60FPSで安定するのですが、垂直同期を無効にした際の上記挙動を安定化させる方法はありますでしょうか? 件のスレッドのコードは垂直同期が有効である場合を前提とした処理となっていますので、垂直同期が無効な状態では単純に 『1フレーム分の処理を実行した後に、固定したいfpsの1フレーム分の時間が経過していなかったらその分の時間を待つ』 ↑このようにすれば良いのだと思いますが、如何でしょうか? > 参考に現状のプロジェクト共有となります。 アップしていただいたプログラムをデバッグ実行しようとしたのですが、Effekseerなどのファイルが含まれていないようで ビルドに失敗してしまいました > 素のDrawPolygon3D系(DrawPolygon32bitIndexed3D等)でノーマルマップ、スペキュラマップを指定する方法はない(自前のシェーダーを用意する必要がある)認識でよろしいでしょうか? はい、そちらの認識で合っています
メンテ
Re: FPSの固定化に関して ( No.3 )
名前:名無三 日時:2024/10/14 13:24

> 固定したいfpsの1フレーム分の時間が経過していなかったらその分の時間を待つ 確かにそうなのですが、ScreenFlipの段階で画面を更新している認識ですのでそこから待った場合画面の更新が一定間隔でなくなるように思われます(すいません、処理自体は一定間隔でしたね…)。 すいません、プロジェクトの方の設定を失念しておりました。 DXLib_ref.hの中の#define _USE_EFFEKSEER_をコメントアウトしてDXLib_refをビルドいただく→McraftをビルドいただくとEffekseerを無効化できます。 実行中はTabでポーズ→マウスでオプションをクリック→Graphicsタブをクリック→VSyncをオンオフで垂直同期の有無を切り替えられます > DrawPolygon3D ありがとうございます、承知しました
メンテ
Re: FPSの固定化に関して ( No.4 )
名前:管理人 日時:2024/10/16 00:34

> DXLib_ref.hの中の#define _USE_EFFEKSEER_をコメントアウトしてDXLib_refをビルドいただく→McraftをビルドいただくとEffekseerを無効化できます。 了解しました、ビルドして実行することができました ただ、私の PC はPCの設定の『システム』→『ディスプレイ』→『テキスト、アプリ、その他の項目のサイズを変更する』の項目を200%にしているのですが ( そうしないと目が悪い私では 4Kモニタに映る文字が小さすぎて見えないため ) その設定にしているとプログラム起動時の表示が画面の左上4分の1が2倍拡大されたような状態になってしまうようです 申し訳ありませんが『テキスト、アプリ、その他の項目のサイズを変更する』の項目がデフォルトの100%以外でも正常に表示されるようにしていただけないでしょうか? m(_ _;m
メンテ
Re: FPSの固定化に関して ( No.5 )
名前:名無三 日時:2024/10/16 20:43

申し訳ないです、レンダリングスケール実装の際にDPIを反映できなくなってしまっていました… 以下のもので上書きしてビルドいただくことでDPIに対応します(_USE_EFFEKSEER_が有効化しているので後から直します) drive.google.com/file/d/1gI9dt-OFY8TNuCh_bw30t_d1i5TOLPwp/view?usp=sharing
メンテ
Re: FPSの固定化に関して ( No.6 )
名前:管理人 日時:2024/10/16 21:31

アップしていただいた zip ファイルの中身で上書きしたところ、以下のようなコンパイルエラーが発生するようになってしまいました… 1>D:\Project\DX_VR\Mcraft\Project\source\CommonScene\UI\CommonUIControl.cpp(26,19): error C2065: 'INVALID_ID': 定義されていない識別子です。 1>D:\Project\DX_VR\Mcraft\Project\source\CommonScene\UI\CommonUIControl.cpp(36,19): error C2065: 'INVALID_ID': 定義されていない識別子です。 1>D:\Project\DX_VR\Mcraft\Project\source\CommonScene\UI\CommonUIControl.cpp(47,14): error C2065: 'INVALID_ID': 定義されていない識別子です。 1>D:\Project\DX_VR\Mcraft\Project\source\CommonScene\UI\CommonUIControl.cpp(57,19): error C2065: 'INVALID_ID': 定義されていない識別子です。 1>D:\Project\DX_VR\Mcraft\Project\source\MainScene\Object\Character_before.hpp(197,54): error C2065: 'Frame_Rate': 定義されていない識別子です。 1>(ソース ファイル 'source/MainScene/Object/Character.cpp' をコンパイルしています) 1>D:\Project\DX_VR\Mcraft\Project\source\MainScene\Object\Character_before.hpp(357,87): error C2065: 'Frame_Rate': 定義されていない識別子です。 1>(ソース ファイル 'source/MainScene/Object/Character.cpp' をコンパイルしています) 1>D:\Project\DX_VR\Mcraft\Project\source\MainScene\Object\Character_before.hpp(359,77): error C2065: 'Frame_Rate': 定義されていない識別子です。 1>(ソース ファイル 'source/MainScene/Object/Character.cpp' をコンパイルしています) 1>D:\Project\DX_VR\Mcraft\Project\source\MainScene\Object\Character_before.hpp(405,47): error C2065: 'Scale_Rate': 定義されていない識別子です。 1>(ソース ファイル 'source/MainScene/Object/Character.cpp' をコンパイルしています) 1>D:\Project\DX_VR\Mcraft\Project\source\MainScene\Object\Character_before.hpp(403,9): error C2660: 'DxLib::HitCheck_Sphere_Capsule': 関数に 4 個の引数を指定できません。 1>(ソース ファイル 'source/MainScene/Object/Character.cpp' をコンパイルしています) 1> M:\DxLib\Release\Library\TestPackage\DxLibVCTest\DxLib.h(4111,14): 1> 'DxLib::HitCheck_Sphere_Capsule' の宣言を確認してください 1> D:\Project\DX_VR\Mcraft\Project\source\MainScene\Object\Character_before.hpp(403,9): 1> 引数リスト '(DxLib::VECTOR, const float, DxLib::VECTOR, DxLib::VECTOR)' を一致させようとしているとき 1>D:\Project\DX_VR\Mcraft\Project\source\MainScene\BackGround\BackGround.hpp(13,38): error C2065: 'Scale_Rate': 定義されていない識別子です。 1>(ソース ファイル 'source/MainScene/Object/Character.cpp' をコンパイルしています) 1>D:\Project\DX_VR\Mcraft\Project\source\MainScene\BackGround\BackGround.hpp(13,26): error C2737: 'FPS_n2::BackGround::CellScale': constexpr オブジェクトを初期化する必要があります 1>(ソース ファイル 'source/MainScene/Object/Character.cpp' をコンパイルしています) 1>D:\Project\DX_VR\Mcraft\Project\source\MainScene\BackGround\BackGround.hpp(13,38): error C2065: 'Scale_Rate': 定義されていない識別子です。 1>(ソース ファイル 'source/MainScene/BackGround/BackGround.cpp' をコンパイルしています) 1>D:\Project\DX_VR\Mcraft\Project\source\MainScene\BackGround\BackGround.hpp(13,26): error C2737: 'FPS_n2::BackGround::CellScale': constexpr オブジェクトを初期化する必要があります (↑この後100行くらい続きます)
メンテ
Re: FPSの固定化に関して ( No.7 )
名前:名無三 日時:2024/10/16 22:17

すいません、命名修正などの更新後のものを上げてしまっておりました、プロジェクト自体を上げなおします。 Effekseerが含まれます drive.google.com/file/d/1Ua3JyduzGjwdYGFjpKxvfd-skCS0jmHd/view?usp=sharing
メンテ
Re: FPSの固定化に関して ( No.8 )
名前:管理人 日時:2024/10/18 00:46

ありがとうございます、プログラムを起動できました 動作は十分安定していると思うのですが、こちらは垂直同期を有効にされた状態でしょうか?
メンテ
Re: FPSの固定化に関して ( No.9 )
名前:名無三 日時:2024/10/18 08:28

確認ありがとうございます。そうですね、有効化設定となっております。 Tabでポーズ→マウスでオプションをクリック→Graphicsタブをクリック→VSyncをオンオフで垂直同期の有無を切り替えられます よくよく考えますと ・SetWaitVSyncFlag(FALSE)の場合ScreenFlipを行う時間が各フレームでバラバラなのでScreenFlip間の時間を計測しているGetFPS()が不定に ・GetFPS()をもとにフレーム補完を行っている自分のシステムではガクガクする という理屈のようです… 自前でFPS計測処理を追加すると安定するかもしれないのでそちら試してみます
メンテ
Re: FPSの固定化に関して ( No.10 )
名前:名無三 日時:2024/10/18 08:43

すいません、やはりループの初めで以下のようにしていた部分を m_FPS = std::max(GetFPS(), 30.f); m_StartTime = GetNowHiPerformanceCount(); 自前で計測するようにすると m_FPS = std::max((1000.f * 1000.f) / static_cast<float>(GetNowHiPerformanceCount() - m_StartTime), 30.f); m_StartTime = GetNowHiPerformanceCount(); 垂直同期を切った場合も挙動が安定します。 現状はこちらで行こうと思いますが、可能であればGetFPS()用の区間計測タイミングをProcessMessage()後などループ開始に行うであろう処理に移動するようにお願いできればと思います。
メンテ
Re: FPSの固定化に関して ( No.11 )
名前:管理人 日時:2024/10/18 23:08

動作が安定したようでなによりです > 可能であればGetFPS()用の区間計測タイミングをProcessMessage()後などループ開始に行うであろう処理に移動するようにお願いできればと思います。 すみません、ProcessMessage は1フレームに複数回呼ばれることもありますので、 現在の ScreenFlip 基準の計測から変更することは難しいです m(_ _;m
メンテ
Re: FPSの固定化に関して ( No.12 )
名前:名無三(解決) 日時:2024/10/19 11:38

ありがとうございます、承知しました。お手数をおかけしました…
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存