GDI裁剪的实现细节

发布于 2024-07-15 22:13:30 字数 499 浏览 0 评论 0原文

考虑以下代码片段:

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

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

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

Consider the following code snippet:

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

Is Microsoft's clipping implementation intelligent enough to return immediately from the call to Rectangle without attempting to draw anything? I suspect it probably is but have been unable to find confirmation anywhere. The MSDN documentation for clipping is sparse on under the hood details, and Googling turns up nothing but how to use GDI clipping.

EDIT: It dawned on me that I failed to point out that this is running on Windows Mobile so the toolset I have for analysis is limited.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

荒路情人 2024-07-22 22:13:30

事实上,我把 Petzold(第 2 版)从架子上拿出来,毫不奇怪地发现,剪辑是 Windows SDK 早期版本中的一个重要功能。 当时,出于性能原因,有必要不绘制不可见的对象。 我想说的是,GDI 剪切实际上足够智能,当您在剪切区域之外绘制时,它不会执行任何操作。

I actually pulled my Petzold (2nd Edition) from the shelf and found that, not surprisingly, clipping was an important feature in the early versions of the Windows SDK. Back then it was necessary for performance reasons to not draw objects that are invisible. I would say that GDI clipping is in fact smart enough and will do nothing when you draw outside the clipping region.

橙味迷妹 2024-07-22 22:13:30

测试一下。

连接您最喜欢的调试器(Windbg、CDB)并使用 WT 命令跟踪执行路径统计信息。 比较 ::矩形(上下文, 0, 0, 50, 50); 与 ::Rectangle(上下文, 0, 0, 51, 51);

Test it.

Attach your favorite debugger (Windbg, CDB) and use the WT command to trace the execution path statistics. Compare ::Rectangle(context, 0, 0, 50, 50); with ::Rectangle(context, 0, 0, 51, 51);

独自唱情﹋歌 2024-07-22 22:13:30

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

You can see the source code of SelectClipRgn() (Win32 api Group, many years ago, 16 or 32 bits)

嗫嚅 2024-07-22 22:13:30

我的估计是,它只是在引擎盖下使用了一条简单的科恩-萨瑟兰线,尽管我不确定这一点。 但是,如果您有大量位于屏幕之外的数据(并且不应绘制),您可能最好使用基于四叉树等更高级别的剔除算法,这样您就可以跳过这些数据对象在早期阶段集中在一起。

My estimate would be that it's just using a simple Cohen-Sutherland line clipping under the hood, though I'm not sure of that. However, if you have lots of data that is outside of the screen (and shouldn't be drawn) you might be better off with a higher level culling algorithm based on, for example, a Quad-tree, so that you can skip those objects all together in an earlier stage.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文