【问题标题】:Draw graphics (lines) very fast非常快速地绘制图形(线条)
【发布时间】:2015-08-16 04:34:06
【问题描述】:

我需要使用直线和仿射变换绘制大量数据点(以缩放图形使其适合视图)。

目前,我正在使用 NSBezierPath,但我认为它的效率非常低(因为点在被绘制之前被复制到贝塞尔路径)。通过将数据切割成 50 点的块,我得到了改进(NSBezier 路径要快得多)。

但我知道使用核心图形或 CG.... 函数调用可能有更好的方法?

我的应用是用 swift 编写的。

【问题讨论】:

标签: macos swift


【解决方案1】:

首先,如果您可以:分析您的应用并尝试确定您的性能瓶颈所在。

我的经验是 Core Graphics 在任何事情上都不是很快。

如果您想快速栅格化直线,您可能需要研究 OpenVG 实现(iOS 似乎有 several open source implementations),甚至直接使用 OpenGL。当然,这假设快速渲染大量行是您的应用程序的一个差异化因素,因此值得付出努力。

【讨论】:

  • 感谢您的回复。是的,我的应用程序依赖于它。目前,我使用CGContextMoveToPointCGContextAddLineToPointCGContextStrokePath,但我发现在路径中放置 1000 个点比仅放置 100 个点要慢得多。这意味着它实际上像贝塞尔路径一样绘制,尽管它只包含直线。如何告诉系统只画直线?
  • 你是怎么得出这个结论的?我一直认为 UIBezierPath 只是一个围绕 CGPath 的 ObjC 包装器,但在依赖它之前我会仔细检查文档
  • 根据苹果的说法,它确实是一个包装器:developer.apple.com/library/ios/documentation/2DDrawing/…
  • 回到我的答案。 CoreGraphics 并不是以高帧速率绘制复杂动态矢量图形的最佳执行方式。我建议您至少评估其他方法如何适合您的问题,特别是因为该功能对您的应用非常重要
  • 你是怎么得出这个结论的? @Krumelur:好吧,我做了测试。在 2000 CGContextStrokePath 中而不是在一个中绘制 100000 个点要快三个数量级。 NSBezierPath 也一样。这就是为什么我总是在绘制图表之前将数据分成小组。从点 1 到 50,然后从 50 到 99,等等...
猜你喜欢
  • 2022-01-07
  • 2020-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多