为什么Direct2D在拔掉笔记本电脑的外部电源后才能以30的FPS运行?

时间:2015-04-13 13:57:46

标签: frame-rate direct2d vsync

我是Direct2D的新手,最近我发现了一个奇怪的问题。当插入外部电源时,我的程序以60的稳定FPS运行,我知道这可能是VSync的结果;但拔掉外部电源一段时间后,我的程序降到30的稳定FPS(我输出每两次渲染之间的时间间隔,显示32ms)。

即使我再次插上电源,它仍然保持在30 FPS,直到重新启动计算机。

是不是因为我的笔记本电脑在用电池供电时关闭了一些东西,将FPS降低了一半?如果是真的,我能为它做些什么?

我的笔记本电脑的操作系统是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()似乎没有任何问题。

谢谢!

2 个答案:

答案 0 :(得分:0)

我自己并没有意识到这一点,但你已经猜对了:许多(所有?)笔记本电脑在使用电池时都会降低刷新率。见google。如果vsync运行速度较慢,那么循环也是如此。似乎有解决方案可以禁用此功能,具体取决于您的硬件(例如Intel)。

答案 1 :(得分:0)

迟到但你的问题与我认为的代码无关。许多带有nvidia显卡的笔记本电脑都有一个名为“Battery Boost”的系统。启用后,您可以将滑块拖动到fps计数。为电池充电时,游戏的速度提升至60 fps。当没有充电时,游戏会被滑动到滑块指示的fps:enter image description here

使用右上角切换可以禁用此功能。 此菜单可在nvidia体验计划中找到 - >设置 - >游戏。