15.4 減少圖層數(shù)量

2018-02-24 15:07 更新

減少圖層數(shù)量

????初始化圖層,處理圖層,打包通過(guò)IPC發(fā)給渲染引擎,轉(zhuǎn)化成OpenGL幾何圖形,這些是一個(gè)圖層的大致資源開(kāi)銷(xiāo)。事實(shí)上,一次性能夠在屏幕上顯示的最大圖層數(shù)量也是有限的。

????確切的限制數(shù)量取決于iOS設(shè)備,圖層類(lèi)型,圖層內(nèi)容和屬性等。但是總得說(shuō)來(lái)可以容納上百或上千個(gè),下面我們將演示即使圖層本身并沒(méi)有做什么也會(huì)遇到的性能問(wèn)題。

裁切

????在對(duì)圖層做任何優(yōu)化之前,你需要確定你不是在創(chuàng)建一些不可見(jiàn)的圖層,圖層在以下幾種情況下回事不可見(jiàn)的:

  • 圖層在屏幕邊界之外,或是在父圖層邊界之外。
  • 完全在一個(gè)不透明圖層之后。
  • 完全透明

????Core Animation非常擅長(zhǎng)處理對(duì)視覺(jué)效果無(wú)意義的圖層。但是經(jīng)常性地,你自己的代碼會(huì)比Core Animation更早地想知道一個(gè)圖層是否是有用的。理想狀況下,在圖層對(duì)象在創(chuàng)建之前就想知道,以避免創(chuàng)建和配置不必要圖層的額外工作。

????舉個(gè)例子。清單15.3 的代碼展示了一個(gè)簡(jiǎn)單的滾動(dòng)3D圖層矩陣。這看上去很酷,尤其是圖層在移動(dòng)的時(shí)候(見(jiàn)圖15.1),但是繪制他們并不是很麻煩,因?yàn)檫@些圖層就是一些簡(jiǎn)單的矩形色塊。

清單15.3 繪制3D圖層矩陣

#import "ViewController.h"
#import 

#define WIDTH 10
#define HEIGHT 10
#define DEPTH 10
#define SIZE 100
#define SPACING 150
#define CAMERA_DISTANCE 500

@interface ViewController ()
?
@property (nonatomic, strong) IBOutlet UIScrollView *scrollView;

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    //set content size
    self.scrollView.contentSize = CGSizeMake((WIDTH - 1)*SPACING, (HEIGHT - 1)*SPACING);

    //set up perspective transform
    CATransform3D transform = CATransform3DIdentity;
    transform.m34 = -1.0 / CAMERA_DISTANCE;
    self.scrollView.layer.sublayerTransform = transform;

    //create layers
    for (int z = DEPTH - 1; z >= 0; z--) {
        for (int y = 0; y < HEIGHT; y++) {
            for (int x = 0; x < WIDTH; x++) {
                //create layer
                CALayer *layer = [CALayer layer];
                layer.frame = CGRectMake(0, 0, SIZE, SIZE);
                layer.position = CGPointMake(x*SPACING, y*SPACING);
                layer.zPosition = -z*SPACING;
                //set background color
                layer.backgroundColor = [UIColor colorWithWhite:1-z*(1.0/DEPTH) alpha:1].CGColor;
                //attach to scroll view
                [self.scrollView.layer addSublayer:layer];
            }
        }
    }
    ?
    //log
    NSLog(@"displayed: %i", DEPTH*HEIGHT*WIDTH);
}
@end

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)