Я использую шаблон «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 может вызвать ту же проблему.
Вы можете настроить выделенный поток ввода, используя CreateCoreIndependentInputSource (CoreInputDeviceTypes :: Mouse | CoreInputDeviceTypes :: Touch | CoreInputDeviceTypes :: Pen);
Вот пример, который демонстрирует эту опцию: https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/LowLatencyInput
Я также нашел подобные статьи, в которых обсуждается оптимизация при низкой задержке ввода.
Других решений пока нет …