我正在开发一个 Cocoa 全屏应用程序。我正在使用 1 个 NSView,它有 1 个具有多个子层的 CALayer。现在进行测试 - 我正在使用任何击键在屏幕上添加点(20 x 20)。这只是为了测试绘制点。我的问题是,我在点层上使用了过滤器 - 具体来说,我使用的是 CIDiscBlur - 一旦我达到大约 30 个点 - 点的绘制速度就会显着减慢。按键和点出现之间可能有 1 - 1.5 秒的延迟。我注意到,如果我删除在图层上设置 CIDisBlur
过滤器 - 速度不会变慢。
在绘制这么多子图层时,我应该使用哪些最佳实践或技巧?任何帮助都会很棒。
CIFilter *blurFilter = [CIFilter filterWithName:@"CIDiscBlur"];
[blurFilter setDefaults];
[blurFilter setValue:(id)[NSNumber numberWithFloat:15.0] forKey:@"inputRadius"];
dotFilters = [[NSArray arrayWithObjects:(id)blurFilter, nil] retain];
CGColorRef purpleColor = CGColorCreateGenericRGB(0.604, 0.247, 0.463, 1.0);
CALayer *dot = [[CALayer layer] retain];
dot.backgroundColor = purpleColor;
dot.cornerRadius = 15.0f;
dot.filters = dotFilters;
NSRect screenRect = [[self.window screen] frame];
// 10 point border around the screen
CGFloat width = screenRect.size.width - 20;
CGFloat height = screenRect.size.height - 20;
#define ARC4RANDOM_MAX 0x100000000
width = ((CGFloat)arc4random() / ARC4RANDOM_MAX) * width + 10;
height = ((CGFloat)arc4random() / ARC4RANDOM_MAX) * height + 10;
dot.frame = CGRectMake(width, height, 20,20);//30, 30);
[dot addSublayer:dotsLayer];
我还尝试使用 masksToBounds = YES
看看是否有帮助 - 但没有运气。
最佳答案
通过不使用圆角半径来制作圆形图层,您可能可以获得性能提升。虽然在静态上下文中制作圆形图层是一个不错的小捷径,但当您制作动画时,它会显着降低性能。您最好指定一个 CAShapeLayer 的圆形路径,或者下拉到 Core Graphics 并在 drawInContext 调用中绘制一个圆圈。要测试我是否正确,只需注释掉您设置圆角半径的调用并应用您的过滤器即可。看看这是否会加快速度。如果没有,那么我不确定发生了什么。这可能意味着您必须找到一种不同的方法来在没有滤镜的情况下获得效果。如果您的点总是具有相同的外观,那么您可能可以通过使用图像来“作弊”。
致以诚挚的问候。
关于cocoa - 提高 CALayer 过滤器的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4755122/