【问题标题】:Win32: How to determine if DirectDraw is enabled?Win32:如何判断 DirectDraw 是否开启?
【发布时间】:2010-05-28 17:00:27
【问题描述】:

当在 GDIPlus 中使用 CachedBitmaps 时,如果 Windows 视频“硬件加速”降低太多会导致图形损坏 - 以至于 DirectDraw 被禁用:

有六个级别的硬件加速:

  • 禁用所有加速
  • 禁用除基本加速之外的所有加速。 (服务器机器上的默认设置)
  • 禁用所有 DirectDraw 和 Direct3D 加速,以及所有光标和高级加速
  • 禁用所有光标和高级绘图加速
  • 禁用光标和位图加速
  • 启用所有加速(台式机机器上的默认设置)

如果 DirectDraw 被禁用,那么在 GDI+ 中使用 DrawCachedBitmap 将导致图形损坏。如果 DirectDraw 未启用,我很容易使用较慢的 DrawImage() API - 但我必须能够检测 DirectDraw 已禁用。

如何以编程方式检查是否启用了 DirectDraw


问题是:dxdiag 是如何做到的:

另见

KB191660 - DirectDraw or Direct3D option is unavailable (archive)

【问题讨论】:

  • 好问题。我在 GetSystemMetrics、SystemParametersInfo 或(不存在的?)DirectDraw 参考资料中一无所获。如您所知,DirectDraw 已被弃用。
  • 我实际上并没有使用 DirectDraw,所以如果它被禁用我不受影响。另一方面,我不能规定 GDIPlus 使用什么底层技术。我说“Direct Draw”的唯一原因是因为第一个导致问题的滑块选项提到了“DirectDraw 和 Direct3D”,我假设 GDI+ 没有使用 Direct3D - 离开 DirectDraw。
  • @Andreas Rejbrand:我明白你对 DirectDraw 文档的意思——就好像 DirectDraw 从未存在于桌面上一样。 :\
  • 它不会强制,除非它只会奖励赏金(并且只奖励有 2 个或更多赞成票的答案)。否决我们所有的答案是相当蹩脚的。我们正在努力为您提供帮助,我们提供的任何信息都不是“没有帮助”的。祝你好运。

标签: winapi gdi+ directdraw


【解决方案1】:

如果你下载最新的DirectX SDK(我相信旧的sdk也有类似的例子)有一个查询DXDIAG信息的例子。

示例位于 (SDK Root)\Samples\C++\Misc\DxDiagReport

在dxdiaginfo.cpp方法中注意

CDxDiagInfo::CDxDiagInfo
CDxDiagInfo::Init
CDxDiagInfo::QueryDxDiagViaDll    
CDxDiagInfo::GetDisplayInfo

如果你运行程序,它会输出一个巨大的值列表。我想你感兴趣的值是pDisplayInfo->m_szDDStatusEnglish

【讨论】:

  • 不幸的是,CLSID_DxDiagProvider 所需的类在 Windows 2000 上不可用。 IID_IDxDiagProvider 收集信息的速度非常慢 - 不适合生产代码。
  • DXDIAG 也不会立即启动。如果你想记录在案,你就明白了。 (如果你想支持 Windows 2000,你应该使用上面的 DDraw 方法,因为 Win2K 的 DX 支持限制在一个肯定有 DDraw 作为它的一部分。如果不存在 DXDIAG 支持,可能还是试试吧, DDraw 还会存在一段时间。)
  • 嗯,GDI+ 还是对 ddraw 有依赖,这是 WinForms 的基础。
【解决方案2】:

您可以检查注册表中的加速度滑块值。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Video\{'some hex string'}\0000\Acceleration.Level

您可能需要遍历Video 中的所有文件夹,因为通常有多个条目。

Acceleration.Level 值

  • 5 禁用所有加速
  • 4 禁用除基本加速之外的所有加速。 (服务器机器上的默认值)
  • 3 禁用所有 DirectDraw 和 Direct3D 加速,以及所有光标和高级加速
  • 2 禁用所有光标和高级绘图加速
  • 1 禁用光标和位图加速
  • 0 启用所有加速(台式机上的默认设置)

更新:

这是一个关于以编程方式更改/检查加速级别的旧线程。 http://www.autoitscript.com/forum/topic/61185-hardware-acceleration/

【讨论】:

  • 我想一个真正的答案必须解决滑块的作用。一个完整的滑块并不意味着 DirectDraw 的启用。并且至少一直不意味着 DirectDraw 必须被禁用。
  • Windows 7,没有滑块。
  • @Ian Boyd:没有滑块,因为您的显示驱动程序正在覆盖它。注册表值仍然准确。我在 Windows 7 上为您提供了此信息测试。
【解决方案3】:

您可以查询IDirectDraw interface 并查看它的作用。我假设如果关闭硬件加速它会失败,但你可能想测试 GetCaps() 或 TestCooperativeLevel()。

LPDIRECTDRAW lpdd7 = NULL; // DirectDraw 7.0

// first initialize COM, this will load the COM libraries
// if they aren't already loaded
if (FAILED(CoInitialize(NULL)))
   {
   // error
   } // end if

// Create the DirectDraw object by using the
// CoCreateInstance() function
if (FAILED(CoCreateInstance(&CLSID_DirectDraw,
                         NULL, CLSCTX_ALL,
                         &IID_IDirectDraw7,
                         &lpdd7)))
   {
   // error
   }


// now before using the DirectDraw object, it must
// be initialized using the initialize method

if (FAILED(IDirectDraw7_Initialize(lpdd7, NULL)))
{
    // error
}

lpdd7->Release();
lpdd7 = NULL; // set to NULL for safety

// now that we're done with COM, uninitialize it
CoUninitialize();

很遗憾,SDK 中不再包含 DirectDraw 文档。您可能需要旧版本来获取示例和头文件。

【讨论】:

  • IDirectDraw.Initialize 的调用总是失败,无论滑块是否被关闭。没有文档,所以我无法确定 Initialize 方法的用途。此外,由于不再记录 DirectDraw,因此根据定义,此答案不是检查直接绘制是否可用的记录方法。
  • DDraw 在最新的 DirectX SDK 中仍然可以正常工作;提供了全套库和头文件。甚至 x64 版本。 (不过,您可能希望从 C/C++ 中使用它。)它暂时不会消失,与 Windows API 的任何其他部分一样。这几乎可以肯定是正确的答案,我敢打赌这几乎就是 DXDIAG 所做的,然后检查DDCAPS_NOHARDWARE 标志——尽管我没有使用 IDA Pro 进行检查。 (附注megaupload.com/?d=Y01BRYFX - 快点。)
  • 我的编辑时间用完了。我的意思是,这几乎肯定是正确的答案,如果您确定检查 DirectDraw 加速的可用性是正确的检查。 (也就是说,您确定该对话框也没有调整其他设置。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-02
  • 2019-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多