CALayer - 暗影导致性能下降?

问题描述 投票:29回答:4

所以我在我的navigationcontroller上做一些自定义动画以及它推送和弹出viewControllers的方式。

一切顺利。一旦我添加以下代码(在UINavigationController的子类中),我就会面临巨大的性能损失。添加阴影后,所有动画都变得非常迟钝。这是预期的还是我在代码中做错了什么?

// This code gets called once during NavigationController initialization.
[self.view setClipsToBounds:NO];
[self.view.layer setCornerRadius:5];
[self.view.layer setShadowOffset:CGSizeMake(0, 20)];
[self.view.layer setShadowColor:[[UIColor yellowColor] CGColor]];
[self.view.layer setShadowRadius:20.0];
[self.view.layer setShadowOpacity:1];

编辑:

将我的阴影半径更改为1,它仍然很慢

iphone ios uinavigationcontroller calayer shadow
4个回答
47
投票

您应该期望通过添加阴影来减速。 20的shadowRadius非常高,特别慢。

另一个提高阴影渲染速度的关键:设置shadowPath属性。它可以帮助戏剧性。


83
投票
self.view.layer.shouldRasterize = YES;
self.view.layer.rasterizationScale = UIScreen.mainScreen.scale;

我最近遇到了缓慢的CALayer阴影的一些问题,而这个简单的代码行为我修复了一切!


15
投票

使用shadowPath而不是shadowOffset

theView.layer.shadowPath = [UIBezierPath bezierPathWithRect:theView.bounds].CGPath;

看看这篇文章:iphone - Animation's performance is very poor when view's shadow is on


2
投票

是的,阴影是非常昂贵的(特别是一个大的阴影 - 与半径一起玩,你会注意到它会对你经历的减速程度产生巨大影响)。提高性能的一种方法是将其渲染一次到CGImageContext并显示该图像,而不是每次重绘时都重新渲染阴影(但如果阴影需要动画或其他东西,这不起作用)。

© www.soinside.com 2019 - 2024. All rights reserved.