c++ - 在 firemonkey 中评估 Canvas 渲染的视频卡性能

标签 c++ directx firemonkey c++builder-xe8

最近,我的团队开始注意到我们当前的 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 仅返回事件显卡。

如果多个适配器处于事件状态,例如因为它是一个多监视器系统,EnumAdapters 可能会返回更多结果。然后你必须决定,但是MSDN has a Hint for you :

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

关于c++ - 在 firemonkey 中评估 Canvas 渲染的视频卡性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32125036/

相关文章:

c++ - 从 'const QVector<QVector<qreal>>' 转换为 'QVector<QVector<qreal>>'

PHP 析构函数和与 C++ 析构函数的关系?

delphi - Firemonkey IFMXLoggingService Windows 事件日志位置

c++ - 跨平台窗口库——集成 OpenGL 和 DirectX

delphi - 如何检测 TTreeViewItem 节点何时在 TTreeView 内展开?

android - 如何使用 Delphi 在 Android 平台上将 String 转换为 PWideChar

c++ - 如何通过 C++ 从数字列表中生成 3 位数字?

c++ - 根据参数值进行检测

c++ - DirectX 屏幕截图不起作用?

c++ - 将 mem_fun_ref 与 boost::shared_ptr 一起使用