離屏渲染

當(dāng)圖層屬性的混合體被指定為在未預(yù)合成之前不能直接在屏幕中繪制時,屏幕外渲染就被喚起了。屏幕外渲染并不意味著軟件繪制,但是它意味著圖層必須在被顯示之前在一個屏幕外上下文中被渲染(不論CPU還是GPU)。

圖層的以下屬性將會 觸發(fā)屏幕外繪制:

· 圓角(當(dāng)和 maskToBounds 一起使用時)
· 圖層蒙板
· 陰影

如果太多圖層在屏幕外渲染依然會影響到性能對于那些需要動畫而且要在屏幕外渲染的圖層來說,你可以用 CAShapeLayer, contentsCenter 或者 shadowPath 來獲得同樣的表現(xiàn)而且較少地影響到性能。

CAShapeLayer

cornerRadiusmaskToBounds 獨(dú)立作用的時候都不會有太大的性能問題, 但是當(dāng)他倆結(jié)合在一起,就觸發(fā)了屏幕外渲染。有時候你想顯示圓角并沿著圖層裁 切子圖層的時候,你可能會發(fā)現(xiàn)你并不需要沿著圓角裁切,這個情況下用 CAShapeLayer 就可以避免這個問題了。

你想要的只是圓角且沿著矩形邊界裁切,同時還不希望引起性能問題。其實(shí)你可 以用現(xiàn)成的UIBezierPath的構(gòu)造器+ bezierPathWithRoundedRect: cornerRadius:這樣做并不會比直接用 cornerRadius 更快,但是它避免了性能問題。

CAShapeLayer *blueLayer = [CAShapeLayer layer]; 
blueLayer.frame = CGRectMake(50, 50, 100, 100);
blueLayer.fillColor = [UIColor blueColor].CGColor; 
blueLayer.path = [UIBezierPath bezierPathWithRoundedRect: CGRectMake(0, 0, 100, 100) cornerRadius:20].CGPath;
//add it to our view
[self.layerView.layer addSublayer:blueLayer];

可伸縮圖片

另一個創(chuàng)建圓角矩形的方法就是用一個圓形內(nèi)容圖片是提到的contentsCenter屬性去創(chuàng)建一個可伸縮圖片。理論上來說,這 個應(yīng)該比用 要快,因?yàn)橐粋€可拉伸圖片只需要18個三角形(一個圖片是由一個3*3網(wǎng)格渲染而成),然而,許多都需要渲染成一個順滑的曲線。在 實(shí)際應(yīng)用上,二者并沒有太大的區(qū)別。

contentsCenter 其實(shí)是一個CGRect,它定義了一個固定的邊框和一個在圖層上可拉伸的區(qū)域。改變contentsCenter的值并不會影響到寄宿圖的顯示,除非這個圖層的大小改變了,你才看得到效果。

CALayer *blueLayer = [CALayer layer];
blueLayer.frame = CGRectMake(50, 50, 100, 100);
blueLayer.contentsCenter = CGRectMake(0.5, 0.5, 0.0, 0.0);
blueLayer.contentsScale = [UIScreen mainScreen].scale;
blueLayer.contents = (__bridge id)[UIImage imageNamed:@"Circle"];
//add it to our view
[self.layerView.layer addSublayer:blueLayer];

使用可伸縮圖片的優(yōu)勢在于它可以繪制成任意邊框效果而不需要額外的性能消耗。可伸縮圖片甚至還可以顯示出矩形陰影的效果。

shadowPath

如果圖層是一個簡單幾何圖形如矩形或 者圓角矩形(假設(shè)不包含任何透明部分或者子圖層),創(chuàng)建出一個對應(yīng)形狀的陰影 路徑就比較容易,而且Core Animation繪制這個陰影也相當(dāng)簡單,避免了屏幕外的 圖層部分的預(yù)排版需求。這對性能來說很有幫助。
如果你的圖層是一個更復(fù)雜的圖形,生成正確的陰影路徑可能就比較難了,這樣子的話你可以考慮用繪圖軟件預(yù)先生成一個陰影背景圖。

原始鏈接:https://juejin.im/post/5a43103f6fb9a0450e7662df?utm_source=gold_browser_extension

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容