0

私は 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()です。

ありがとうございました!

4

2 に答える 2

0

私自身はこれに気づいていませんでしたが、あなたはすでに正しいと推測しました。多くの (すべて?) ラップトップは、バッテリーで実行するとリフレッシュ レートが低下します。googleを参照してください。また、vsync の実行が遅くなると、ループも遅くなります。ハードウェアによっては、これを無効にする解決策があるようです (例: Intelの場合)。

于 2015-04-14T12:38:24.477 に答える
0

少し遅れましたが、あなたの問題は私が思うコードとは何の関係もありません。nvidia ビデオ カードを搭載した多くのラップトップには、「バッテリー ブースト」と呼ばれるシステムがあります。有効にすると、スライダーを fps カウントにドラッグできます。バッテリーを充電すると、ゲームは 60 fps に vsync されます。充電していない場合、ゲームはスライダーで示される fps に vsync されます。ここに画像の説明を入力

右上のトグルを使用して、この機能を無効にすることができます。このメニューは、nvidia エクスペリエンス プログラム -> 設定 -> ゲームにあります。

于 2017-02-11T15:21:08.033 に答える