3

阅读https://docs.microsoft.com/en-us/windows/win32/direct2d/comparing-direct2d-and-gdi

演示模型

最初设计 Windows 时,内存不足,无法将每个窗口存储在自己的位图中。因此,GDI 总是在逻辑上直接呈现到屏幕上,并应用各种剪辑区域以确保它不会呈现在其窗口之外。简而言之,Direct2D 遵循一个模型,其中应用程序呈现到后台缓冲区,并且在应用程序完成绘制时自动“翻转”结果。这允许 Direct2D 比 GDI 更流畅地处理动画场景。

作者说 Direct2D 使用后缓冲,我猜“翻转”是指交换链。我创建了一个简单的演示,在鼠标单击时在随机位置绘制一个矩形。但是之前的矩形没有被清除,所以看起来它是直接绘制到屏幕上的,并且不使用任何后台缓冲区。

4

3 回答 3

4

当您为 Direct2D 操作初始化 RenderTarget 时,您可以在第二个参数中指定 D2D1_PRESENT_OPTIONS 选项。

我认为让您感到困惑的是 D2D1_PRESENT_OPTIONS_RETAIN_CONTENTS 以及缓冲区没有交换而是复制的事实。

于 2012-02-10T21:31:17.267 回答
1

这并不能反驳后台缓冲区的存在,它只意味着后台缓冲区在重绘之间没有被清除。正确的观察,错误的结论!

如果您增加链中的后台缓冲区的数量,您将开始注意到在您不断单击时闪烁的矩形,因此您应该始终在重绘之间清除您的后台缓冲区。

于 2011-06-20T17:02:12.530 回答
1

Direct2D 确实使用后台缓冲区。

也许您在调用 begindraw 之后忘记清除您的渲染目标,也就是后台缓冲区,所以之前的绘制一直留在那里?

于 2011-07-29T12:58:19.983 回答