【问题标题】:Why Direct2D only runs at an FPS of 30 after unplugging the external power supply of my laptop?为什么 Direct2D 在拔下笔记本电脑的外部电源后只能以 30 FPS 运行?
【发布时间】:2015-04-13 13:57:46
【问题描述】:

我是 Direct2D 的新手,最近发现了一个奇怪的问题。插入外部电源后,我的程序以 60 的稳定 FPS 运行,我知道这可能是 VSync 的结果;但是在拔掉外部电源一段时间后,我的程序下降到稳定的 FPS 30(我输出了每两次渲染之间的时间间隔,显示为 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()似乎没有问题。

谢谢!

【问题讨论】:

  • 某种节电功能?!
  • 是的,它一定是某种省电功能,因为它在使用交流电源时效果很好......

标签: frame-rate direct2d vsync


【解决方案1】:

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

【讨论】:

  • 谢谢你的回复,但是32ms是不是刷新间隔太长了?使用电池时我没有看到屏幕闪烁,尽管我的应用程序明显闪烁。我不知道这种现象。
  • 我尝试运行另一个游戏(Osu!),它表明它可以在相同条件下关闭垂直同步以 120FPS 运行,所以我认为禁用垂直同步可能是一个解决方案。我尝试使用render_target_properties.presentOptions = D2D1_PRESENT_OPTIONS_IMMEDIATELY;,但它不起作用。你对此有什么想法吗?谢谢!
  • PAL 电视每 40 毫秒刷新一次(每帧 20 次,但我们不要进入讨论),所以不,它不会太长。如果您的显示器不显示它们,那么计算 120 fps 是没有意义的。
【解决方案2】:

有点晚了,但你的问题与我认为的代码无关。许多带有 nvidia 显卡的笔记本电脑都有一个名为“Battery Boost”的系统。启用后,您可以将滑块拖动到 fps 计数。为电池充电时,游戏会以 60 fps 的速度进行垂直同步。不充电时,游戏会垂直同步到滑块指示的 fps:

使用右上角的切换按钮,您可以禁用此功能。 这个菜单可以在nvidia体验程序->设置->游戏中找到。

【讨论】:

  • 感谢您的回答,希望能给遇到同样问题的人提供参考。不过我不再为这个游戏工作了……
猜你喜欢
  • 2022-07-09
  • 2018-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-18
相关资源
最近更新 更多