【问题标题】:Direct2D: Check if image is outside visible area before drawing?Direct2D:在绘制之前检查图像是否在可见区域之外?
【发布时间】:2021-06-08 09:33:36
【问题描述】:

如果图像最终会超出可见区域,那么省略对 ID2D1HwndRenderTarget::DrawBitmap() 的调用是否是一个合理的优化?如果我在应用程序中实现检查逻辑会消耗一些性能,那么如果 D2D 做的第一件事是做同样的检查,那么我宁愿不做。

【问题讨论】:

  • 您可以尝试两种方法,看看是否有任何可测量的差异。我希望这样的交叉测试已经开始了。
  • 大部分(剪辑等)现在应该在驱动程序中编码(比如大约 20 年):docs.microsoft.com/en-us/windows-hardware/drivers/display/… 但这也取决于您的代码的细节。默认情况下,我会信任 D2D。

标签: direct2d


【解决方案1】:

我对我的应用程序进行了测试,该应用程序使用 Direct2D(并附加了 renderdoc)呈现了一些 UI 部分,似乎有点随机。

我使用位图画笔(应该等同于您的 DrawBitmap 调用)渲染混合的矩形、文本、路径几何(贝塞尔曲线)和矩形。

然后我捕获所有这些对象都可见的帧,另一个帧平移我的 UI(使用变换),因此对象不可见。

从那里可以检查是否绘制了什么:

  • 文本总是被剔除
  • 不剔除纯色矩形
  • 大多数时候路径几何都被剔除,但有时不会。
  • 永远不会剔除带有位图画笔的矩形

因此,Direct2D 似乎会根据您计划绘制的元素类型做出不同的决定。

由于矩形很容易批量绘制且绘制成本低廉,因此似乎无论如何都只是绘制它们。

位图矩形和文本需要更多的工作,所以看起来它们被有效地剔除。

路径几何体希望取决于几何体细分到多少多边形(我有一条路径转换为 ​​26 个图元但未被剔除,另一条转换为 120 并被剔除)。

因此,您可以相信 Direct2D 会执行该优化,但我会亲自实施一个快速的矩形到矩形检查以防万一(它不会损害您的性能,因为它是一个极其简单的操作)。

【讨论】:

    猜你喜欢
    • 2013-01-31
    • 2020-08-24
    • 2012-05-12
    • 2012-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-10
    相关资源
    最近更新 更多