WebKit代码在资源受限的嵌入式环境下的定制问题

原创 2014年09月04日 12:33:57
WebKit代码在资源受限的嵌入式环境下的定制问题微笑


传统的WebKit及Chromium为了性能和丰富的HTML5功能特性而优化,即使是iPhone或Android这样的手机移动设备,其内存也动辄以2G以上计。


那么,当我需要在资源受限的嵌入式环境下运行WebKit,如何进行节省资源的裁剪定制呢?


这里所谓的资源受限,指的就是像车载设备、智能电视这样的终端,CPU通常使用ARM,但主频不高;内存只有512MB以下,虽然也支持OpenGL ES,但能力受限。


首先考虑所谓的“节省资源”,这有2个方面的含义:
1、静态的资源 主要指程序编译出来的二进制文件大小
2、动态的资源 指程序运行时占用的内存大小


静态优化可以采取的措施如下:
1、降低性能,裁剪代码
    WebKit很多代码分支很多都是用于处理特殊条件下的优化,可以把这部分优化的分支去除(用条件宏关闭)
    比如,完全禁用JavaScriptCore的优化处理,让它退化为一个普通的解释器引擎(jsc目前可能还不能以纯解释器模式运行?)
    再如,完全禁用图形渲染硬件加速后端,采取纯软件的绘制代码,同时禁用某些会影响纯软件实现性能的功能,如CSS 3D变换、模式/梯度填充等
2、关闭某些模块
    比如比较庞大的svg、xml模块
3、有选择的关闭某些HTML5 API
4、将WebCore/rendering下面的某些渲染功能取消掉,比如border的模式填充


动态优化
1、WebKit或者使用系统内存分配器,或者可使用TCMalloc,这些内存分配器的问题是它们会预先分配一个比较大的堆(内存池),造成不必要的占用
    其实可以使用一个最原始的基于双链表的实现(freelist、uselist),这个原始实现在分配大量小对象时可能造成碎片,不过这个问题可以根据实际对象的大小及分配频率进行一些优化
2、重写关于大图片显示的代码
    目前的图像解码对于一个大图片都是要分配很大的一块连续内存的,这个其实可以使用tiling切片的思路,拆分为小图片显示,甚至可以把每个像素从rgba32降低到16位
3、关闭任何形式的缓存
 网络缓存自不必说,其实最占大头的是字体缓存,不过也可以做一些优化:比如只使用一种字体。

其他
1、使用编译器所能够提供的LTO(链接时优化),将没有被调用的函数代码从生成的二进制文件中去除


WebKit从设计初就没有考虑到资源受限的嵌入式环境下的“节省资源”处理,某些数据结构可能需要重新设计(可能会影响性能),例如:
1、CSS解析模块
    不存储中间的解析结果数据(RenderStyle里的XxxData),而是直接存储原始字符串格式的数据,这样每次查询CSS属性的取值都需要重新解析,但的确能够节省大量内存
    这里可以考虑一下如何在这种极端的设计下仍然还能够优化性能?
2、不再在内存中分配大量字符串对象(其实内存里的String对象就是外部存储系统文件字节流的缓存而已)
    尽管WebKit为字符串对象定义了不同的类型,如AtomicString、CString、String等,但每一种类型都意味着额外的重复存储,可以这么优化:
    只保存原始html的输入字节流,其他的字符串对象全部保存为对此输入字节流的(offset, bytesLength)引用
    甚至可以更进一步,不保存解码后的Unicode数据,只使用之前的字节数据,实际的字符串操作需要即时做Unicode解码
    (不过我怀疑这么做是否会大幅度影响性能?)
如果我们可以假设CPU速度足够快,内存访问速度也还可以,但是内存本身总大小受限,那么上面的2点也许值得考虑。



autotools精简(以webkit嵌入式浏览器移植为例)

本文档主要是阐述autotools以及以webkit为例精简构建系统     Copyright (C)  2013  jianchenglee.     Permission is granted ...
  • u011605208
  • u011605208
  • 2013年08月05日 17:51
  • 1247

基于webkit的嵌入式浏览器开发

  • 2011年01月27日 16:19
  • 472KB
  • 下载

AM335x下dbus-1.0.2源码ARM编译和Qt dBus编译

AM335x下dbus-1.0.2源码ARM编译 1.解压: tar zxvf dbus-1.0.2.tar.gz 2.设置环境变量: export PKG_CONFIG_PATH=/usr/...
  • wangn222
  • wangn222
  • 2017年07月13日 13:54
  • 336

[Qt教程] 第40篇 网络(十)WebKit初识

[Qt教程] 第40篇 网络(十)WebKit初识 楼主  发表于 2013-9-11 17:26:05 | 查看: 521| 回复: 10 ...
  • dengjin20104042056
  • dengjin20104042056
  • 2013年11月12日 16:48
  • 1506

嵌入式boa服务器搭建和移植

1.先下载源码 http://www.boa.org/ ==> boa-0.94.13.tar.g 2.tar -xvf boa-0.94.13.tar.g 3./configure ...
  • firefoxbug
  • firefoxbug
  • 2012年06月14日 11:36
  • 4790

WebKit源代码目录结构

WebKit源代码建议不要从官方的SVN源下载,实在是太大了。从nightly build里面下载,就小很多:http://nightly.webkit.org/builds/trunk/src/1 ...
  • zxxSsdsd
  • zxxSsdsd
  • 2014年01月26日 19:47
  • 1256

构建QT4.7.1嵌入式开发环境

如何构建Qt4.7.0嵌入式开发环境   ubuntu 11.10 arm-linux-gcc-4.3.2.tgz qt-everywhere-opensource-src-4.7.1....
  • ljasdf123
  • ljasdf123
  • 2012年03月20日 22:18
  • 889

浏览器: webkit架构 目录结构

一, webkit架构    webkit的一个显著特点, 支持不同的浏览器, 一部分相同, 一部分不同, 不同的部分称为webkit的移植(ports)。        webkit 嵌入式接口...
  • bamboolsu
  • bamboolsu
  • 2015年04月14日 22:27
  • 796

Python Webkit DOM Bindings学习

Scrapy本身不能作为JS的解析器,因而若网页中带有AJAX,带有JS脚本时就无能为力了,看了网上几篇相关文章都介绍说,使用Webkit作为Downloader,于是便想研究一下。 相关文章:ht...
  • streamind_xd
  • streamind_xd
  • 2013年09月30日 12:33
  • 2321

Webkit主资源加载流程(推荐)

原帖地址  :http://blog.csdn.net/luoxinwu123/article/details/8204824 1,Webkit加载的主要模块 Loader的主要模块包括Frame...
  • augfun
  • augfun
  • 2017年01月15日 17:21
  • 692
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:WebKit代码在资源受限的嵌入式环境下的定制问题
举报原因:
原因补充:

(最多只允许输入30个字)