- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我在下面有以下代码,它基本上是 PieChart 的一个切片,其中有许多切片。每个切片都在它自己的 CALayer
中绘制,并使用 addSublayer:
添加到自定义 View 层。
问题是我在用户拖动手指时动态更新饼图(他们可以通过拖动来编辑饼图值)。它运行良好,但在重新绘制这些饼图“切片”时存在非常明显的滞后。我查看了 iOS Profiling 工具,它显示 >50% 的时间在 CGContextDrawPath()
中,因为每次用户移动一定程度时它都必须重新绘制饼图切片.
我的问题是,我可以做些什么来提高这段代码的速度?有什么我想念的吗?
另请注意,这段代码在 iPad 2 上运行良好(可接受的 fps 水平),但在 iPad 3 上运行起来很糟糕,根据我的估计,它慢了 2 倍。谁能解释一下?仅仅是视网膜显示屏吗?
-(void)drawInContext:(CGContextRef)ctx {
// Create the path
CGRect insetBounds = CGRectInset(self.bounds, self.strokeWidth, self.strokeWidth);
CGPoint center = CGPointMake(self.bounds.size.width/2, self.bounds.size.height/2);
CGFloat radius = MIN(insetBounds.size.width/2, insetBounds.size.height/2);
CGContextBeginPath(ctx);
CGContextMoveToPoint(ctx, center.x, center.y);
CGPoint p1 = CGPointMake(center.x + radius * cosf(self.startAngle), center.y + radius * sinf(self.startAngle));
CGContextAddLineToPoint(ctx, p1.x, p1.y);
int clockwise = self.startAngle > self.endAngle;
CGContextAddArc(ctx, center.x, center.y, radius, self.startAngle, self.endAngle, clockwise);
CGContextClosePath(ctx);
// Color it
CGContextSetFillColorWithColor(ctx, self.fillColor.CGColor);
CGContextSetStrokeColorWithColor(ctx, self.strokeColor.CGColor);
CGContextSetLineWidth(ctx, self.strokeWidth);
CGContextDrawPath(ctx, kCGPathFillStroke);
}
最佳答案
在 iPad 3 Retina 显示屏上绘制图形比在 iPad 2 非 Retina 显示屏上绘制要慢。
我记得 Apple 最初声称 iPad 3“图形处理速度比 iPad 2 快 4 倍”。事实并非如此。如果它在屏幕上渲染 Retina(多 4 倍的像素)应该至少与非 Retina iPad 2 相同的速度。
同样的问题发生在 Apple 发布 iPhone 4 时。iPhone 4 实际上比 3GS 和 3G 都慢。
CoreGraphics slower on iPhone4 than on 3G/3GS
要增加 fps,您需要减少 drawRect 需要绘制到的像素数。我建议将您的 CoreGraphics 相关内容绘制为半分辨率上下文。然后将该上下文作为位图并将其放大到全分辨率。但仅限于用户拖动时。
关于ios - 如何提高 CGContextDrawPath/drawInContext : 的速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15387553/
CALayer -drawInContext: 和 -renderInContext: 有什么区别? 最佳答案 当提供自定义 Quartz 绘制内容以在 CALayer 中显示时,您可以覆盖 -dra
获取 UIView 的快照有两种选择: 选项1: UIGraphicsBeginImageContextWithOptions(sampleView.bounds.size, false, UIScr
我使用 CALayer 的自定义扩展绘制为可滚动图形,并在 [MyCustomCALayer drawInContext] 中调用了一堆 CGContextAddCurveToPoint。 我实际上并
我在下面有以下代码,它基本上是 PieChart 的一个切片,其中有许多切片。每个切片都在它自己的 CALayer 中绘制,并使用 addSublayer: 添加到自定义 View 层。 问题是我在用
我正在尝试在 CALayer 子类中绘制。drawInContext 使用 setNeedsDisplay 调用,但未绘制任何内容。在这里做什么/出错了? - (void)drawInContext
如何在同一个 UIView 中正确使用这两个? 我有一个自定义子类 CALayer,我在其中绘制了 drawInContext 中的图案 我有另一个,我在其中设置了一个覆盖 PNG 图像作为内容。 我
我有一个自定义的 UIView 可以在覆盖的地方绘制一些东西 - (void)drawRect:(CGRect)rect 这很好用,并且在视网膜屏幕上产生了清晰的结果。 但是,现在我想使绘图所基于的属
我很好奇当我使用 CABasicAnimation 为图层设置动画时会发生什么,所以我在图层的 - (void)drawInContext:(CGContextRef) 中放置了一个 NSLog ct
According to documentation 默认实现不执行任何操作。 但是...我从 drawRect 方法中抛出异常并且我看到了下一个调用堆栈 3 EasyWakeup
我正在尝试将 UIView 绘制到 UIImage 中。这是我正在使用的代码: UIGraphicsBeginImageContextWithOptions(myView.bounds.size, Y
我今天遇到了一个有趣的 iOS 问题,涉及 CATiledLayer。这只发生在设备上 - 而不是在模拟器中。 我的 View 通过 drawLayer: inContext: 委托(delegate
我想用 2 种不同颜色的 1px 线条绘制双色线条。我有很多代码,所以我在尝试解释后将其放入。 如果我使用 uiview drawRect 方法,当我关闭抗锯齿时它工作正常,但是当我使用图层的 dra
在 drawRect 中这样做效果很好,因为图表经常更新,但当我需要增加总数据点/采样率时遇到性能问题。 我决定移动到 drawLayer: inContext: 但由于该函数以 60fps 的速度调
我尝试通过子类化使用 CALayer 进行绘制。我知道有一些关于我已经看过其中大部分的帖子,并遵循了给出的解决方案但没有成功。比如设置帧大小。这是代码。提前需要一些帮助 // // NewView.
我目前正在学习如何实现自定义控件。我不可避免地偶然发现了 CALayer 的可能性,因为在需要执行复杂的动画时使用 UIImage 不够灵活。 我想将 UIView 用作 CALayer 的“容器”,
我不是很明白CALayer的display和drawInContext与 View 中的drawRect有什么关系。 如果我有一个每 1 秒设置一次 [self.view setNeedsDispla
我是一名优秀的程序员,十分优秀!