0

我想制作一个能够使用 alpha 混合绘制自定义形状窗口的蒙皮引擎。也就是说,它将使用分层窗口 ( UpdateLayeredWindow )。一个典型的窗口将在其背景中包含几十个其他位图,范围从 10×10 到例如 300×150 像素。在最坏的情况下,这些元素中的大多数将具有高达 30 fps 的流畅动画。一切都将是 alpha 混合的,我将为此使用 Direct2D(是的,我知道旧的 Windows 版本不支持它)。一般来说,Winamp 的现代皮肤引擎是最接近的例子。

考虑到这一切并考虑到现代 PC 的性能,我可以在每一帧重绘整个窗口还是必须限制到某种剪辑矩形?

4

2 回答 2

1

D2D 要求您使用 WM_Paint 消息进行渲染 Honneslty,使用 IAnimation 接口,让 D2D 和 windows 担心重绘的频率,尽管我会告诉您,winamp 是使用 adobe air 完成的,而使用 d2d 的分层窗口会导致问题。(有点认为你必须使用 DXGI 渲染目标,但是随着窗口被分层,它需要一个 DC 返回到结束绘制调用,以便它可以更新它的 alpha 通道)

于 2011-05-30T11:04:25.433 回答
0

我对此有一些经验。

如果您需要支持 Windows XP,使用 UpdateLayeredWindow 是解决此问题的唯一选择。这个调用的文档说每次调用它时都会将整个位图复制到屏幕上,这个瓶颈在我的基准测试中作为真正的限制因素出现。如果您的窗口是 300x300,那么您每次更新都要付出这个代价,即使您小心翼翼地只修改了几个像素。过度优化渲染端而没有真正的好处是很容易的,所以实现一些简单的东西,测量,然后决定是否需要优化。

如果您可以放弃对 Windows XP 的支持,那么您可以完全避免 UpdateLayeredWindow 并使用 DwmExtendFrameIntoClientArea 创建与分层窗口相同的效果。您将编写更少的代码,避免 UpdateLayeredWindow 瓶颈,并且 D2D 将更易于使用。

于 2011-05-30T16:45:31.283 回答