在 firemonkey 中评估 canvas 渲染的显卡性能

Assessing video card performance for canvas rendering in firemonkey

最近,我的团队开始注意到我们当前的 C++ 生成器项目 运行 在不同的计算机上奇怪地出现问题。我们已将范围缩小到我们 运行 将应用程序 GlobalUseGPUCanvas 设置为 true 的事实。就我的理解而言,这意味着 firemonkey 将使用 GPU 来渲染 canvas。我们注意到出现问题的机器是那些集成显卡功能较弱的机器。因此,我希望编写一些仅启用 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 return仅活动显卡。

如果多个适配器处于活动状态,例如因为它是一个多显示器系统,EnumAdapters可能 return 更多结果。然后你必须决定,但是 MSDN has a Hint for you:

EnumAdapters first returns the adapter with the output on which the desktop primary is displayed.