Skinned Window:Win32 API和DirectX

时间:2012-03-11 19:02:19

标签: winapi directx gdi alpha

我尝试使用WS_EX_LAYERED样式窗口创建无边框窗口。目标是使用DirectX将图形直接渲染到桌面,使用alpha混合到当前桌面窗口。

现在在我的系统上,这种技术似乎完美无缺。我可以设置各种alpha级别并实现不同级别的透明度。不幸的是,有几个用户报告了严重的性能问题和低帧率,使得这种技术无法使用。

代码设置如下:

  1. 创建分层( WS_EX_LAYERED 扩展样式)窗口。
  2. 使用HWND窗口初始化DirectX。
  3. 使用 CreateRenderTarget DirectX方法创建渲染目标。
  4. 然后在渲染循环期间:

    1. 使用DirectX调用将图形渲染到渲染目标。
    2. 使用 GetDC 方法获取DirectX渲染目标表面的HDC句柄。
    3. 使用 UpdateLayeredWindow 功能更新窗口内容,指定DirectX表面HDC。
    4. 我的问题是:我做错了吗?有没有办法提高窗口更新的性能。我尝试了各种各样的事情,比如锁定渲染目标并手动将这些位复制到DIB部分以显示在窗口区域中,但没有成功。

1 个答案:

答案 0 :(得分:0)

你的窗户有多大?注意MSDN在http://msdn.microsoft.com/en-us/library/windows/desktop/ms633556%28v=vs.85%29.aspx上的文档说"为了通过分层窗口和任何底层窗口获得最佳绘图性能,分层窗口应该尽可能小。"

如果启用了合成(Aero),您可能会获得性能提升。如果Windows已经在合成,那么它不必为绘制分层窗口做更多的额外工作。

如果您根据合成没有看到任何性能上的差异,那么我可能完全不在这里。