【问题标题】:UWP GetAsyncKeyState() from a separate thread来自单独线程的 UWP GetAsyncKeyState()
【发布时间】:2017-07-23 08:34:11
【问题描述】:

我在 vs2015 中使用“DirectX 11 and XAML App (Universal Window)”模板。我想在每一帧中获取用户的击键。所以我尝试将 GetAsyncKeyState() 放在渲染循环中。渲染循环在单独的线程中运行:

auto workItemHandler = ref new WorkItemHandler([this](IAsyncAction ^ action)
{
    // Calculate the updated frame and render once per vertical blanking interval.
    while (action->Status == AsyncStatus::Started)
    {
        critical_section::scoped_lock lock(m_criticalSection);
        Update();
        m_sceneRenderer->OnKeyDown();
        if (Render())
        {
            m_deviceResources->Present();
        }
    }
});

// Run task on a dedicated high priority background thread.
m_renderLoopWorker = ThreadPool::RunAsync(workItemHandler, WorkItemPriority::High, WorkItemOptions::TimeSliced);

m_sceneRenderer->OnKeyDown() 是我放置 GetAsyncKeyState() 的地方。但是每当我将 m_sceneRenderer->OnKeyDown() 放入 while 循环时,所有 DirectX 内容都不会被渲染。此外,当我关闭应用程序时,m_renderLoopWorker 将为 nullptr 并引发异常。

// Sample3DSceneRenderer.h, truncated
namespace UWP_DX11_XAML_
{
    class Sample3DSceneRenderer
    {
        Sample3DSceneRenderer(Windows::UI::Core::CoreWindow^ window);
        void OnKeyDown();
        Platform::Agile<Windows::UI::Core::CoreWindow^> m_window;
    }
}

// Sample3DSceneRenderer.cpp, truncated
UWP_DX11_XAML_::Sample3DSceneRenderer::Sample3DSceneRenderer(
        Windows::UI::Core::CoreWindow^ window):
m_window(window)
{
}

void UWP_DX11_XAML_::Sample3DSceneRenderer::OnKeyDown()
{
     m_window.Get()->GetAsyncKeyState(Windows::System::VirtualKey::Control);
}

调用 m_window 的其他成员函数可能会导致同样的问题。

【问题讨论】:

    标签: c++ multithreading uwp uwp-xaml


    【解决方案1】:

    您可能希望使用 CreateCoreIndependentInputSource(CoreInputDeviceTypes::Mouse | CoreInputDeviceTypes::Touch | CoreInputDeviceTypes::Pen); 设置一个专用输入线程;

    这里有一个示例演示了这个选项:https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/LowLatencyInput

    我还发现了这些类似的文章,它们讨论了针对低输入延迟进行优化。

    https://docs.microsoft.com/en-us/windows/uwp/gaming/optimize-performance-for-windows-store-direct3d-11-apps-with-coredispatcher

    https://blogs.windows.com/buildingapps/2013/12/18/optimizing-directx-apps-for-low-latency-input-and-longer-battery-life/#JPGhHjXExbySmTf7.97

    【讨论】:

    • CreateCoreIndependentInputSource() 看起来不像处理键盘事件,只是笔/触摸/鼠标。可以做键盘吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-22
    相关资源
    最近更新 更多