お世話になっております。
GetFPSについて、最初からリフレッシュレートと同値のFPSが出ているものとして処理をスタートさせることはできますでしょうか?
また、フレームレートに応じて加算、乗算に補正をかける関数の追加を提案します。
例:動作はしません
float correct_add(float p1) {
int ScreenFlipCount, StartTime, FrameTime;
ScreenFlip();
ScreenFlipCount = 0;
StartTime = GetNowCount();
while (true) {//サンプルでのリフレッシュレート取得そのまま
// 画面切り替えを行ってVYSNC待ちをする
ScreenFlip();
// 1秒経過していたらループから抜ける
if (GetNowCount() - StartTime >= 1000)
break;
// ScreenFlip を行った回数をインクリメント
ScreenFlipCount++;
}
return p1 * ScreenFlipCount /GetFPS() ;
}
float correct_mult(float p1) {
int ScreenFlipCount, StartTime, FrameTime;
ScreenFlip();
ScreenFlipCount = 0;
StartTime = GetNowCount();
while (true) { //サンプルでのリフレッシュレート取得そのまま
// 画面切り替えを行ってVYSNC待ちをする
ScreenFlip();
// 1秒経過していたらループから抜ける
if (GetNowCount() - StartTime >= 1000)
break;
// ScreenFlip を行った回数をインクリメント
ScreenFlipCount++;
}
return pow(p1, ScreenFlipCount / GetFPS());
}
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
float x=0,y=1.f;
while (ProcessMessage() == 0) {
x+=correct_add(10.0f); // 60fpsのとき10ピクセル動かすように加算値を補正する
y*=correct_mult(0.9f); // 60fpsのとき0.9ずつ乗算するようにy値を補正する
SetDrawScreen(DX_SCREEN_BACK);
ClearDrawScreen();
DrawString(int(x), int(y), "hello", GetColor(255, 255, 255));
Screen_Flip();
if (CheckHitKey(KEY_INPUT_ESCAPE) != 0)
break;
}
}