131-1198-7613
NEWS
网站建设、网站制作、网站设计等相关资讯

百度更新seo算法是什么意思_百度搜刮引擎算法更新(百度搜索引擎算法更新)

首页 >> 新闻资讯 作者:磁力SEO 来源:磁力SEO - 搜索引擎优化技巧 日期:2025-02-21

(点击上方公众号,可快速关注)

  泉源:hi_xgb(@hi_xgb )

  链接:https://www.jianshu.com/p/1b5cbf155b31

  若有好文章投稿,请点击 → 这里了解详情

  前言

  在软件开发领域里经常能听到这样一句话,“过早的优化是万恶之源”,不要过早优化或许太过优化。我觉得在编码过程中时辰寄望机能影响是有必要的,但凡事都有个度,不能为了机能延伸了开发进度。在时间垂危的情况下我们通常采纳“quick and dirty”的方案来快速出成果,反面再迭代优化,即所谓的灵敏开发。与之相对应的是传统软件开发中的瀑布流开发流程。

  卡顿产生的缘故因由

  

  在 iOS 系统中,图像内容展示到屏幕的过程须要 CPU 和 GPU 配合到场。CPU 负责打定表示内容,好比视图的创建、结构打定、图片解码、文本绘制等。随后 CPU 会将打定好的内容提交到 GPU 去,由 GPU 进行变动、合成、渲染。之后 GPU 会把渲染成果提交到帧缓冲区去,等候下一次 VSync 信号到来时表示到屏幕上。因为垂直同步的机制,如果在一个 VSync 时间内,CPU 或许 GPU 没有完成内容提交,则那一帧就会被扬弃,等候下一次机缘再表示,而这时表示屏会生存之前的内容稳固。这就是界面卡顿的缘故因由。

  因此,我们须要平衡 CPU 和 GPU 的负荷禁止一方超负荷运算。为了做到这一点,我们首先得了解 CPU 和 GPU 各自大责哪些内容。

  

  上面的图展示了 iOS 系统下各个模块所处的位置,下面我们再详细看一下 CPU 和 GPU 对应了哪些利用。

百度更新seo算法是什么意思_百度搜索引擎算法更新 百度更新seo算法是什么意思_百度搜刮引擎算法更新(百度搜索引擎算法更新) 百度词库

  CPU 斲丧型使命

  结构打定

  结构打定是 iOS 中最为常见的斲丧 CPU 资源的处所,如果视图层级关系比较复杂,打定出所有图层的结构信息就会斲丧一部门时间。因此我们应该尽管提前打定好结构信息,然后在合适的机缘调整对应的属性。还要禁止不必要的更新,只在真正发生了结构改变时再更新。

  对象创建

  对象创建过程陪伴着内存分配、属性配置、以致尚有读取文件等利用,比较斲丧 CPU 资源。尽管用轻量的对象取代重量的对象,可以对机能有所优化。好比 CALayer 比 UIView 要轻量许多,如果视图元素不须要响应触摸事故,用 CALayer 会加倍合适。

  通过 Storyboard 创建视图对象还会涉及到文件反序列化利用,其资源斲丧会比直接通过代码创建对象要大很是多,在机能敏感的界面里,Storyboard 并不是一个好的技术选择。

  对于列表典范的页面,还可以参考 UITableView 的复用机制。每次要初始化 View 对象时先凭据 identifier 从缓存池里取,能取到就复用这个 View 对象,取不到再真正实施初始化过程。滑动屏幕时,会将滑出屏幕外的 View 对象凭据 identifier 放入缓存池,新进入屏幕可见局限内的 View 又凭据前面的规则来决定是否要真正初始化。

  Autolayout

  Autolayout 是苹果在 iOS6 之后新引入的结构技术,在大大都情况下这一技术都能大大抬举开发速度,出格是在须要处置惩罚处罚多语言时。好比阿拉伯语下结构是从右往左,通过 Autolayout 配置 leading 和 trailing 即可。

  可是 Autolayout 对于复杂视图来说经常会产生严肃的机能标题,对于机能敏感的页面建议照旧操纵手动结构的方式,并节制好刷新频率,做到真正须要调整结构时再从头结构。

  文本打定

  如果一个界面中包含大量文本(好比微博、微信朋侪圈等),文本的宽高打定会占用很大一部门资源,并且不行禁止。

  一个比较常见的场景是在 UITableView 中,heightForRowAtIndexPath这个方法会被频繁挪用,即使不是耗时的打定在挪用次数多了之后也会带来机能斲丧。这里的优化就是尽管禁止每次都从头进行文本的行高打定,可以在获取到 Model 数据后就凭据文本内容打定好结构信息,然后将这份结构信息作为一个属性保存到对应的 Model 中,这样在 UITableView 的回调中就可以直接操纵 Model 中的属性,镌汰了文本的打定。

  文本渲染

  

  屏幕上能看到的所有文本内容控件,包含 UIWebView,在底层都是通过 CoreText 排版、绘制为 Bitmap 表示的。常见的文本控件 (UILabel、UITextView 等),其排版和绘制都是在主线程进行的,当表示大量文本时,CPU 的压力会很是大。

  这一部门的机能优化就须要我们放弃操纵系统提供的上层控件转而直接操纵 CoreText 进行排版节制。

  Wherever possible, try to avoid making changes to the frame of a view that contains text, because it will cause the text to be redrawn. For example, if you need to display a static block of text in the corner of a layer that frequently changes size, put the text in a sublayer instead.

  上面这段话引用自 iOS Core Animation: Advanced Techniques,翻译过来的意思就是说包含文本的视图在改变结构时会触发文本的从头渲染,对于静态文本我们应该尽管镌汰它所在视图的结构修改。

百度更新seo算法是什么意思_百度搜索引擎算法更新 百度更新seo算法是什么意思_百度搜刮引擎算法更新(百度搜索引擎算法更新) 百度词库

  图像的绘制

  图像的绘制每每是指用那些以 CG 开头的方法把图像绘制到画布中,然后从画布创建图片并表示的过程。前面的模块图里介绍了 CoreGraphic 是作用在 CPU 之上的,因此挪用 CG 开头的方法斲丧的是 CPU 资源。我们可以将绘制过程放到配景线程,然后在主线程里将成果配置到 layer 的 contents 中。代码如下:

  - (void)display{

  dispatch_async(backgroundQueue,^{

  CGContextRef ctx= CGBitmapContextCreate(...);

  // draw in context...

  CGImageRef img= CGBitmapContextCreateImage(ctx);

  CFRelease(ctx);

  dispatch_async(mainQueue,^{

  layer.contents= img;

  });

  });

  }

  图片的解码

  Once an image file has been loaded, it must then be decompressed. This decompression can be a computationally complex task and take considerable time. The decompressed image will also use substantially more memory than the original.

  图片被加载后须要解码,图片的解码是一个复杂耗时的过程,并且须要占用比原始图片还多的内存资源。

  为了节省内存,iOS 系统会延长解码过程, 在图片被配置到 layer 的 contents 属性或许配置成 UIImageView 的 image 属性后才会实施解码过程,可是这两个利用都是在主线程进行,照旧会带来机能标题。

  如果想要提前解码,可以操纵 ImageIO 或许提前将图片绘制到 CGContext 中,这部门实践可以参考 iOS Core Animation: Advanced Techniques

  这里多提一点,常用的 UIImage 加载方法有 imageNamed 和 imageWithContentsOfFile。其中 imageNamed 加载图片后会连忙解码,并且系统会将解码后的图片缓存起来,可是这个缓存战略是不公开的,我们无法知道图片什么时间会被释放。因此在一些机能敏感的页面,我们还可以用 static 变量 hold 住 imageNamed 加载到的图片禁止被释放掉,以空间换时间的方式来前进机能。

  GPU斲丧型使命

  相对于 CPU 来说,GPU 精明的事情比较单一:吸取提交的纹理(Texture)和极点描摹(三角形),应用变动(transform)、混合并渲染,然后输出到屏幕上。宽泛的说,大大都 CALayer 的属性都是用 GPU 来绘制。

  以下一些利用会低沉 GPU 绘制的机能,

  大量几多结构

  所有的 Bitmap,包含图片、文本、栅格化的内容,最终都要由内存提交到显存,绑定为 GPU Texture。不论是提交到显存的过程,照旧 GPU 调整和渲染 Texture 的过程,都要斲丧不少 GPU 资源。当在较短时间表示大量图片时(好比 TableView 存在很是多的图片并且快速滑动时),CPU 占用率很低,GPU 占用很是高,界面仍然会掉帧。禁止这种情况的方法只能是尽管镌汰在短时间内大量图片的表示,尽或许将多张图片合成为一张进行表示。

  此外当图片过大,横跨 GPU 的最大纹理尺寸时,图片须要先由 CPU 进行预处置惩罚处罚,这对 CPU 和 GPU 城市带来额外的资源斲丧。

  视图的肴杂

  当多个视图(或许说 CALayer)重叠在一路表示时,GPU 会首先把他们肴杂到一路。如果视图结构过于复杂,肴杂的过程也会斲丧许多 GPU 资源。为了减轻这种情况的 GPU 斲丧,应用应当尽管镌汰视图数目和层次,并且镌汰不必要的透明视图。

  离屏渲染

  离屏渲染是指图层在被表示之前是在当前屏幕缓冲区以外开发的一个缓冲区进行渲染利用。

  离屏渲染须要多次切换上下文情况:先是从当前屏幕(On-Screen)切换到离屏(Off-Screen);等到离屏渲染结束以后,将离屏缓冲区的渲染成果表示到屏幕上又须要将上下文情况从离屏切换到当前屏幕,而上下文情况的切换是一项高开销的动作。

  会造成 offscreen rendering 的缘故因由有:

阴影(UIView.layer.shadowOffset/shadowRadius/…)

圆角(当 UIView.layer.cornerRadius 和 UIView.layer.maskToBounds 一路操纵时)

图层蒙板

开启光栅化(shouldRasterize = true)

  操纵阴影时同时配置 shadowPath 就能禁止离屏渲染大大抬举机能,反面会有一个 Demo 来演示;圆角触发的离屏渲染可以用 CoreGraphics 将图片处置惩罚处罚成圆角来禁止。

  CALayer 有一个 shouldRasterize 属性,将这个属性配置成 true 后就开启了光栅化。开启光栅化后会将图层绘制到一个屏幕外的图像,然后这个图像将会被缓存起来并绘制到现实图层的 contents 和子图层,对于有许多的子图层或许有复杂的成果应用,这样做就会比重绘所有事务的所有帧来加倍高效。可是光栅化原始图像须要时间,并且会斲丧额外的内存。

  光栅化也会带来必定的机能斲丧,是否要开启就要凭据现实的操纵场景了,图层内容频繁厘革时不建议操纵。最好照旧用 Instruments 比对开启前后的 FPS 来看是否起到了优化成果。

  寄望:

  shouldRasterize = true 时记得同时配置 rasterizationScale

  Instruments 操纵

  

  Instruments 是一系列工具集,我们这里只演示 Core Animation 的操纵。在 Core Animation 选项右下方会看到如下选项,

  

  Color Blended Layers

  这个选项选项基于渲染水平对屏幕中的肴杂地域进行绿到红的高亮表示,越红表示机能越差,会对帧率等指标造成较大的影响。红色每每是因为多个半透明图层叠加引起。

  Color Hits Green and Misses Red

  当 UIView.layer.shouldRasterize = YES 时,耗时的图片绘制会被缓存,并当做一个简朴的扁平图片来呈现。这时间,如果页面的其他区块(好比 UITableViewCell 的复用)操纵缓存直接命中,就表示绿色,反之,如果不命中,这时就表示红色。红色越多,机能越差。因为栅格化生成缓存的过程是有开销的,如果缓存能被大量命中和有用操纵,则总体上会低沉开销,反之则意味着要频繁生成新的缓存,这会让机能标题雪上加霜。

  Color Copied Images

  对于 GPU 不支撑的色彩花样的图片只能由 CPU 来处置惩罚处罚,把这样的图片标为蓝色。蓝色越多,机能越差。

  Color Immediately

  每每 Core Animation Instruments 以每毫秒 10 次的频率更新图层调试颜色。对某些成果来说,这显然太慢了。这个选项就可以用来配置每帧都更新(或许会影响到渲染机能,并且会导致帧率测量不准,所以不要不断都配置它)。

  Color Misaligned Images

  这个选项检查了图片是否被缩放,以及像素是否对齐。被放缩的图片会被标志为黄色,像素差池齐则会标注为紫色。黄色、紫色越多,机能越差。

  Color Offscreen-Rendered Yellow

  这个选项会把那些离屏渲染的图层表示为黄色。黄色越多,机能越差。这些表示为黄色的图层很或许须要用 shadowPath 或许 shouldRasterize 来优化。

  Color OpenGL Fast Path Blue

  这个选项会把任何直接操纵 OpenGL 绘制的图层表示为蓝色。蓝色越多,机能越好。如果仅仅操纵 UIKit 或许 Core Animation 的 API,那么不会有任何成果。

  Flash Updated Regions

  这个选项会把重绘的内容表示为黄色。不该呈现的黄色越多,机能越差。每每我们渴望只是更新的部门被标志完黄色。

  演示

  上述几个选项中常用来检测机能的是 Color Blended Layers、Offscreen-Rendered Yellow 和 Color Hits Green and Misses Red。下面我重点演示一下离屏渲染和光栅化的检测,写了一个简朴的 Demo 配置了阴影成果,代码如下:

  view.layer.shadowOffset= CGSizeMake(1,1);

  view.layer.shadowOpacity= 1.0;

  view.layer.shadowRadius= 2.0;

  view.layer.shadowColor= [UIColor blackColor].CGColor;

  // view.layer.shadowPath = CGPathCreateWithRect(CGRectMake(0, 0, 50, 50), NULL);

  shadowPath 没有配置时用 Instruments 检测 FPS 底子在 20 以下(iPhone6设备),配置了 shadowPath 后底子维持在 55 左右,机能抬举很是显着。

  下面来看一下光栅化的检测,代码如下,

  view.layer.shouldRasterize= YES;

  view.layer.rasterizationScale= [UIScreen mainScreen].scale;

  勾选 Color Hits Green and Misses Red 选项后表示如下:

  

  我们可以看到在静止时缓存都收效了,在快速滑动时缓存底子不起作用,因此是否要开启光栅化照旧得凭据详细场景,用 Instruments 检测开启前后的机能来决定。

  总结

  本文紧张总结了机能调优的一些理论常识,反面还介绍了 Instruments 中 Core Animation 的一些机能检测指标用法。机能优化最重要的是要操纵工具来检测而不是猜测,先查察是否有离屏渲染等标题,再用 Time Profiler 阐明一下耗时的函数挪用。修改后再用工具阐明是否有改善,一步一步实施,小心过细。

  建议大家也现实下手阐明一下自己的应用,加深一下印象,enjoy~

  参考资料

https://blog.ibireme.com/2015/11/12/smooth_user_interfaces_for_ios/

https://www.samirchen.com/use-instruments/

https://apprize.info/apple/ios_5/13.html

觉得本文对你有资助?请分享给更多人

关注「 iOS大全 」

看更多精选 iOS 技术文章

Tags: 机能 算法 表示 图片 图层 视图 结构 缓存 文本 打定 光栅 过程 选项 凭据 内容

服务热线

131-1198-7613

功能和特性

价格和优惠

获取内部资料

微信服务号