填充多边形:绕组规则与偶数奇规则的表现

时间:2009-01-28 04:22:32

标签: performance algorithm xlib raster

对于复杂的多边形(即:自相交),绕组或偶数奇数填充规则之间的选择会影响多边形的填充方式。

但对于非交叉多边形,在绕组或偶数奇数填充规则之间存在任何性能差异。我知道它将是特定于实现的,但哪种算法对非复杂多边形更有效。

后续问题这些算法的复杂性(即O(什么?))是多少?我想知道是否值得去除多边形中的某些点(主要是重复或同一行上的点)以提高性能。

PS:如果它很重要,我正在使用xlib

PPS:我可以确认问题与硬件无关,因为使用不同的显卡不会改变性能

1 个答案:

答案 0 :(得分:4)

今天,X的大多数实现使用显卡的2D硬件,因此两者之间的差异可能微不足道。

由于这是一个性能问题,我答案正确的可能性大约是10%(尽管有性能,你有90%的机会在没有测量的情况下出错)。如果你想确定,除了写一个小的性能测试并亲自看看之外别无他法。

x11perf可能会有所帮助。

您可以在此处找到硬件无关多边形填充的算法:http://cvsweb.xfree86.org/cvsweb/xc/programs/Xserver/mi/mipolygen.c?rev=HEAD

如果您确定多边形是凸的,那么第二个版本要快得多:http://cvsweb.xfree86.org/cvsweb/xc/programs/Xserver/mi/mipolycon.c?rev=HEAD

第二个版本忽略填充规则(不适用于凸多边形)。关于算法的评论:http://cvsweb.xfree86.org/cvsweb/xc/programs/Xserver/mi/mipoly.h?rev=HEAD

算法以这种方式工作:它计算轮廓,然后在边缘之间创建跨度对象(只是x,y坐标和宽度)。如果使用EvenOdd规则,则在有交叉点时将创建更多span对象。如果没有(例如,当多边形是凸的时),那么你将不会注意到运行时差异,因为填充规则相当于miFillPolygon主循环中的布尔变量(即大多数代码对于两者都是相同的填写规则)。

尝试通过优化多边形的轮廓来提高性能在常见情况下不会占用太多,除非您知道您的多边形包含非常多的不必要的点(例如,您可以摆脱一半的数量)普通案例中的要点)。用<优化多边形10点可能会花费超过它的成本。

但是又一次:这都是基于直觉或旧文章的知识。如果你想知道你的gfx卡驱动程序中的错误是否会弄乱结果,你必须弄清楚并且写一个测试,测量每个案例需要多长时间。由于外部因素,无法通过简单地查看任何复杂算法来判断运行时:内存分配例程的速度,可用内存量(交换启动时间),可以使用的CPU内核数量,数量其他进程将争夺CPU,屏幕上最终多边形的剪切,实现细节和优化,错误等。