首页 SEO技术 正文

Android 屏幕刷新机制与优化打算~ (android是什么)

SEO技术 2024-08-16 10

本文目录导航:

Android 屏幕刷新机制与优化打算~

揭秘Android屏幕刷新机制与深度优化战略

在60Hz的环球里,每个屏幕像素的扫描周期仅为16.6毫秒,而GPU犹如精细的画师,接纳着CPU精心绘制的数据并启动画面的缓存。

但是,一旦帧数据的起源变得凌乱,比如来自不同帧,就或许造成画面撕裂的难堪瞬间。

Android的处置打算是驳回双缓冲技术与VSync同步,确保在Vsync信号的疏导下,画面数据能在失当的机遇降级,从而防止数据重写,保障视觉的流利性。

掉帧现象,往往是CPU的绘制速度跟不上屏幕降级的需求,这就像一场接力赛中的落后,屏幕被锁定在旧的画面,用户体验大打折扣。

优化的关键在于优化UI的绘制速度,确保每个16.6毫秒内都能成功绘制,从而防止卡顿的出现,给用户带来更顺滑的视觉体验。

在层级优化方面,咱们应当精简层级,优化绘制效率。

LinearLayout作为首选,它的效率更高。

正当经常使用RelativeLayout和merge标签,兼偏重复规划时,merge作为根节点可以节俭资源。

例如,当引入子视图时,经过援用预先定义的merge_layout,并由自定义的MyLinearLayout担任灵活参与子视图,如这样:

```xml```

merge标签需留意,它自身不允许padding,应将这些属性设置在父级LinearLayout上,以坚持规划整洁。

同时,ViewStub作为一种轻量级视图,能节俭空间,实用于显示/暗藏的控制,如在有数据时显示自动界面。

在通常中,咱们可以经过XML规划中引入ViewStub,并经过按钮的点击事情来触发视图的显示或暗藏。

在ActivityMain中,咱们创立ClickEvent类,奇妙地治理ViewStub的生命周期,确保其在要求时才被加载,防止资源的糜费。

Android的性能优化不只仅逗留在UI层面,还包括内存、网络、启动、Bitmap、多线程、存储和体积优化等多个维度。想要更深化地了解这些优化战略,介绍参考以下威望资料:

经过这些资源,你将收获关于Android性能优化的片面了解,优化你的名目性能,让你的运行在剧烈的竞争中锋芒毕露。

Webpack如何成功耐久化缓存

这次给大家带来Webpack如何成功耐久化缓存,Webpack成功耐久化缓存的留意事项有哪些,上方就是实战案例,一同来看一下。

前言最近在看 webpack 如何做耐久化缓存的内容,发现其中还是有一些坑点的,正好有时期就将它们整顿总结一下,读完本文你大抵能够明确:什么是耐久化缓存,为什么做耐久化缓存?webpack 如何做耐久化缓存?webpack 做缓存的一些留意点。

耐久化缓存首先咱们要求去解释一下,什么是耐久化缓存,在如今前后端分别的运行大行其道的背景下,前端 html,css,js 往往是以一种静态资源文件的方式存在于主机,经过接口来失掉数据来展现灵活内容。

这就触及到公司如何去部署前端代码的疑问,所以就触及到一个降级部署的疑问,是先部署页面,还是先部署资源?先部署页面,再部署资源:在二者部署的时时期隔内,假设有用户访问页面,就会在新的页面结构中加载旧的资源,并且把这个旧版本资源当做新版本缓存起来,其结果就是:用户访问到一个样式杂乱的页面,除非手动去刷新,否则在资源缓存过时之前,页面会不时处于杂乱的形态。

先部署资源,再部署页面:在部署时时期隔内,有旧版本的资源本地缓存的用户访问网站,由于恳求的页面是旧版本,资源援用没有扭转,阅读器将间接经常使用本地缓存,这样属于反常状况,但没有本地缓存或许缓存过时的用户在访问网站的时刻,就会出现旧版本页面加载新版本资源的状况,造成页面口头失误。

所以咱们要求一种部署战略来保障在降级咱们线上的代码的时刻,线上用户也能平滑地过渡并且正确关上咱们的网站。

介绍先看这个回答:大公司里怎么开发和部署前端代码?当你读完上方的回答,大抵就会明确,如今比拟成熟的耐久化缓存打算就是在静态资源的名字前面加 hash 值,由于每次修正文件生成的 hash 值不一样,这样做的好处在于增量式颁布文件,防止笼罩掉之前文件从而造成线上的用户访问失效。

由于只需做到每次颁布的静态资源(css, js, img)的称号都是举世无双的,那么我就可以:针对 html 文件:不开启缓存,把 html 放到自己的主机上,封锁主机的缓存,自己的主机只提供 html 文件和数据接口针对静态的 js,css,图片等文件:开启 cdn 缓和存,将静态资源上行到 cdn 服务商,咱们可以对资源开启常年缓存,由于每个资源的门路都是举世无双的,所以不会造成资源被笼罩,保障线上用户访问的稳固性。

每次颁布降级的时刻,先将静态资源(js, css, img) 传到 cdn 服务上,而后再上行 html 文件,这样既保障了老用户能否反常访问,又能让新用户看到新的页面。

上方大抵引见了下干流的前端耐久化缓存打算,那么咱们为什么要求做耐久化缓存呢?用户经常使用阅读器第一次性访问咱们的站点时,该页面引入了各式各样的静态资源,假设咱们能做到耐久化缓存的话,可以在 http 照应头加上 Cache-control 或 Expires 字段来设置缓存,阅读器可以将这些资源逐一缓存到本地。

用户在后续访问的时刻,假设要求再次恳求雷同的静态资源,且静态资源没有过时,那么阅读器可以间接走本地缓存而不用再经过网络恳求资源。

webpack 如何做耐久化缓存上方便捷引见完耐久化缓存,上方这个才是重点,那么咱们应该如何在 webpack 中启动耐久化缓存的呢,咱们要求做到以下两点:保障 hash 值的惟一性,即为每个打包后的资源生成一个举世无双的 hash 值,只需打包内容不分歧,那么 hash 值就不分歧。

保障 hash 值的稳固性,咱们要求做到修正某个模块的时刻,只要受影响的打包后文件 hash 值扭转,与该模块有关的打包文件 hash 值不变。

hash 文件名是成功耐久化缓存的第一步,目前 webpack 有两种计算 hash 的方式(hash] 和 chunkhash])hash 代表每次 webpack 在编译的环节中会生成惟一的 hash 值,在名目中任何一个文件改动后就会被从新创立,而后 webpack 计算新的 hash 值。

chunkhash 是依据模块计算进去的 hash 值,所以某个文件的改动只会影响它自身的 hash 值,不会影响其余文件。

所以假设你只是单纯地将一切内容打包成同一个文件,那么 hash 就能够满足你了,假设你的名目触及到拆包,分模块启动加载等等,那么你要求用 chunkhash,来保障每次降级之后只要相关的文件 hash 值出现扭转。

所以咱们在一份具备耐久化缓存的 webpack 性能应该长这样 = { entry: dirname + /src/, output: { path: dirname + /dist, filename: name].chunkhash:8], }}上方代码的含意就是:以 为入口,将一切的代码所有打包成一个文件取名为 并放到 dist 目录下,如今咱们可以在每次降级名目标时刻做到生成新命名的文件了。 屏幕刷新机制与优化打算~

假设是接待便捷的场景,这样做就够了,但是在大型多页面运行中,咱们往往要求对页面启动性能优化:分别业务代码和第三方的代码:之所以将业务代码和第三方代码分别进去,是由于业务代码降级频率高,而第三方代码降级迭代速度慢,所以咱们将第三方代码(库,框架)启动抽离,这样可以充沛应用阅读器的缓存来加载第三方库。

按需加载:比如在经常使用 React-Router 的时刻,当用户要求访问到某个路由的时刻再去加载对应的组件,那么用户没有必要在一开局的时刻就将一切的路由组件下载到本地。

在多页面运行中,咱们往往可以将公共模块启动抽离,比如 header, footer 等等,这样页面在启动跳转的时刻这些公共模块由于存在于缓存里,就可以间接启动加载了,而不是再启动网络恳求了。

那么如何启动拆包,分模块启动加载,这就要求 webpack 内置插件:CommonsChunkPlugin,上方我将经过一个例子,来诠释 webpack 该如何启动性能。

本文的代码放在我的 Github 上,有兴味的可以下载来看看:git cloneblog/code/multiple-page-webpack-demonpm install阅读上方的内容之前我剧烈倡导你看下我之前的文章:深化了解 webpack 文件打包机制,了解 webpack 文件的打包的机制有助于你更好地成功耐久化缓存。

例子大略是这样形容的:它由两个页面组成 pageA 和 pageB// src/ componentA from ./common/componentA;// 经常使用到 jquery 第三方库,要求抽离,防止业务打包文件过大import $ from jquery;// 加载 css 文件,一局部为公共样式,一局部为独有样式,要求抽离import ./css/ ./css/;(componentA);($( do something ));// src/// 页面 A 和 B 都用到了公共模块 componentA,要求抽离,防止重复加载import componentA from ./common/componentA;import componentB from ./common/componentB;import ./css/ ./css/;(componentA);(componentB);// 用到异步加载模块 asyncComponent,要求抽离,加载首屏速度(xxxxx)(click, () => { import( /* webpackChunkName: async */ ./common/)((async) => { async(); })})// 公共模块基本长这样export default component X;上方的页面内容基本便捷触及到了咱们拆分模块的三种形式:拆分公共库,按需加载和拆分公共模块。

那么接上去要来性能 webpack:const path = require(path);const webpack = require(webpack);const ExtractTextPlugin = require(extract-text-webpack-plugin); = { entry: { pageA: (dirname, ./src/)], pageB: (dirname, ./src/), }, output: { path: (dirname, ./dist), filename: js/name].chunkhash:8], chunkFilename: js/name].chunkhash:8] }, module: { rules: { // 用正则去婚配要用该 loader 转换的 CSS 文件 test: /$/, use: ({ fallback: style-loader, use: css-loader] }) } ] }, plugins: new ({ name: common, minChunks: 2, }), new ({ name: vendor, minChunks: ({ resource }) => ( resource && (node_modules) >= 0 && (/$/) ) }), new ExtractTextPlugin({ filename: `css/name].chunkhash:8]`, }), ]}第一个 CommonsChunkPlugin 用于抽离公共模块,相当于是说 webpack 大佬,假设你看到某个模块被加载两次即以上,那么请你帮我移到 common chunk 外面,这里 minChunks 为 2,粒度拆解最细,你可以依据自己的实践状况,看选用是用多少次模块才将它们抽离。

第二个 CommonsChunkPlugin 用来提取第三方代码,将它们启动抽离,判别资源能否来自 node_modules,假设是,则说明是第三方模块,那就将它们抽离。

相当于是通知 webpack 大佬,假设你看见某些模块是来自 node_modules 目录的,并且名字是 开头的话,费事把他们都移到 vendor chunk 里去,假设 vendor chunk 不存在的话,就创立一个新的。

这样性能有什么好处,随着业务的增长,咱们依赖的第三方库代码很或许会越来越多,假设咱们专门性能一个入口来寄存第三方代码,这时刻咱们的 就会变成:// 不利于拓展 = { entry: { app: ./src/, vendor: vue, axio, vue-router, vuex, // more ], },} 第三个 ExtractTextPlugin 插件用于将 css 从打包好的 js 文件中抽离,生成独立的 css 文件,想象一下,当你只是修正了上样式,并没有修正页面的性能逻辑,你必需不宿愿你的 js 文件 hash 值变化,你必需是宿愿 css 和 js 能够相互离开,且互不影响。

运转 webpack 后可以看到打包之后的成果:├── css│ ├── │ ├── │ └── └── js ├── ├── ├── ├── └── 可以看出 css 和 js 曾经分别,并且咱们对模块启动了拆分,保障了模块 chunk 的惟一性,当你每次降级代码的时刻,会生成不一样的 hash 值。

惟一性有了,那么咱们要求保障 hash 值的稳固性,试想下这样的场景,你必需不宿愿你修正某局部的代码(模块,css)造成了文件的 hash 值全变了,那么显然是不理智的,那么咱们去做到 hash 值变化最小化呢?换句话说,咱们就要找出 webpack 编译中会造成缓存失效的起因,想方法去处置或优化它?影响 chunkhash 值变化重要由以下四个局部惹起的:蕴含模块的源代码webpack 用于启动运转的 runtime 代码webpack 生成的模块 moduleid(包括蕴含模块 id 和被援用的依赖模块 id)chunkID这四局部只需有恣意部散出现变化,生成的分块文件就不一样了,缓存也就会失效,上方就从四个局部逐一引见:一、源代码变化:显然不用多说,缓存必要求刷新,不然就有疑问了二、webpack 启动运转的 runtime 代码:看过我之前的文章:深化了解 webpack 文件打包机制 就会知道,在 webpack 启动的时刻要求口头一些启动代码。

(function(modules) { windowwebpackJsonp] = function webpackJsonpCallback(chunkIds, moreModules) { // ... }; function webpack_require(moduleId) { // ... } webpack_require.e = function requireEnsure(chunkId, callback) { // ... = webpack_require.p + + chunkId + . + ({0:pageA,1:pageB,3:vendor}chunkId]chunkId) + . + {0:e72ce7d4,1:69f6bbe3,2:9adbbaa0,3:53fa02a7}chunkId] + ; };})(]);大抵内容像上方这样,它们是 webpack 的一些启动代码,它们是一些函数,通知阅读器如何加载 webpack 定义的模块。

其中有一行代码每次降级都会扭转的,由于启动代码要求分明地知道 chunkid 和 chunkhash 值得对应相关,这样在异步加载的时刻能力正确地拼接出异步 js 文件的门路。

那么这局部代码最终放在哪个文件呢?由于咱们刚才性能的时刻最后生成的 common chunk 模块,那么这局部运转时代码会被间接内置在外面,这就造成了,咱们每次降级咱们业务代码(pageA, pageB, 模块)的时刻, common chunkhash 会不时变化,但是这显然不合乎咱们的想象,由于咱们只是要用 common chunk 用来寄存公共模块(这里指的是 componentA),那么我 componentA 都没去修正,凭啥 chunkhash 要求变了。

所以咱们要求将这局部 runtime 代码抽离成独自文件。

= { // ... plugins: // ... // 放到其余的 CommonsChunkPlugin 前面 new ({ name: runtime, minChunks: Infinity, }), ]}这相当于是通知 webpack 帮我把运转时代码抽离,放到独自的文件中。

├── css│ ├── │ ├── │ └── └── js ├── ├── ├── ├── ├── └── 多生成了一个 ,以后你在改动业务代码的时刻,common chunk 的 hash 值就不会变了,取而代之的是 runtime chunk hash 值会变,既然这局部代码是灵活的,可以经过 chunk-manifest-webpack-plugin 将他们 inline 到 html 中,缩小一次性网络恳求。

三、webpack 生成的模块 moduleid在 webpack2 中自动加载 OccurrenceOrderPlugin 这个插件,OccurrenceOrderPlugin 插件会按引入次数最多的模块启动排序,引入次数的模块的 moduleId 越小,但是这依然是不稳固的,随着你代码量的参与,只管代码援用次数的模块 moduleId 越小,越不容易变化,但是不免还是不确定的。

自动状况下,模块的 id 是这个模块在模块数组中的索引。

OccurenceOrderPlugin 会将援用次数多的模块放在前面,在每次编译时模块的顺序都是分歧的,假设你修正代码时新增或删除了一些模块,这将或许会影响到一切模块的 id。

最佳通常打算是经过 HashedModuleIdsPlugin 这个插件,这个插件会依据模块的相对门路生成一个长度只要四位的字符串作为模块的 id,既暗藏了模块的门路消息,又缩小了模块 id 的长度。

这样一来,扭转 moduleId 的方式就只要文件门路的扭转了,只需你的文件门路值不变,生成四位的字符串就不变,hash 值也不变。

参与或删除业务代码模块不会对 moduleid 发生任何影响。

= { plugins: new (), // 放在最前面 // ... ]}四、chunkID实践状况中分块的个数的顺序在屡次编译之间大多都是固定的, 不太容易出现变化。

这里触及的只是比拟基础的模块拆分,还有一些其它状况没有思考到,比如异步加载组件中蕴含公共模块,可以再次将公共模块启动抽离。

构成异步公共 chunk 模块。

有想深入学习的可以看这篇文章:Webpack 大法之 Code Splittingwebpack 做缓存的一些留意点CSS 文件 hash 值失效的疑问不倡导线上颁布经常使用 DllPlugin 插件CSS 文件 hash 值失效的疑问:ExtractTextPlugin 有个比拟重大的疑问,那就是它生成文件名所用的chunkhash]是间接取自于援用该 css 代码段的 js chunk ;换句话说,假设我只是修正 css 代码段,而不动 js 代码,那么最后生成进去的 css 文件名依然没有变化。

所以咱们要求将 ExtractTextPlugin 中的 chunkhash 改为 contenthash,望文生义,contenthash 代表的是文本文件内容的 hash 值,也就是只要 style 文件的 hash 值。

这样编译进去的 js 和 css 文件就有独立的 hash 值了。

= { plugins: // ... new ExtractTextPlugin({ filename: `css

关于前端缓存优化,为什么没人用manifest

便捷来说,不好用来剖析下manifest的优缺陷优势可以离线运转可以缩小资源恳求可以降级资源缺陷降级的资源,要求二次刷新才会被页面驳回不允许增量降级,只要manifest出现变化,一切资源所有从新下载一次性不足足够容错机制,当清单中恣意资源文件出现加载意外,都会造成整个manifest战略运转意外全量加载和二次刷新这两个缺陷就曾经够重大了。

咱们再来看看其优势是不是真的那么好用。

1.离线运转关于个别页面来说,离线运转没什么用;关于webapp来说,这个个性还不错;关于hybird app来说,也没什么用。

2.缩小资源恳求HTTP协定的Cache-Control和Expires就也能在缓存有效期内,不再发送资源恳求3.可以降级资源manifest是文件被降级后,全量降级缓存。

而改用HTTP协定的缓存打算,只要求对资源文件援用的URL做少许变化即可刷新缓存,例如补个时期戳参数

怎样开启 索尼克二开发者形式 (怎样开启索尼电视的投屏功能)
« 上一篇 2024-08-16
如何处置 小米系统数据占用过多 (小米怎么处理)
下一篇 » 2024-08-16

文章评论