最近,我的团队开始注意到我们当前的C ++构建器项目在不同计算机上奇怪地运行的问题。我们将范围缩小到以下事实:我们正在运行GlobalUseGPUCanvas设置为true的应用程序。据我所知,这意味着firemonkey将使用GPU渲染画布。我们注意到出现问题的机器是那些集成显卡不那么强大的机器。因此,我希望编写一些仅在用户具有足够强大的图形卡的情况下才启用GlobalUseGPUCanvas的逻辑。

首先,我编写了以下代码,这些代码主要基于this MSDN article。这使我可以遍历计算机上的所有视频卡,并查看它们有多少内存。

    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 has a Hint for you


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

09-06 12:29