#amazon-web-services #winapi #amazon-ec2 #directx #direct3d
#amazon-web-services #winapi #amazon-ec2 #directx #direct3d
Вопрос:
Я написал приложение, которое запускает приложения Unity на экземпляре AWS Ec2, для правильного отображения которого требуется аппаратное ускорение. Это приложение запуска выполняет предварительную проверку работоспособности, чтобы убедиться, что устройство HAL (аппаратное ускорение) присутствует при вызовах Direct3D, таких как
D3DDISPLAYMODE mode;
HRESULT hr;
if (FAILED (hr = s_D3D->GetAdapterDisplayMode (g_D3DAdapter, amp;mode)))
{
return false;
}
if(FAILED (hr = s_D3D->CheckDeviceType (g_D3DAdapter, D3DDEVTYPE_HAL, mode.Format, mode.Format, TRUE)))
{
/// This fails.
return false;
}
Проверка работоспособности завершается успешно, когда я запускаю приложение запуска с удаленного рабочего стола, как и ожидалось. Но при запуске приложения при загрузке происходит сбой.
Если я удалю проверки работоспособности, приложение Unity правильно загрузится при загрузке, но некоторые элементы / шейдеры, которым требуется аппаратное ускорение, не отображаются должным образом.
Я использую экземпляр AWS EC2 G4 с Windows10 и видеокартой NVIDIA Tesla T4. У меня также установлены последние версии драйверов (Nvidia и Directx).
Для дополнительной отладки я попытался распечатать несколько журналов отладки, чтобы узнать, был ли обнаружен графический драйвер, и приложение, похоже, его находит.
D3DADAPTER_IDENTIFIER9 adapter_info;
hr = s_D3D->GetAdapterIdentifier (g_D3DAdapter, 0, amp;adapter_info);
std::cout << "Device Name: " << adapter_info.DeviceName << std::endl;
std::cout << "Device Id: " << std::to_string (adapter_info.DeviceId) << std::endl;
std::cout << "Device Desc: " << adapter_info.Description << std::endl;
std::cout << "Device Driver: " << adapter_info.Driver << std::endl;
Если вам интересно, как я запускаю процесс приложения при загрузке, я использую функцию UserDataScripts AWS. С помощью сценариев пользовательских данных я удостоверяюсь, что процесс приложения запущен с правами администратора и под правильным сеансом Windows. Ниже приведена ссылка, в которой рассказывается о подходе, который я использую.
https://www.codeproject.com/Articles/35773/Subverting-Vista-UAC-in-Both-32-and-64-bit-Archite
Я не нашел ничего близкого по этой теме из поисковых запросов, которые я сделал до сих пор.
Комментарии:
1. Устаревший Direct3D 9 не может получить доступ к устройствам HAL в «безголовом» режиме из-за изоляции сеанса 0. Однако Direct3D9Ex, Direct3D 11 и т. Д. Должны Иметь возможность находить устройства HAL.
2. Спасибо за ответ. Я удостоверяюсь, что игра Unity запущена на сеансе 1, означает ли это, что Direct3D 9 имеет проблемы с доступом к устройствам HAL в безголовом режиме независимо от сеанса?
3. Устаревший Direct3D 9 рассматривает все «безголовые сценарии» как ПОТЕРЯННОЕ УСТРОЙСТВО. Вы должны использовать более новые API с поддержкой DXGI, такие как Direct3D9Ex, Direct3D11 и т.д. для фактического доступа к HAL из сценария без заголовка (т. Е. Без входа в систему), и он должен быть Windows 8 или более поздней версии.