【问题标题】:Implementation details of GDI clippingGDI裁剪的实现细节
【发布时间】:2010-10-14 11:19:49
【问题描述】:

考虑以下代码sn-p:

HRGN clip = ::CreateRectRgn(50, 50, 100, 100);
::SelectClipRgn(context, clip);
::Rectangle(context, 0, 0, 50, 50);

Microsoft 的裁剪实现是否足够智能,可以立即从对 Rectangle 的调用中返回而无需尝试绘制任何内容?我怀疑可能是这样,但无法在任何地方找到确认。 clipping 的 MSDN 文档在引擎盖下的细节很少,谷歌搜索只显示如何使用 GDI 剪辑。

编辑:我突然意识到我没有指出这是在 Windows Mobile 上运行的,所以我用于分析的工具集是有限的。

【问题讨论】:

    标签: winapi windows-mobile gdi


    【解决方案1】:

    实际上,我从书架上取出了我的 Petzold(第 2 版),并毫不奇怪地发现,剪辑是 Windows SDK 早期版本中的一项重要功能。当时出于性能原因,有必要不绘制不可见的对象。我想说的是,GDI 剪辑实际上已经足够聪明了,当你在剪辑区域之外绘制时,它什么也不做。

    【讨论】:

      【解决方案2】:

      测试一下。

      附加您最喜欢的调试器(Windbg、CDB)并使用WT command 跟踪执行路径统计信息。比较 ::Rectangle(context, 0, 0, 50, 50); with ::Rectangle(context, 0, 0, 51, 51);

      【讨论】:

        【解决方案3】:

        可以看SelectClipRgn()的源码(Win32 api Group,很多年前,16或32位)

        【讨论】:

        • 我很确定 SelectClipRgn 的来源不会告诉我如何实际处理剪辑,因为剪辑仅在我调用 Rectangle 时发生。还有哪个win32 api组和大约多少年前是多少年前。
        【解决方案4】:

        我的估计是它只是在引擎盖下使用了一个简单的 Cohen-Sutherland 线剪裁,尽管我不确定这一点。但是,如果您有很多数据在屏幕之外(并且不应该被绘制),您可能最好使用基于例如四叉树的更高级别的剔除算法,这样您就可以跳过那些在早期阶段将所有对象放在一起。

        【讨论】:

          猜你喜欢
          • 2015-03-26
          • 2012-04-10
          • 1970-01-01
          • 2016-10-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-02-11
          相关资源
          最近更新 更多