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;
}