Direct2D使用后备缓冲吗?

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

演示模型

当Windows首次设计时,由于内存不足,无法将每个窗口存储在自己的位图中。因此,GDI总是直接逻辑地呈现到屏幕上,并应用各种剪切区域以确保它不会在其窗口外呈现。相反,Direct2D遵循一种模型,即应用程序渲染到后备缓冲区,当应用程序完成绘制时,结果会被原子性地“翻转”。这使得Direct2D可以处理比GDI更流畅的动画场景。

作者说Direct2D使用后备缓冲区,他所指的“翻转”可能是交换链。我创建了一个简单的演示,在鼠标点击时绘制一个矩形。但是旧的矩形没有清除,因此看起来是直接绘制到屏幕上,而没有使用任何后备缓冲区。
3个回答

4

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

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


1

这并不否定后备缓冲区的存在,只是意味着在重绘之间没有清除后备缓冲区。观察正确,结论错误!

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


如果我点击两次,正好会出现两个矩形。如果使用后备缓冲区,我认为这种情况是不应该出现的。 - Alice
我猜如果使用了后备缓冲区,那么每次调用BeginDraw时它会被交换。所以如果我使用两个BeginDraw调用来绘制两个矩形,则一个矩形进入缓冲区1,另一个矩形进入缓冲区2。然后我们应该只能看到一个矩形。 - Alice
你说只有一个后备缓冲区。 - Blindy
一个前缓冲区,一个后缓冲区。 - Alice

1

Direct2D确实使用后备缓冲区。

也许您忘记在调用begindraw之后清除渲染目标(即后备缓冲区),因此之前的绘制仍然留在那里了?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接