【问题标题】:Does Direct2D use back-buffer?Direct2D 是否使用后台缓冲区?
【发布时间】:2011-09-18 21:01:03
【问题描述】:

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

演示模型

当 Windows 是 最初设计,有不足 内存允许每个窗口 存储在自己的位图中。因此, GDI 总是直接逻辑渲染 到屏幕,有各种剪辑 地区申请以确保它确实做到了 不在其窗口之外渲染。在 契约,Direct2D 遵循模型 应用程序呈现给 后缓冲,结果是 当 应用程序完成绘图。这 允许 Direct2D 处理动画 比 GDI 更流畅的场景 可以。

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

【问题讨论】:

    标签: direct2d


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 如果我点击两次恰好出现两个矩形。如果使用后缓冲,我认为不应该是这种情况。
      • 我猜如果使用后台缓冲区,每次调用 BeginDraw 时都会交换它。因此,如果我使用两个 BeginDraw 调用绘制两个矩形,则一个矩形进入缓冲区 1,另一个矩形进入缓冲区 2。那么我们应该只看到一个矩形。
      • 你说只有一个后台缓冲区。
      • 一个前缓冲区,一个后缓冲区
      【解决方案3】:

      Direct2D 确实使用了后台缓冲区。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-03-08
        • 2016-09-01
        • 1970-01-01
        • 2012-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多