性能優(yōu)化1-UI卡頓處理

1挣菲、了解CPU與GPU

在屏幕成像的過程中,CPU和GPU起著至關(guān)重要的作用

CPU(Central Processing Unit,中央處理器)

對(duì)象的創(chuàng)建和銷毀彻况、對(duì)象屬性的調(diào)整、布局計(jì)算舅踪、文本的計(jì)算和排版纽甘、圖片的格式轉(zhuǎn)換和解碼、圖像的繪制(Core Graphics)

GPU(Graphics Processing Unit抽碌,圖形處理器)

處理紋理的渲染

CPU和GPU作用

在iOS中是雙緩沖機(jī)制悍赢,有前幀緩存、后幀緩存货徙;

屏幕成像原理:

屏幕成像原理

卡頓產(chǎn)生的原因

卡頓產(chǎn)生的原因

按照60FPS的刷幀率左权,每隔16ms就會(huì)有一次VSync信號(hào),當(dāng)VSync信號(hào)到來時(shí)痴颊,GPU還沒完成渲染赏迟,便要等待到下一幀到來時(shí)才會(huì)顯示,這就照成了丟幀卡頓蠢棱。

2锌杀、優(yōu)化思路:

盡可能減少CPU、GPU資源消耗

CPU優(yōu)化思路點(diǎn):

1裳扯、盡量使用輕量級(jí)的對(duì)象抛丽,比如用不到事件處理的地方,可以考慮用CALayer取代UIView

2饰豺、不要頻繁地調(diào)用UIView的相關(guān)屬性亿鲜,比如frame、bound冤吨、transform等屬性蒿柳,盡量減少不必要的修改;

3漩蟆、盡量提前計(jì)算好布局垒探,在有需要時(shí)進(jìn)行一次性調(diào)整對(duì)應(yīng)的屬性,不要多次修改屬性怠李;

4圾叼、autolayout會(huì)比直接設(shè)置frame消耗更多的CPU資源蛤克;

5、圖片的size最好和uiview的size保持一致夷蚊;

6构挤、控制下線程的最大并發(fā)量;

7惕鼓、盡量把耗時(shí)的操作放到子線程處理筋现,如文本處理,尺寸計(jì)算箱歧、繪制矾飞;圖片的解碼

樣例性能對(duì)比(圖片解碼)

直接給視圖添加imageView,并設(shè)置圖片

UIImageView *imageView = [[UIImageView alloc] init];

imageView.frame=CGRectMake(100,100,100,56);

[self.view addSubview:imageView];

?self.imageView= imageView;

?self.imageView.image = [UIImage imageNamed:@"timg"];

性能檢測

直接設(shè)置image

同樣是給視圖添加imageView呀邢,并設(shè)置圖片

? ? UIImageView *imageView = [[UIImageView alloc] init];

? ? imageView.frame=CGRectMake(100,100,100,56);

[self.viewaddSubview:imageView];

?self.imageView= imageView;

? ? dispatch_async(dispatch_get_global_queue(0, 0), ^{

? ? ? ? // 獲取CGImage

? ? ? ? CGImageRefcgImage = [UIImageimageNamed:@"timg"].CGImage;

? ? ? ? // alphaInfo

? ? ? ? CGImageAlphaInfo alphaInfo = CGImageGetAlphaInfo(cgImage) & kCGBitmapAlphaInfoMask;

?BOOLhasAlpha =NO;

?if?(alphaInfo == kCGImageAlphaPremultipliedLast ||

? ? ? ? ? ? alphaInfo ==kCGImageAlphaPremultipliedFirst ||

? ? ? ? ? ? alphaInfo ==kCGImageAlphaLast||

? ? ? ? ? ? alphaInfo ==kCGImageAlphaFirst) {

hasAlpha =YES;

? ? ? ? }

? ? ? ? // bitmapInfo

? ? ? ? CGBitmapInfo bitmapInfo = kCGBitmapByteOrder32Host;

? ? ? ? bitmapInfo |= hasAlpha ?kCGImageAlphaPremultipliedFirst : kCGImageAlphaNoneSkipFirst;

? ? ? ? // size

? ? ? ? size_twidth =CGImageGetWidth(cgImage);

? ? ? ? size_theight =CGImageGetHeight(cgImage);

? ? ? ? // context

CGContextRefcontext =CGBitmapContextCreate(NULL, width, height,8,0,CGColorSpaceCreateDeviceRGB(), bitmapInfo);

? ? ? ? // draw

? ? ? ? CGContextDrawImage(context,CGRectMake(0,0, width, height), cgImage);

? ? ? ? // get CGImage

? ? ? ? cgImage =CGBitmapContextCreateImage(context);

? ? ? ? // into UIImage

? ? ? ? UIImage*newImage = [UIImageimageWithCGImage:cgImage];

? ? ? ? // release

? ? ? ? CGContextRelease(context);

? ? ? ? CGImageRelease(cgImage);

? ? ? ? // back to the main thread

? ? ? ? dispatch_async(dispatch_get_main_queue(), ^{

?self.imageView.image= newImage;

? ? ? ? });

? ? });

性能檢測

異步解碼后設(shè)置image

文本的子線程計(jì)算異步洒沦,主線程渲染

// 文字計(jì)算

[@"text" boundingRectWithSize:CGSizeMake(100, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:nil context:nil];? ??

// 文字繪制? ?

[@"text" drawWithRect:CGRectMake(0, 0, 100, 100) options:NSStringDrawingUsesLineFragmentOrigin attributes:nil context:nil];


GPU優(yōu)化思路:

1、盡量避免短時(shí)間內(nèi)大量圖片的顯示驼鹅,盡可能將多張圖片合成一張進(jìn)行顯示微谓;

2、GPU能處理的最大紋理尺寸是4096x4096输钩,一旦超過這個(gè)尺寸,就會(huì)占用CPU資源進(jìn)行處理仲智,所以紋理盡量不要超過這個(gè)尺寸买乃;

3、盡量減少視圖數(shù)量和層次钓辆;

4剪验、減少透明的視圖(alpha<1),不透明的就設(shè)置opaque為YES

5前联、盡量避免出現(xiàn)離屏渲染

3功戚、離屏渲染

在openGL中,GPU有兩種渲染方式

On-screen rendering: 當(dāng)前屏幕渲染似嗤,在當(dāng)前用于顯示屏幕緩沖區(qū)進(jìn)行渲染操作啸臀;(默認(rèn)方式)

Off-screen rendering: 離屏渲染,在當(dāng)前屏幕緩沖區(qū)以外新開辟一個(gè)緩沖區(qū)進(jìn)行渲染烁落。

離屏渲染比較消耗性能原因:

需要?jiǎng)?chuàng)建緩沖區(qū)乘粒;

整個(gè)過程需要多次切換上下文環(huán)境,先是從當(dāng)前屏幕切換到離屏伤塌,渲染結(jié)束后將離屏渲染區(qū)的渲染結(jié)果繪制到當(dāng)前屏幕灯萍,又需要切換上下文環(huán)境

離屏渲染觸發(fā):

光柵化,layer.shouldRasterize = YES

遮罩每聪,layer.mask

圓角旦棉,同時(shí)設(shè)置layer.masksToBounds = YES齿风、layer.cornerRadius大于0

考慮通過CoreGraphics繪制裁剪圓角,或者叫美工提供圓角圖片

陰影绑洛,layer.shadowXXX 救斑,如果設(shè)置了layer.shadowPath就不會(huì)產(chǎn)生離屏渲染。

4诊笤、卡頓檢測

“卡頓”主要是因?yàn)樵谥骶€程執(zhí)行了比較耗時(shí)的操作

可以添加Observer到主線程RunLoop中系谐,通過監(jiān)聽RunLoop狀態(tài)切換的耗時(shí),以達(dá)到監(jiān)控卡頓的目的

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末讨跟,一起剝皮案震驚了整個(gè)濱河市纪他,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌晾匠,老刑警劉巖茶袒,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異凉馆,居然都是意外死亡薪寓,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門澜共,熙熙樓的掌柜王于貴愁眉苦臉地迎上來向叉,“玉大人,你說我怎么就攤上這事嗦董∧富眩” “怎么了?”我有些...
    開封第一講書人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵京革,是天一觀的道長奇唤。 經(jīng)常有香客問我,道長匹摇,這世上最難降的妖魔是什么咬扇? 我笑而不...
    開封第一講書人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮廊勃,結(jié)果婚禮上懈贺,老公的妹妹穿的比我還像新娘。我一直安慰自己供搀,他們只是感情好隅居,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著葛虐,像睡著了一般胎源。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上屿脐,一...
    開封第一講書人閱讀 51,754評(píng)論 1 307
  • 那天涕蚤,我揣著相機(jī)與錄音宪卿,去河邊找鬼。 笑死万栅,一個(gè)胖子當(dāng)著我的面吹牛佑钾,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播烦粒,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼休溶,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了扰她?” 一聲冷哼從身側(cè)響起兽掰,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎徒役,沒想到半個(gè)月后孽尽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡忧勿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年杉女,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鸳吸。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡熏挎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出晌砾,到底是詐尸還是另有隱情婆瓜,我是刑警寧澤,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布贡羔,位于F島的核電站,受9級(jí)特大地震影響个初,放射性物質(zhì)發(fā)生泄漏乖寒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一院溺、第九天 我趴在偏房一處隱蔽的房頂上張望楣嘁。 院中可真熱鬧,春花似錦珍逸、人聲如沸逐虚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽叭爱。三九已至,卻和暖如春漱病,著一層夾襖步出監(jiān)牢的瞬間买雾,已是汗流浹背把曼。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留漓穿,地道東北人嗤军。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像晃危,于是被迫代替她去往敵國和親叙赚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容