亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS性能優化教程之頁面加載速率詳解

2019-10-21 18:39:52
字體:
來源:轉載
供稿:網友

前言

我認為在編碼過程中時刻注意性能影響是有必要的,但凡事都有個度,不能為了性能耽誤了開發進度。在時間緊急的情況下我們往往采用“quick and dirty”的方案來快速出成果,后面再迭代優化,即所謂的敏捷開發。與之相對應的是傳統軟件開發中的瀑布流開發流程。

卡頓產生的原因

iOS,性能優化,頁面加載速率

在 iOS 系統中,圖像內容展示到屏幕的過程需要 CPU 和 GPU 共同參與。CPU 負責計算顯示內容,比如視圖的創建、布局計算、圖片解碼、文本繪制等。隨后 CPU 會將計算好的內容提交到 GPU 去,由 GPU 進行變換、合成、渲染。之后 GPU 會把渲染結果提交到幀緩沖區去,等待下一次 VSync 信號到來時顯示到屏幕上。由于垂直同步的機制,如果在一個 VSync 時間內,CPU 或者 GPU 沒有完成內容提交,則那一幀就會被丟棄,等待下一次機會再顯示,而這時顯示屏會保留之前的內容不變。這就是界面卡頓的原因。

因此,我們需要平衡 CPU 和 GPU 的負荷避免一方超負荷運算。為了做到這一點,我們首先得了解 CPU 和 GPU 各自負責哪些內容。

iOS,性能優化,頁面加載速率

上面的圖展示了 iOS 系統下各個模塊所處的位置,下面話不多說了,來一起看看本文的正文。

之前搜羅了網上很多關于iOS性能優化方面的資料 ,本人和我的小伙伴們也用了一些時間針對自己的App進行了App的啟動速率、頁面的加載速率和 頁面的幀率方面進行了優化,所以結合了理論和實踐,把我們在實踐中主要踩過的坑和需要注意的東西 ,總結了一下,希望可以幫到正在準備進行App的性能優化的你。今天主要講一下App的頁面加載速率的優化。

##目的

為了找到真正使我們的App緩慢的原因,我們使用Xcode或者一些第三方平臺,進行數據測試;

一、頁面加載速率的定義

頁面加載速率:關于頁面的加載速度的統計,我們是測試一個viewcontroller從viewdidload的第一行到viewdidappear的最后一行所用的時間。

二、頁面加載速率的目標值

目標:頁面加載速率最好完美的時間在0.3s左右

為了弄明白,到底是什么原因讓我們的App,頁面加載速度相對來說比較慢,我們對頁面的UI進行優化,數據也進行了異步加載,我們hook數據一看,頁面的加載速度果然有所減少,但是減少的值大概只有0.03s,很明顯這個值不足以達到我們想要的效果,后來,通過寫了一些測試demo,針對空白頁面和有UI創建的頁面進行各種對比后,似乎和我們頁面加載過程中的push動畫有很大的關系;下面所做的實驗主要是為了驗證這個問題,針對這個問題,我選取了我們工程的一個類,對有push進入到這個頁面有過場動畫和沒有動畫進行測試,以下數據是測試結果:

iOS,性能優化,頁面加載速率

通過這個實驗,我們可以看出,不加動畫的話,我們的頁面加載的速度可以說是沒有任何的卡頓,超級迅速,但是如果把過場動畫給打開,單是動畫的時間就是在0.5s左右,而s我們是希望用戶在點擊跳轉頁面的時候,目標是頁面在0.3s左右呈現,這如果加動畫,這個目標很難達到;不過通過查找相關資料,我們證實了我們可以把如果有過場動畫的頁面,去掉動畫,而是通過我們自己去給用戶添加一個過場動畫,而這個時間是可以受到我們自己的控制,而不是傻傻的等動畫結束后再加載頁面內容。的這就是說,可以一邊動畫的時候,一邊已經開始加載頁面相關東西了,這樣可以大大的優化頁面加載時間。

三、優化前數據

iOS,性能優化,頁面加載速率

四、 優化后的數據

iOS,性能優化,頁面加載速率

到這里 ,你一定想問 :我該如何hook數據的???

五、如何進行數據的收集

給UIViewController 創建一個分類 eg :UIViewController+Swizzle

代碼如下

#import <UIKit/UIKit.h>#import <objc/runtime.h>@interface UIViewController (Swizzle)@property(nonatomic,assign) CFAbsoluteTime viewLoadStartTime;@end
#import "UIViewController+Swizzle.h"#import <objc/runtime.h>static char *viewLoadStartTimeKey = "viewLoadStartTimeKey";@implementation UIViewController (Swizzle)-(void)setViewLoadStartTime:(CFAbsoluteTime)viewLoadStartTime{objc_setAssociatedObject(self, &viewLoadStartTimeKey, @(viewLoadStartTime), OBJC_ASSOCIATION_COPY);}-(CFAbsoluteTime)viewLoadStartTime{return [objc_getAssociatedObject(self, &viewLoadStartTimeKey) doubleValue];}+ (void)load{static dispatch_once_t onceToken;dispatch_once(&onceToken, ^{SEL origSel = @selector(viewDidAppear:);SEL swizSel = @selector(swiz_viewDidAppear:);[UIViewController swizzleMethods:[self class] originalSelector:origSel swizzledSelector:swizSel];SEL vcWillAppearSel=@selector(viewWillAppear:);SEL swizWillAppearSel=@selector(swiz_viewWillAppear:);[UIViewController swizzleMethods:[self class] originalSelector:vcWillAppearSel swizzledSelector:swizWillAppearSel];SEL vcDidLoadSel=@selector(viewDidLoad);SEL swizDidLoadSel=@selector(swiz_viewDidLoad);[UIViewController swizzleMethods:[self class] originalSelector:vcDidLoadSel swizzledSelector:swizDidLoadSel];SEL vcDidDisappearSel=@selector(viewDidDisappear:);SEL swizDidDisappearSel=@selector(swiz_viewDidDisappear:);[UIViewController swizzleMethods:[self class] originalSelector:vcDidDisappearSel swizzledSelector:swizDidDisappearSel];SEL vcWillDisappearSel=@selector(viewWillDisappear:);SEL swizWillDisappearSel=@selector(swiz_viewWillDisappear:);[UIViewController swizzleMethods:[self class] originalSelector:vcWillDisappearSel swizzledSelector:swizWillDisappearSel];});}+ (void)swizzleMethods:(Class)class originalSelector:(SEL)origSel swizzledSelector:(SEL)swizSel{Method origMethod = class_getInstanceMethod(class, origSel);Method swizMethod = class_getInstanceMethod(class, swizSel);//class_addMethod will fail if original method already existsBOOL didAddMethod = class_addMethod(class, origSel, method_getImplementation(swizMethod), method_getTypeEncoding(swizMethod));if (didAddMethod) {class_replaceMethod(class, swizSel, method_getImplementation(origMethod), method_getTypeEncoding(origMethod));} else {//origMethod and swizMethod already existmethod_exchangeImplementations(origMethod, swizMethod);}}- (void)swiz_viewDidAppear:(BOOL)animated{[self swiz_viewDidAppear:animated];if (self.viewLoadStartTime) {CFAbsoluteTime linkTime = (CACurrentMediaTime() - self.viewLoadStartTime);NGLog(@" %f s--------------------ssssss %@:速度:   %f s",self.viewLoadStartTime, self.class,linkTime );self.viewLoadStartTime = 0;}}-(void)swiz_viewWillAppear:(BOOL)animated{[self swiz_viewWillAppear:animated];}-(void)swiz_viewDidDisappear:(BOOL)animated{[self swiz_viewDidDisappear:animated];}-(void)swiz_viewWillDisappear:(BOOL)animated{[self swiz_viewWillDisappear:animated];}-(void)swiz_viewDidLoad{self.viewLoadStartTime =CACurrentMediaTime();NSLog(@" %@swiz_viewDidLoad startTime:%f",self.class, self.viewLoadStartTime );[self swiz_viewDidLoad];}@end

##如何進行優化

方法:充分利用push 動畫的時間 ,使頁面在進入的時候,同事進行類似push 動畫,這樣可以充分減少頁面的加載速度(不包括網絡請求時間,網絡的請求的時間我們這邊不好控制)。

具體實現代碼如下

重寫 push方法

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated {if (self.viewControllers.count > 0) {viewController.hidesBottomBarWhenPushed = YES;if (animated) {CATransition *animation = [CATransition animation];animation.duration = 0.4f;animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];animation.type = kCATransitionPush;animation.subtype = kCATransitionFromRight;[self.navigationController.view.layer addAnimation:animation forKey:nil];[self.view.layer addAnimation:animation forKey:nil];[super pushViewController:viewController animated:NO];return;}}[super pushViewController:viewController animated:animated];}

通過控制臺 ,我們就可以看到頁面的加載的速度了,主要的方法是swiz_viewDidLoad  和swiz_viewDidAppear

六、優化后的結果

iOS,性能優化,頁面加載速率

七、結果分析

我們可以看出,我們的頁面的viewDidAppear是在過場動畫結束后被調用的,而過場動畫的持續時間是0.5秒左右。所以我們的頁面平均在0.8秒左右的頁面,如果要優化得更好,我們可以看有沒有方法解決這個問題,如果能替換掉動畫,讓動畫在進行的過程中 ,頁面的加載也在異步的進行中,這樣 我們就可以縮短頁面的加載時間了;注:但這個加載對加載h5的頁面不適用;

總結:

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


注:相關教程知識閱讀請移步到IOS開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久久久久国产精品视频| 欧美中文字幕视频在线观看| 一区二区国产精品视频| 久久久av一区| 久久久久久尹人网香蕉| xxxxx成人.com| 日韩欧美极品在线观看| 日本国产精品视频| 91在线免费看网站| 日韩欧美在线字幕| 97久久超碰福利国产精品…| 成人春色激情网| 91探花福利精品国产自产在线| 久久99精品视频一区97| 国产精品久久久亚洲| 国产美女直播视频一区| www.日本久久久久com.| 国产精品一区二区在线| 欧美黄色三级网站| 中文字幕日韩精品在线观看| 麻豆乱码国产一区二区三区| 日韩欧美中文在线| 色yeye香蕉凹凸一区二区av| 国产一区二区成人| 日韩精品极品视频免费观看| 免费99精品国产自在在线| 日日摸夜夜添一区| 亚洲电影免费观看高清完整版在线| 中文字幕日韩免费视频| 亚洲欧洲在线免费| 国产91久久婷婷一区二区| 亚洲激情小视频| 51久久精品夜色国产麻豆| 国产91久久婷婷一区二区| 7m精品福利视频导航| 日韩视频免费看| 久久亚洲成人精品| 久久精品一偷一偷国产| 国产大片精品免费永久看nba| 一区二区三区www| 96精品久久久久中文字幕| 国产亚洲视频在线| 国产精品一区久久| 26uuu日韩精品一区二区| 国产精品丝袜久久久久久高清| 国产成人精品a视频一区www| 日韩免费高清在线观看| 成人黄色免费看| 91综合免费在线| 国产精品久久久久久五月尺| 日韩久久免费电影| 亚洲网在线观看| 午夜精品久久久99热福利| 亚洲无av在线中文字幕| 亚洲欧美日韩精品久久亚洲区| 久久人人爽人人| 欧美视频专区一二在线观看| 欧美日韩在线影院| 久久理论片午夜琪琪电影网| 最近2019中文免费高清视频观看www99| 这里只有精品视频在线| 91久久国产精品| 欧美成人高清视频| 中文字幕日本精品| 精品网站999www| 亚洲第五色综合网| 亚洲欧美日韩一区二区在线| 欧美性猛交xxxx久久久| 欧美不卡视频一区发布| 欧美在线视频一区二区| 成人国产精品久久久| 国产国语刺激对白av不卡| 3344国产精品免费看| 韩国精品美女www爽爽爽视频| 国产精品视频大全| 性亚洲最疯狂xxxx高清| 久久的精品视频| 国产美女久久久| 在线亚洲国产精品网| 亚洲香蕉av在线一区二区三区| 欧美极品第一页| 精品国产一区二区三区四区在线观看| 国产精品久久久av久久久| 欧美孕妇性xx| 91久久国产婷婷一区二区| 欧美激情在线有限公司| 这里只有视频精品| 国产一区二区三区四区福利| 日韩一区av在线| 永久免费看mv网站入口亚洲| 国产日韩综合一区二区性色av| 国产一区二区三区欧美| 538国产精品一区二区免费视频| 欧美日韩国产精品一区| 久久影院模特热| 欧美激情综合色| 亚洲高清在线观看| 国产91在线高潮白浆在线观看| 欧美日韩免费观看中文| 日韩精品在线播放| 亚洲天堂免费观看| 欧美激情免费在线| 欧美亚洲成人网| 国产美女精品免费电影| 欧美综合第一页| 欧美最猛性xxxxx免费| 久久亚洲成人精品| 久久97精品久久久久久久不卡| 亚洲欧美激情视频| 91爱视频在线| 国产亚洲一区二区精品| 欧美成人免费全部观看天天性色| 亚洲国产精久久久久久久| 亚洲二区中文字幕| 日本精品视频在线| 国产色婷婷国产综合在线理论片a| 国产在线观看91精品一区| 欧美一区二区视频97| 欧美日韩国产综合新一区| 国产欧美亚洲精品| 日本免费久久高清视频| 日韩精品中文字幕在线播放| 欧美黄色片在线观看| 在线中文字幕日韩| 欧美电影在线观看网站| 91精品视频在线免费观看| 91国产美女在线观看| 欧美人在线观看| 亚洲第一精品电影| 亚洲欧美日韩国产精品| 亚洲在线www| 亚洲国产中文字幕在线观看| 91久久久精品| 国产精品视频区1| 欧美大胆a视频| 精品高清美女精品国产区| 欧美激情综合亚洲一二区| 国产精品视频专区| 国产精品海角社区在线观看| 日韩一中文字幕| 黄色91在线观看| 97国产suv精品一区二区62| 成人羞羞国产免费| 91最新国产视频| 久久网福利资源网站| 亚洲无亚洲人成网站77777| 午夜精品久久久久久久久久久久久| 亚洲最大的网站| 欧美亚洲一级片| 超薄丝袜一区二区| 亚洲va欧美va国产综合久久| 亚洲黄页视频免费观看| 久久伊人91精品综合网站| 久久久久久久国产精品视频| 91免费国产视频| 久久精品国产电影| 亚洲欧美在线磁力| 91精品国产777在线观看| 国产亚洲精品一区二区| 中文字幕不卡av| 俺去了亚洲欧美日韩| 亚洲欧美日韩天堂| 国产精品久久二区| 韩剧1988免费观看全集|