Ipad 在图形中,交点将清除

Ipad 在图形中,交点将清除,ipad,drawing,Ipad,Drawing,我们正在开发一个绘图应用程序。在这种情况下,当我们绘制交叉线时,交点将清除先前绘制的两条线相交的像素。我们使用setneedsdisplayinrect刷新图形数据 如何解决这个问题;dr:您需要存储以前的线段,并在再次绘制同一矩形时重新绘制它们 我们正在使用setneedsdisplayinrect刷新图形数据 这是一件好事。你能看到这样做的副作用吗?如果没有,尝试传递整个矩形,看看会发生什么。您将看到,只绘制了最后一段 现在您知道您需要存储并可能重新绘制以前的线段(或仅其图像) 天真的方法

我们正在开发一个绘图应用程序。在这种情况下,当我们绘制交叉线时,交点将清除先前绘制的两条线相交的像素。我们使用setneedsdisplayinrect刷新图形数据


如何解决这个问题;dr:您需要存储以前的线段,并在再次绘制同一矩形时重新绘制它们


我们正在使用setneedsdisplayinrect刷新图形数据

这是一件好事。你能看到这样做的副作用吗?如果没有,尝试传递整个矩形,看看会发生什么。您将看到,只绘制了最后一段

现在您知道您需要存储并可能重新绘制以前的线段(或仅其图像)

天真的方法 第一个也是最简单的解决方案是将所有行存储在一个数组中并重新绘制它们。你会注意到,这会大大降低你的应用程序的速度,尤其是在画了一段时间后。而且,只画你需要的东西也不太合适

仅在刷新的矩形内绘制线 通过过滤数组中的所有行,只重新绘制与刷新的rect相交的行,可以加快上述实现的速度。例如,可以通过获取线段的边界框(使用
CGPathGetBoundingBox(path)
)并检查它是否与刷新的矩形相交(使用
CGRectIntersectsRect(refreshRect,boundingBox)

这将减少一些绘图,但最终仍然会得到很长的线阵列,并在一段时间后看到性能问题

光栅化旧线段 不必存储所有以前的行的一个好方法是将它们绘制到位图(单独的图像上下文(请参见
UIGraphicsBeginImageContextWithOptions(…)
)中)在绘制新线段之前绘制该图像。但是,这几乎会使您必须绘制的图形增加一倍,因此不应该对每一帧都这样做

您可以做的一件事是存储最后100条线段(或者可能是最后1000条线段,或者您自己的性能调查显示的任何内容,您应该自己调查这些内容),然后将其余的线段绘制到图像中。每次有100条新线时,您都会将它们添加到图像上下文中—首先绘制图像,然后绘制新的100条线—并将其保存为新图像

你可以做的另一件事是,每次用户抬起手指时,把所有的新线都画到图像上。这可以与上述建议结合使用



根据应用程序的复杂性,您可能需要一个或多个建议来保持应用程序的响应性(这对于绘图应用程序来说非常重要),但请先进行调查,如果不需要的话,不要使解决方案过于复杂。

尝试在问题中添加一个问题,它们以“?”结尾。此外,一些显示如何绘制的代码加上一张图片或更详细的问题解释也会有所帮助。