UWP GetAsyncKeyState () из отдельного потока

Я использую шаблон «DirectX 11 и приложение XAML (универсальное окно)» в vs2015. Я хочу, чтобы пользователь нажимал клавиши в каждом кадре. Поэтому я попытался поместить 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 может вызвать ту же проблему.

0

Решение

Вы можете настроить выделенный поток ввода, используя 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

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]