私は Direct2D を初めて使用し、最近奇妙な問題を発見しました。外部電源が接続されている場合、私のプログラムは 60 の安定した FPS で実行されます。これは VSync の結果である可能性があります。しかし、しばらく外部電源を抜いた後、私のプログラムは 30 の安定した FPS に落ちました (2 回のレンダリングごとに時間間隔を出力したところ、32ms と表示されました)。
また、電源を再度接続しても、コンピューターを再起動するまで 30 FPS のままです。
FPS を半分に削減するバッテリーで電力を供給しているときに、ラップトップが何かをシャットダウンしたためでしょうか? もし本当なら、私はそれのために何ができますか?
私のラップトップのOSはWindows 8.1です。
役に立つかもしれないいくつかのコードを次に示します。
HRESULT hr = S_OK;
if (!m_pRenderTarget)
{
RECT rc;
GetClientRect(m_hwnd, &rc);
D2D1_SIZE_U size = D2D1::SizeU(rc.right - rc.left, rc.bottom - rc.top);
D2D1_HWND_RENDER_TARGET_PROPERTIES render_target_properties = D2D1::HwndRenderTargetProperties(m_hwnd, size);
//render_target_properties.presentOptions = D2D1_PRESENT_OPTIONS_IMMEDIATELY;
//↑ Tried this and it doesn't work, don't know why
// Create a Direct2D render target.
hr = m_pDirect2dFactory->CreateHwndRenderTarget(
D2D1::RenderTargetProperties(),
render_target_properties,
&m_pRenderTarget
);
}
return hr;
メインループは次のようになります。
while(msg.message!=WM_QUIT)
{
if(PeekMessage(&msg,0,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
now_time = timeGetTime();
if(now_time - last_time >= 1000/MAX_FPS)
{
OutputDebugPrintf("%lf\n", now_time - last_time);
application->Update(now_time - last_time);
application->OnRender();
last_time = now_time;
}
}
確かに時間Update()もかからないし、安定したフレームレート60で走れるので問題なさそうOnRender()です。
ありがとうございました!
