gpt4 book ai didi

ios - 尝试使用渐变进行实时绘图时出现性能问题

转载 作者:行者123 更新时间:2023-11-29 10:25:54 25 4
gpt4 key购买 nike

我需要建立一个实时绘图 sin(x)

所以我每秒更新 25 次。我尝试对绘图线使用渐变以使其最终透明:

一切看起来都不错 - 但性能非常低。当我不创建渐变时 - 一切正常。

所需的情节如下所示:

enter image description here

是否可以改进我的代码来解决性能问题?

CGContextSaveGState(context);

CGFloat value;

UIBezierPath *graph = [UIBezierPath new];

for (NSUInteger counter = 0; counter < historyArray.count; counter++) {
value = [historyArray[counter] floatValue];
if (counter == 0) {
[graph moveToPoint:CGPointMake((CGFloat) (bounds.origin.x + bounds.size.width * 0.75 / 40), (CGFloat) (bounds.origin.y + bounds.size.height / 2 - value * bounds.size.height / 2.1))];
} else {
[graph addLineToPoint:CGPointMake((CGFloat) (bounds.origin.x + (float) counter / (float) (40 - 1) * bounds.size.width * 0.75), (CGFloat) (bounds.origin.y + bounds.size.height / 2 - value * bounds.size.height / 2.1))];
}
}

if (historyArray.count > 0) {

CGFloat colors[] = {
0.0, 1.0, 1.0, 0.0,
0.0, 1.0, 1.0, 1.0,
0.0, 1.0, 1.0, 1.0
};

CGColorSpaceRef baseSpace = CGColorSpaceCreateDeviceRGB();

CGGradientRef gradient = CGGradientCreateWithColorComponents(baseSpace, colors, NULL, 3);
CGColorSpaceRelease(baseSpace), baseSpace = NULL;

CGContextSetLineWidth(context, 2.f);
CGContextSetLineJoin(context, kCGLineJoinRound);
CGContextSetLineCap(context, kCGLineCapRound);

CGContextAddPath(context, graph.CGPath);
CGContextReplacePathWithStrokedPath(context);
CGContextClip(context);

// Define the start and end points for the gradient
// This determines the direction in which the gradient is drawn
CGPoint startPoint = bounds.origin;
CGPoint endPoint = CGPointMake(bounds.origin.x + bounds.size.width, bounds.origin.y);

CGContextDrawLinearGradient(context, gradient, startPoint, endPoint, 0);
CGGradientRelease(gradient), gradient = NULL;
CGContextRestoreGState(context);
}

最佳答案

创建渐变不太可能是性能问题。它更有可能将其剪切到复杂的路径。从您的代码中并不完全清楚您的路径有多少条线段,但我怀疑它有数百条,对吗?

至于更高效的方法:

  • 减少路径中的点数 - 如果您在水平方向每隔 X 像素绘制点,那么当曲线变化不大(靠近峰和谷)时,您绘制的点数超出了您的需要.

  • 完全取消渐变,只用多条不同颜色的线段绘制路径。无论如何,这实际上最终看起来可能会更好,因为您可以根据行进的距离而不是水平坐标来调整透明度。

  • 如果您确实需要水平渐变,请尝试将其应用于路径的子集,这可能比一次完成所有操作更快。

关于ios - 尝试使用渐变进行实时绘图时出现性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32346424/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com