Недавно моя команда начала замечать проблемы с нашим текущим проектом C ++ builder, который странным образом работает на разных компьютерах. Мы сузили это до того факта, что мы запускаем приложение с GlobalUseGPUCanvas
установлен в true
, Насколько я понимаю, это означает, что firemonkey будет использовать графический процессор для рендеринга холста. Мы заметили, что машины, имеющие проблемы, были с менее мощными встроенными видеокартами. Поэтому я хочу написать некоторую логику, которая позволит GlobalUseGPUCanvas
У пользователя достаточно мощная видеокарта.
Чтобы начать это, я написал следующий код, который я основал на эта статья MSDN. Это позволяет мне просматривать все видеокарты на машине и видеть, сколько у них памяти.
IDXGIFactory * pFactory = NULL;
CreateDXGIFactory(__uuidof(IDXGIFactory) ,(void**)&pFactory);
IDXGIAdapter * pAdapter;
DXGI_ADAPTER_DESC * adapterDesc;
for (UINT i = 0; pFactory->EnumAdapters(i, &pAdapter) != DXGI_ERROR_NOT_FOUND; ++i)
{
pAdapter->GetDesc(adapterDesc);
long vidMemory = adapterDesc->DedicatedVideoMemory;
long sMemory = adapterDesc->SharedSystemMemory;
}
if( pFactory )
{
pFactory->Release();
}
Это хорошее начало, потому что я могу проверить видеокарты компьютеров, чтобы увидеть, достаточно ли у них памяти для запуска программы на видеокарте. Однако я не уверен, как справиться со сценарием, когда на компьютере может быть действительно хорошая выделенная видеокарта, но вместо этого может быть включена внутренняя графика. Например, я мог видеть мощную выделенную карту и думать, что у них достаточно памяти, но если бы по какой-то причине у них не было более мощной интегрированной графики, я мог бы ошибаться.
Можно ли как-то определить, какая из перечисленных графических карт является активным графическим устройством?
Я протестировал вашу программу на машине с внутренней и выделенной видеокартой. EnumAdapters
возвращает только активную видеокарту.
Если активен более одного адаптера, например, потому что это система с несколькими мониторами, EnumAdapters
может вернуть больше результатов. Тогда вы должны решить, но MSDN есть подсказка для вас:
EnumAdapters сначала возвращает адаптер с выводом, на котором
основной рабочий стол отображается.