《WebKit技术内幕》学习之十三(3):移动WebKit

3 其他机制

3.1 新渲染机制

为了移动领域更好的用户体验,渲染机制所做的改进主要是提升渲染性能来增加响应的速度,甚至不惜牺牲一些跟规范定义的行为不一致的地方。在这一小节中主要介绍三个方面的技术,其一是Tiled Backing Store,其二是线程化渲染,其三是快速移动翻页。

目前主流的移动设备上,触控操作是必不可少的用户交互方式。同桌面系统不一样的是,网页的渲染结果需要对用户的响应度有很高的要求。不幸的是,移动设备的能力比桌面机器的能力还是要差一些,为此,在最早的QtWebKit中引入了一项技术,这就是Tiled Backing Store机制,其核心思想是使用后端的缓存技术来预先绘制网页和减少网页的重绘动作,也就是使用空间换时间的典型思路。

最初这一思路出现在软件渲染中的,使用CPU分成瓦片块(Tile)的内存来保存绘制的网页内容,也就是图13-5中所示的这样,不同点在于它是使用CPU来分配并保存这些瓦片块,而且通常会超过视窗(Viewport)大小,也许会是它的两倍。这同样是一种典型的用空间换时间的做法。

图13-5 使用Tiled Backing Store渲染技术的网页

        该图跟图8-18有类似之处,只是该图中的后端存储表示的是渲染中的一层,而这里是指这个网页,因为这里是针对软件渲染机制,同时缓存的一个瓦片很容易被重复利用,因为每个瓦片大小一致,这一原理第8章中做过一些分析,区别在于这里不用担心GPU所能支持的纹理是否够大,因为这里使用CPU内存的缘故。不过目前这一技术已经有些过时,因为使用硬件加速渲染成为一种主流的方式,这一方法逐渐被抛弃,但是其思想还是很有意义的。

        随着移动设备进入多核时代,如果渲染过程仅仅是由一个线程来完成,这不能不说是一个巨大的浪费。而且,同桌面系统强大的单核能力不同的是,因为耗电等原因,单核的能力明显处于一个稍差的阶段,所以将渲染过程分成若干个独立的步骤,然后使用不同的线程来完成其中的某个或者几个步骤可能成为未来WebKit(和Blink)渲染引擎一个重要的发展方向,特别对于移动领域来说尤为重要。读者可能会疑惑这些步骤之间依赖性是否非常强,是不是不可能或者很难达到这一效果,现实是一些过程已经被实现了,图13-6描述了Chromium的线程化合成过程。

                                图13-6 使用线程化的合成器来渲染网页

         因为合成阶段是依赖之前阶段绘制的各个层结果,所以主要的神秘之处在于图8-16所设计使用的Layer树和LayerImpl树,其中Layer树在主线程,而LayerImpl树工作在一个专门用来渲染的线程,两者通过线程通信来进行同步,这样就独立开来,从而提升网页滚动时候的用户体验,因为这时主要使用合成器来完成新网页的显示。同时,合成工作并不会阻止Renderer进程的主线程,也就是WebKit工作的线程。未来,Chromium应该也不会满足目前的优化,可能会把这个渲染过程都通过线程化来进行,甚至今后JavaScript代码也能够支持多线程编程,这能够有效提升JavaScript代码的能力。

        因为移动领域还存在一些能力的局限性,但WebKit为了更好的用户体验,也做出了一些妥协,如快速滚动机制(Fast Mobile Scrolling)。先看背景,下面是CSS中的一个规则。

    body {background-image: url(background.gif);background-repeat:repeat-x;background-attachment: fixed;}

这段代码的含义是当body元素在滚动的时候,它背后的背景图片一直固定在文字后面,而不会随着网页的滚动而滚动,如图13-7所示的结果。图中显示了三张背景图片,因为设置的只是在X方向的重复(避免Y方向重复,这样滚动的时候不容易看出效果),所以当发生滚动的时候,这三张图片总是以背景的方式出现在该滚动区域的最上部分,而不会随着内容的滚动而发生滚动。

                        图13-7 使用“Fixed”模式的背景图片

        这一CSS的样式设置会触发WebKit进入一种称为“Slow Repaint(慢速重绘)”的模式,去以避免一种称为“Rendering Artifacts”的现象(前面一帧的某些数据出现在后面的绘制中)。因为WebKit要在快速滚动中绘制一个静止的元素非常困难,只能通过慢速重绘,而重绘会降低网页的性能,特别是降低界面的响应度。然而,在移动设备上,对于用户交互的响应度要求特别高,降低响应度就是一个大问题。但解决问题的方式很简单,就是取消该属性的设置,这的确是一个折中的方案。

3.2 其他机制

        为了更好地支持移动设备,WebKit做了大量的工作,引入了一些新的机制,例如,在本节中,主要介绍两种技术,其一是Application Cache,其二是Frame Flatterning技术,也就是处理网页的多框结构。更多内容,有兴趣的读者可以通过“http://trac.webkit.org/wiki/Mobile%20Features%20Talk”来了解一些重要的功能,限于篇幅,这里不再一一介绍。

        移动设备因为其移动的特性,需要能够提供离线浏览网页对的内容,而应用缓存(Application Cache)这一新支持的机制能够支持离线浏览,同时还能够加速资源的访问并加快启动速度。它的基本思想是使用缓存机制并缓存那些需要保存在本地的资源,开发者可以现实指定哪些是需要缓存的资源,并且使用起来非常简单。

    <html manifest="app.appcache">…</html>

        只是需要在“html”标签上加入属性“manifest”,指向一个文件,该文件格式如图13-8所示,以此来定义哪些资源需要缓存。该例子表明,它要缓存4个文件,这样在离线情况下,用户也能使用该网页并进行离线访问。

                        图13-8 “app.appcache”文件的内容

                不仅如此,规范还提供了接口来控制和访问网页中应用缓存的状态信息等,下面的例子就是使用规范定义的接口来更新缓存的内容。首先是注册一个回调函数,当更新后触发该函数,如果更新成功,那么需要将旧的缓存清除掉,填充新的缓存内容,这就是swapCache函数的作用,如示例代码13-3,在代码最后,调用update函数就可以完成触发更新资源的目的了。有了这些,离线使用就变得很容易。

示例代码13-3 使用应用缓存接口来更新缓存内容

    var appCache = window.applicationCache;appCache.addEventListener("updateready", function(event) {if (appCache.status == appCache.UPDATEREADY) {appCache.swapCache();} else {…}});// 重新下载缓存的资源appCache.update();

        接下来介绍框结构在移动设备上的特殊处理。第3章已经介绍过网页的框结构,其中讲到网页可能包含多个框,每个框都可以包含一个滚动条(如果该框在布局中的大小要比实际的内容小),也就是框内部是可以滚动的。当光标在该框中的时候,滚动鼠标中键能够滚动该框的内容。但是在移动设备上,因为屏幕和触控的缘故,用户可能不知道需要滚动网页还是框,因此,iframe和frameset等多框结构很难在移动设备上使用,为此,WebKit使用了一种称为“Frameset Flatterning”的技术,该技术的含义是将框中的内容全部显示在网页中,通俗来讲就是将框中的内容平铺在网页中,而不用设置滚动条,这也就意味着,用户只是滚动网页,当然框中的内容也包含在网页中,也会随着网页的滚动而发生变化。

        上面介绍的这些技术都在WebKit中得到了很好的支持,开发者可以借助于这些技术开发出用户体验更好的网页和Web应用。除了WebKit等渲染引擎为移动领域做了众多的工作,在Web开发领域,也有众多的JavaScript框架为移动领域量身设计了JavaScript库,现在较为流行的如jQuery Mobile、Sencha Touch等,它们当然也使用了上面介绍的一些技术,如HTML5 Touch Events、移动上的用户界面等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/245525.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

81.网游逆向分析与插件开发-背包的获取-装备栏数据结构的逆向分析

内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;自动化助手显示物品数据-CSDN博客 然后游戏中有弓箭&#xff0c;弓箭有数量&#xff0c;可以作为突破口&#xff0c;也可以使用物品id 获取弓的方式 获取弓箭的方式 然后搜索250 然后搜索出一个 然后…

C语言-算法-线性dp

[USACO1.5] [IOI1994]数字三角形 Number Triangles 题目描述 观察下面的数字金字塔。 写一个程序来查找从最高点到底部任意处结束的路径&#xff0c;使路径经过数字的和最大。每一步可以走到左下方的点也可以到达右下方的点。 在上面的样例中&#xff0c;从 7 → 3 → 8 →…

k8s-基础知识(Pod,Deployment,ReplicaSet)

k8s职责 自动化容器部署和复制随时扩展或收缩容器容器分组group&#xff0c;并且提供容器间的负载均衡实时监控&#xff0c;即时故障发现&#xff0c;自动替换 k8s概念及架构 pod pod是容器的容器&#xff0c;可以包含多个container pod是k8s最小可部署单元&#xff0c;容器…

从物联网看智慧文旅的未来:技术与实践的完美结合,重塑旅游体验的新篇章

一、物联网技术&#xff1a;智慧文旅的基石 随着科技的飞速发展&#xff0c;物联网技术已经深入到我们生活的方方面面&#xff0c;尤其在智慧文旅领域&#xff0c;物联网技术更是起到了不可或缺的作用。它如同智慧文旅的基石&#xff0c;为旅游行业带来了前所未有的创新和变革…

Elasticsearch内核解析 - 数据模型篇

Elasticsearch内核解析 - 数据模型篇 - 知乎 Elasticsearch是一个实时的分布式搜索和分析引擎&#xff0c;它可以帮助我们用很快的速度去处理大规模数据&#xff0c;可以用于全文检索、结构化检索、推荐、分析以及统计聚合等多种场景。 Elasticsearch是一个建立在全文搜索引擎…

8.6跳跃游戏②(LC45-M)

算法&#xff1a; 与上一题一样&#xff0c;还是看最大覆盖范围 要从覆盖范围出发&#xff0c;不管怎么跳&#xff0c;覆盖范围内一定是可以跳到的&#xff0c;以最小的步数增加覆盖范围&#xff0c;覆盖范围一旦覆盖了终点&#xff0c;得到的就是最少步数&#xff01; 这里…

go 语言中 json.Unmarshal([]byte(jsonbuff), j) 字节切片得使用场景

struct_tag的使用 在上面的例子看到&#xff0c;我们根据结构体生成的json的key都是大写的&#xff0c;因为结构体名字在go语言中不大写的话&#xff0c;又没有访问权限&#xff0c;这种问题会影响到我们对json的key的名字&#xff0c;所以go官方给出了struct_tag的方法去修改…

unity刷新grid,列表

获取UIGrid 组件&#xff0c;更新列表 listParent.GetComponent().repositionNow true;

Ubuntu 申请 SSL证书并搭建邮件服务器

文章目录 Log 一、域名连接到泰坦&#xff08;Titan&#xff09;电子邮件二、NameSilo Hosting 避坑三、Ubuntu 搭建邮件服务器1. 环境准备2. 域名配置3. 配置 Postfix 和 Dovecot① 安装 Nginx② 安装 Tomcat③ 申请 SSL 证书&#xff08;Lets Encrypt&#xff09;④ 配置 pos…

【并发编程】 synchronized的普通方法,静态方法,锁对象,锁升级过程,可重入锁,非公平锁

目录 1.普通方法 2.静态方法 3.锁对象 4.锁升级过程 5.可重入的锁 6.不公平锁 非公平锁的 lock 方法&#xff1a; 1.普通方法 将synchronized修饰在普通同步方法&#xff0c;那么该锁的作用域是在当前实例对象范围内,也就是说对于 SyncDemosdnewSyncDemo();这一个实例对象…

ORBSLAM3安装

1. 依赖 在该目录下打开终端,安装下面所有依赖。 1. 1 编译软件 sudo apt-get install gccsudo apt-get install g++sudo apt-get install build-essentialsudo apt-get install cmakesudo apt-get install openssl sudo apt-get install libssl-dev1. 2 Pangolin git cl…

蓝桥杯备战——5.动态数码管扫描

1.分析原理图 经查阅说明书得知数码管为共阳极&#xff0c;共阳端口接到了U8,而段码接到了U7。 如果需要选中U8,我们只需要将P250;P261;P271; 如果需要选中U7,我们只需要将P251;P261;P271; 2.代码示例 void Delay1ms() //12.000MHz {unsigned char data i, j;i 12;j 169;…

java以SSL方式连ES

先做准备工作&#xff0c;浏览器方式访问 ES7.X url https://127.0.0.1:8027 弹出用户名和密码 输入后在浏览器得到 { “name” : “DTCNPEMS04”, “cluster_name” : “cnp-es-cluster”, “cluster_uuid” : “wb0So_FqQBOKqtXnsqofTg”, “version” : { “number” : “7.…

java web 校园健康管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java Web校园健康管理系统是一套完善的java web信息管理系统 &#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysq…

第一篇【传奇开心果短博文系列】Python的库OpenCV技术点案例示例:cv2常用功能和方法

传奇开心果短博文系列 短博文系列目录Python的库OpenCV技术点案例示例系列 短博文目录一、前言二、常用功能和方法示例三、归纳总结 短博文系列目录 Python的库OpenCV技术点案例示例系列 短博文目录 一、前言 cv2是Python中常用的第三方库&#xff0c;也称为OpenCV库&#…

视频监控方案设计:EasyCVR视频智能监管系统方案技术特点与应用

随着科技的发展&#xff0c;视频监控平台在各个领域的应用越来越广泛。然而&#xff0c;当前的视频监控平台仍存在一些问题&#xff0c;如视频质量不高、监控范围有限、智能化程度不够等。这些问题不仅影响了监控效果&#xff0c;也制约了视频监控平台的发展。 为了解决这些问…

学生护眼灯哪个品牌好?最好的学生护眼灯品牌排行

说到台灯&#xff0c;相信大家都不陌生&#xff0c;特别是对于家中有学生的家长们而言&#xff0c;一款优秀的护眼台灯已经成为居家必备的工具之一。然而&#xff0c;随着各种护眼台灯层出不穷&#xff0c;价格从几百到上千不等&#xff0c;人们对于这一领域的产品是否物有所值…

【Linux】-网络概念

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树&#x1f388; &#x1f389;作者宣言&#xff1a;认真写好每一篇博客&#x1f4a4; &#x1f38a;作者gitee:gitee✨ &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法&#x1f384; 如 果 你 …

[pytorch入门] 2. tensorboard

tensorboard简介 TensorBoard 是一组用于数据可视化的工具。它包含在流行的开源机器学习库 Tensorflow 中.但是也可以独立安装&#xff0c;服务Pytorch等其他的框架 可以常常用来观察训练过程中每一阶段如何输出的 安装pip install tensorboard启动tensorboard --logdir<d…

帆软数据决策系统——用户名或密码错误解决方案

今天在公司调试本地大屏效果效果&#xff0c;死活登录不上数据决策系统。 附上截图&#xff1a; 解决方案&#xff1a; 找到本地FineReport设计器的安装路径&#xff0c;例如&#xff1a;D:\commonsoftware\FineReport_11.0\setup\FineReport_11.0\webapps\webroot\WEB-INF\em…