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 ...

十五、定制嵌入式servlet容器

Spring Boot支持内嵌的Tomcat, Jetty和Undertow服务器。多数开发者只需要使用合适的’Starter POM’来获取一个完全配置好的实例即可。 常见的Servlet容器设置可...
  • L_Sail
  • L_Sail
  • 2017年04月17日 23:50
  • 198

WES-7(嵌入式Winows7)定制shell步骤

  • 2017年09月11日 13:54
  • 11.48MB
  • 下载

编辑定制自己的嵌入式busybox和ramdisk

定制自己的arm ramdisk编辑命令busybox

定制自己的嵌入式kernel

定制自己的嵌入式kernel。如atmel arm9系列的多串口内核支持。

盈鹏飞嵌入式---AM335X 如何定制电容式触摸屏接口

本文主要描述如何在COM335X上定制电容式触摸屏接口,包括内核配置,驱动初始化。EAC公司提供给客户的电容触控芯片为FT5316DMAE,使用IIC总线,驱动为ft5x16_ts。本文以EVB335...
  • szhebin
  • szhebin
  • 2017年04月19日 09:47
  • 656

可定制化嵌入式 3D 环视一站式解决方案

多摄像头 3D 环视系统已经在许多乘用车使用。对这类系统的需求,在特种车辆上也开始增长,例如建筑机械、收割机、公交车或者军用车辆。相比于个人汽车,这些车辆的产量较少,并且对光学系统有较高的定制化需求。...

C# 嵌入式资源

转自:http://www.cnblogs.com/zhangjun1130/archive/2011/04/11/2012566.html 1、手动嵌入式资源 右键工程-添加-现有项-图...

盈鹏飞嵌入式---【IMX6UL开发板试用体验】上手试用与资源使用

缘起 这个是我拿到的第二块工控板了,前面是AM335X的板子,也是盈鹏飞嵌入式的。这块板子也是工业板。相比一些“开发板”而言还是有一些区别的。 在公司的官网上找到的高清大图:   硬件 和以前的A...
  • szypf
  • szypf
  • 2017年04月10日 14:29
  • 215
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:WebKit代码在资源受限的嵌入式环境下的定制问题
举报原因:
原因补充:

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