トップページ > 記事閲覧
DxLibを用いた時の最高フレームレートについて
名前:本棚 日時: 2014/03/15 12:57

DxLibを用いてキー入力を可視化する簡単なプログラムを作成してみました。 そこで、ループの速さ(fpsとする)を計測したところ、WaitTimer無しで50fpsしかでませんでした。 DxLib以外で負荷のかかる処理はしていません。(プロファイラを使って確認しました。) 1ループでScreenFlipがほとんどの実行時間を占めていました。 fpsを上げる方法はないのでしょうか。 それともこれがDxLibの限界なのでしょうか。 よろしくお願いします。 スパゲッティーソースですいません。 #include "DxLib.h" #include <iostream> #include <vector> #include <list> #include <string> #include <sstream> #include <chrono> using namespace std; using namespace chrono; char keyBuf[256]; list<wstring> errorbuf; double framerate=60.0; auto nowtime=steady_clock::now(); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { ChangeWindowMode(TRUE); SetMainWindowText(L"Hierophant"); SetDrawScreen(DX_SCREEN_BACK); if(DxLib_Init() == -1) { return -1; } while(ProcessMessage()==0) { GetHitKeyStateAll(keyBuf); {//keyBufを出力形式に変換 wstring erroradder; for(int i=0; i<sizeof(keyBuf); i++){ char& flag=keyBuf[i]; wchar_t str[10]; swprintf_s(str,L"%d ",i); if(flag==1)erroradder+=str; } if(erroradder.size()!=0) errorbuf.push_front(erroradder); if(errorbuf.size()>30)errorbuf.pop_back(); } ClearDrawScreen(); {//入力キーの表示 auto it(errorbuf.begin()); for(int i=0; it!=errorbuf.end(); i++, it++) DrawString(0, i*14, it->c_str(), GetColor(127, 127, 127)); } {//frame rate 計算 auto newtime=chrono::steady_clock::now(); auto elapsed_time=chrono::duration_cast<microseconds>(newtime-nowtime); nowtime=newtime; auto newframerate=1000000.0/elapsed_time.count(); framerate=newframerate*0.1+framerate*0.9; wstringstream ss; ss<<framerate<<"fps"; DrawString(100, 0, ss.str().c_str(), GetColor(127, 127, 127)); } ScreenFlip(); //WaitTimer(12); } DxLib_End(); return 0; }
メンテ

Page: 1 |

Re: DxLibを用いた時の最高フレームレートについて ( No.1 )
名前:softya(ソフト屋) 日時:2014/03/15 13:52

SetWaitVSyncFlag(FALSE)でモニタとの同期を切れば早くなるとは思います。ただ、モニタの限界を超えても画面にはちゃんと反映されませんので意味があるかどうかは使い方次第です。
メンテ
Re: DxLibを用いた時の最高フレームレートについて ( No.2 )
名前:本棚(追加質問) 日時:2014/03/15 15:26

softya(ソフト屋)さんありがとうございます。 モニタのフレッシュレートを調べてみたら60でしたので、同期を切らないでfpsが60に行ってほしい所です。 いろいろ条件を変えて実験してみました。 1.DxLib_Init前にSetWaitVSyncFlag(FALSE)を追加 2.ScreenFlip後にWaitVSync(1)を追加 3.モニタのフレッシュレートを40に設定 4.モニタのフレッシュレートを60に設定 観測されるfpsは以下のようになりました。 条件 123 39で安定 124 59~60で安定 3 30付近で推移 4 48~52付近で推移 結果として、WaitVSyncFlagを真としてScreenFlipを実行する方が、WaitVSyncFlagを偽としてScreenFlipしてからWaitVSync(1)を実行するより垂直同期に間に合わない回数が多いと思われます。 ScreenFlipを安定して使う方法はないのでしょうか。
メンテ
Re: DxLibを用いた時の最高フレームレートについて ( No.3 )
名前:稲塚 日時:2014/03/15 15:38

裏画面が使用されていないので正常な結果が計測できていないのでは? SetDrawScreen(DX_SCREEN_BACK)をDxLib_Init()の後に記述してみてください
メンテ
Re: DxLibを用いた時の最高フレームレートについて ( No.4 )
名前:本棚(解決済) 日時:2014/03/15 16:48

稲塚さんありがとうございます。 SetDrawScreen(DX_SCREEN_BACK)の位置を正しくして実験を行った結果、 以下のように想定した動作になりました。 条件 123 39で安定 124 59~60で安定 3 39で安定 4 59~60で安定 裏画面の設定が上手くいっていないことが原因でした。 ありがとうございます。
メンテ

Page: 1 |

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

   クッキー保存