Почему Direct2D работает со скоростью 30 кадров в секунду после отключения внешнего источника питания моего ноутбука?

Я новичок в Direct2D, и недавно я обнаружил странную проблему. Когда внешний источник питания подключен, моя программа работает на постоянной частоте 60 кадров в секунду, что, я знаю, может быть результатом VSync; но после отключения внешнего источника питания некоторое время моя программа падает до стабильного FPS 30 (я вычислил интервал времени между каждыми двумя рендерингами, и он показывает 32 мс).

И даже если я снова подключу блок питания, он останется на 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 ответа

Я сам не знал об этом, но вы уже догадались, что многие (все?) Ноутбуки сбрасывают частоту обновления при работе от батареи. Смотрите гугл. И если vsync работает медленнее, то и ваш цикл. Похоже, есть решения для отключения этого, в зависимости от вашего оборудования (например, для Intel).

Немного поздно, но ваша проблема не имеет ничего общего с кодом, я думаю. Многие ноутбуки с видеокартой nvidia имеют систему под названием Battery Boost. Когда включено, вы можете перетащить ползунок на счетчик кадров в секунду. При зарядке батареи игры разгоняются до 60 кадров в секунду. Когда игры не заряжаются, все они синхронизируются с частотой кадров, указанной ползунком:

С верхним правым переключателем вы можете отключить эту функцию. Это меню можно найти в программе опыта nvidia -> настройки -> игры.

Другие вопросы по тегам