0

最近,我的团队开始注意到我们当前的 C++ 构建器项目在不同的计算机上奇怪地运行的问题。我们已将其范围缩小到我们正在运行应用程序并将其GlobalUseGPUCanvas设置为的事实true。据我了解,这意味着 firemonkey 将使用 GPU 来渲染画布。我们注意到有问题的机器是那些集成显卡功能较弱的机器。因此,我希望编写一些逻辑,这些逻辑只会使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();
    }

这是一个不错的开始,因为我可以检查计算机的显卡,看看它们是否有足够的内存来运行显卡上的程序。但是,我不确定如何处理机器可能具有非常好的专用显卡但可以启用内部显卡的情况。例如,我可以看到功能强大的专用卡并认为它们有足够的内存,但如果它们出于某种原因运行了功能较弱的集成显卡,我可能会弄错。

无论如何,是否能够分辨出我正在枚举的这些显卡中的哪一个是活动图形设备?

4

1 回答 1

1

我在具有内部和专用显卡的机器上测试了您的程序。EnumAdapters仅返回活动图形卡。

如果有多个适配器处于活动状态,例如因为它是多监视器系统,则EnumAdapters可能会返回更多结果。然后你必须决定,但MSDN 有一个提示给你

EnumAdapters 首先返回带有显示桌面主输出的适配器。

于 2015-08-26T07:19:41.930 回答