2

考虑以下代码片段:

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

微软的裁剪实现是否足够智能,可以立即从对 Rectangle 的调用中返回而无需尝试绘制任何内容?我怀疑它可能是但无法在任何地方找到确认。用于剪辑的 MSDN 文档在幕后细节上很少见,而谷歌搜索除了如何使用 GDI 剪辑之外什么也没找到。

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

4

4 回答 4

2

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

于 2009-03-20T03:27:29.667 回答
1

测试一下。

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

于 2009-03-27T02:11:10.793 回答
0

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

于 2009-03-20T13:26:33.237 回答
0

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

于 2009-03-27T02:24:21.820 回答