GDI裁剪的实现细节

时间:2009-03-20 03:17:05

标签: winapi windows-mobile gdi

请考虑以下代码段:

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

Microsoft的剪辑实现是否足够智能,可以立即从调用Rectangle返回而不尝试绘制任何东西?我怀疑它可能已经无法在任何地方找到确认。 clipping的MSDN文档在详细信息下很少见,而谷歌搜索只显示如何使用GDI剪辑。

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

4 个答案:

答案 0 :(得分:2)

我实际上从架子上取下了我的Petzold(第2版),发现剪辑是早期版本的Windows SDK中的一个重要特征,这并不奇怪。当时由于性能原因,不必绘制不可见的对象。我会说GDI剪辑实际上足够聪明,当你在裁剪区域之外绘制时它什么都不做。

答案 1 :(得分:1)

测试一下。

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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