首页 > 解决方案 > Direct2D:在绘制之前检查图像是否在可见区域之外?

问题描述

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

标签: direct2d

解决方案


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

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

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

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

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

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

由于矩形很容易成批并且绘制起来很便宜,因此似乎无论如何都只是绘制它们。

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

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

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


推荐阅读