1920x1080, 60Hzのモニタにフルスクリーンで描画をすると、インターレース表示のようなちらつきが生じます。(縦方向にブレているといった印象です)
いわゆる裏画面描画はきちんと実装できている筈で、事実、同様のソースでChangeWindowMode(true)を実行すると綺麗に描画されるのですが…
SetGraphModeの解像度を大きくする程、ちらつきも激しくなるように見えます。
なにか、原因はあるのでしょうか?それとも、こちらの環境下のみの現象なのでしょうか?
拙いコードかとは思いますが、なにかマズそうな実装がありましたら、教えていただけませんでしょうか。
ちなみに、dixq様のサイトよりfps固定の処理を引っ張ってきています。
//main.cpp
#include "DxLib.h"
#include "data_sys.hpp"
#include "mngr_fps.hpp"
#include "mngr_input.hpp"
int WINAPI WinMain(_In_ HINSTANCE hInsatnce, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nCmdShow)
{
SetOutApplicationLogValidFlag(false);
SetFullScreenResolutionMode(DX_FSRESOLUTIONMODE_DESKTOP);
SetFullScreenScalingMode(DX_FSSCALINGMODE_NEAREST);
SetFullSceneAntiAliasingMode(0, 0);
SetWaitVSyncFlag(false);
SetMainWindowText("DxLib");
SetWindowSizeChangeEnableFlag(false);
SetWindowSizeExtendRate(1.0);
SetAlwaysRunFlag(true);
SetMouseDispFlag(true);
ChangeWindowMode(true);
SetGraphMode(1920, 1080, 32);
if (DxLib_Init() == -1)
{
return -1;
}
SetDrawScreen(DX_SCREEN_BACK);
class Fps fps;
class Keyboard key;
class Mouse mouse;
class Joypad joy;
while (1)
{
if (ProcessMessage() != 0)
{
break;
}
ClearDrawScreen();
fps.Avg();
key.Update();
mouse.Update();
joy.Update();
fps.Draw();
//ここに処理を書く
ScreenFlip();
fps.Wait();
}
DxLib_End();
return 0;
}
//mngr_fps.hpp
#pragma once
//fpsの管理
class Fps
{
private:
int timeStart; //fps算出開始時の時間
unsigned char countFlip; //再描画された回数
double timeFps; //算出されたfps
public:
Fps();
void Avg(); //fpsの平均を算出
void Draw(); //fpsを描画(暫定)
void Wait(); //指定したfpsになるよう処理を待機
};
//mngr_fps.cpp
#include "DxLib.h"
#include "data_sys.hpp"
#include "mngr_fps.hpp"
Fps::Fps()
{
timeStart = 0;
countFlip = 0;
timeFps = 0;
}
void Fps::Avg()
{
if (countFlip == 0)
{
timeStart = GetNowCount();
}
if (countFlip == CONST_FPS_VALUE)
{
int a = GetNowCount();
timeFps = 1000.f / ((a - timeStart) / CONST_FPS_VALUE);
timeStart = a;
countFlip = 0;
}
countFlip++;
}
void Fps::Draw()
{
DrawFormatString(0, 0, GetColor(255, 255, 255), "%.1f", timeFps);
}
void Fps::Wait()
{
int a = countFlip * 1000 / static_cast<int>(CONST_FPS_VALUE) - (GetNowCount() - timeStart);
if (a > 0)
{
Sleep(a);
}
}