【发布时间】:2015-08-20 17:50:49
【问题描述】:
最近,我的团队开始注意到我们当前的 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();
}
这是一个不错的开始,因为我可以检查计算机的显卡,看看它们是否有足够的内存来运行显卡上的程序。但是,我不确定如何处理机器可能具有非常好的专用图形卡但可以启用内部图形的情况。例如,我可以看到功能强大的专用卡并认为它们有足够的内存,但如果它们出于某种原因运行了功能较弱的集成显卡,我可能会弄错。
有没有办法知道我正在枚举的这些显卡中的哪一个是活动的图形设备?
【问题讨论】:
-
如何在您的应用程序的 INI 文件中手动设置,这样如果 GlobalUseGPUCanvas = true 不起作用,用户可以设置不同的设置?
-
@DougRudd 这绝对是个好主意,我们已经考虑过。但是,如果可能的话,我们希望在幕后实现这一点,而无需用户做任何事情。
标签: c++ directx firemonkey c++builder-xe8