机顶盒开发中性能优化参考文档.docx

上传人:b****3 文档编号:26603196 上传时间:2023-06-20 格式:DOCX 页数:17 大小:25.21KB
下载 相关 举报
机顶盒开发中性能优化参考文档.docx_第1页
第1页 / 共17页
机顶盒开发中性能优化参考文档.docx_第2页
第2页 / 共17页
机顶盒开发中性能优化参考文档.docx_第3页
第3页 / 共17页
机顶盒开发中性能优化参考文档.docx_第4页
第4页 / 共17页
机顶盒开发中性能优化参考文档.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

机顶盒开发中性能优化参考文档.docx

《机顶盒开发中性能优化参考文档.docx》由会员分享,可在线阅读,更多相关《机顶盒开发中性能优化参考文档.docx(17页珍藏版)》请在冰豆网上搜索。

机顶盒开发中性能优化参考文档.docx

机顶盒开发中性能优化参考文档

目录

1页面性能优化1

1.1展示页面建议1

1.2关注代码的执行效率1

1.2.1禁止使用iframe1

1.2.2避免使用epg:

script标签1

1.2.3缓存常用值,避免重复查询。

1

1.2.4Javascirpt命名空间2

1.2.5全局变量应该放在js代码的最上方3

1.2.6避免同时进行多次的dom操作3

1.2.7复杂的逻辑能用java尽量用java解决不要用js3

1.2.8JS数组、对象声明方式采用JSON格式4

1.2.9字符串连接优化4

1.2.10用cloneNode(true)代替多次createElement操作4

1.2.11类的共用方法声明5

1.3减小页面刷新区域5

1.3.1innerText、innerHTML和document.write5

1.4避免在页面绘图时执行其它操作6

1.4.1焦点移动延迟加数据6

1.4.2首次加载页面时延迟加载耗时的js代码6

1.5减少页面布局的复杂度6

1.6避免图片压缩拉伸6

1.7减小图片大小,规避大图片6

1.8控制页面图片数量6

1.9img标签和背景图6

2特效7

2.1移动7

2.2缩放7

2.3透明度改变7

2.4其他组合特效8

3多窗口与多帧的使用8

3.1多窗口的几种应用场景8

3.2弹出窗口基本语法8

3.3自研浏览器扩展接口9

3.4Window对象9

ZXIPTV3.0模版开发规范

1页面性能优化

1.1展示页面建议

依据现网的数据统计分析来看,与数据库交互频繁,且页面元素复杂度较高,对EPG性能有影响,按其影响程度从高至低分别为频道切换、直播、点播、栏目展示、节目详细、首页、向第三方服务器发起http请求、回看。

在设计模板页面时考虑的因素主要有:

页面的主要组成元素、是否与数据库交互以及交互次数、是否包含小视频、是否包含滚动字幕、是否有文件IO操作以及交互次数。

如下建议作为EPG模板开发人员的设计参考。

页面构成元素

元素数目

元素限制

菜单/按钮

小视频

1

小视频大小不受限制,数目同一个页面只能是一个

海报

不超过3

建议图片大小在30K~40K之间

包含图片

不超过8

图片大小不受限制,根据局方需要而定

文件IO

1

滚动字幕

1

数据库交互

不超过5

Out>(海报)、

Operate>(Datasource)、

Table>(Decorator)、

FirstPage>(小视频)

1.2关注代码的执行效率

1.2.1禁止使用iframe

由于自研浏览器是一个单线程的程序,对iframe的执行效率较低,且自研浏览器已经支持ajax,所以应用ajax来代替iframe。

注意,在国内应用时的限制,由于电信/联通的浏览器规范中没有要求支持ajax,所以如果要考虑对其他厂家STB的兼容性,则不能使用ajax。

1.2.2避免使用epg:

script标签

epg:

script标签只是注册了一个按键响应函数,将其交给top框架中的js函数处理,由于top框架中的js函数代码复杂,执行慢,所以应避免使用此标签,而改为直接在页面捕获按键,页面不处理的按键再交给top框架函数处理。

如果需要屏蔽掉页面上的某些按键也可以在相应的按键方法里写个空的方法。

1.2.3缓存常用值,避免重复查询。

目前,自研浏览器的document.getElementById方法由于是遍历方式查找DOM节点,执行效率很低,需要考虑根据id缓存页面元素,提高js运行速度,示例如下:

var$$={};

function$(id){

if(!

$$[id]){

$$[id]=document.getElementById(id);

}

return$$[id];

}

 

for(vari=0;i

1.2.4Javascirpt命名空间

使用js命名空间是代码层次更加清晰,易于功能代码合并,避免命名冲突

可以利用js的单实例模式实现命名空间,代码示例:

varviettel;

if(!

viettel){

viettel={}

}

viettel.mp3=function(){

//命名空间里可以声明局部变量和方法

varx=1;

varaddToPlaylist=function(itemid,programname){

....

}

varshowPost=function(postpath){

....

}

//返回一个对象

return{

addToPlaylist:

function(itemid,programname){

addToPlaylist(itemid,programname);

//调用命名空间里的方法

},

showPost:

function(postpath){

showPost(postpath);

}

}

}();

//调用

viettel.mp3.addToPlaylist(1,00000028);

1.2.5全局变量应该放在js代码的最上方

在js代码很多时全局变量作为作用域链的最上层,在方法里获取的时候本来就要比局部变量来的慢。

js自上而下的查找全局变量,所以声明在js代码上方比下方速度快很多。

Beeline的TVGUIDE页面就遇到过这个情况。

使用js命名空间也可以缓解这个问题。

1.2.6避免同时进行多次的dom操作

避免同时进行多次的dom操作,这样效率很低,可以换其他方式达到效果。

比如,要隐藏多个div或者展示多个div,可以把这些div放在一个大的div中,并直接操作大div。

functionshowLayer(){

$("channelsearch_sub_viewsect10_bg").style.visibility="visible";

$("sub_sect10").style.visibility="visible";

……

$("sub_sect60").style.visibility="visible";

$("channel_search").style.visibility="visible";

$("channelsearch_subpageNo").style.visibility="visible";

}

html代码

hidden;position:

absolute;left:

490px;top:

308px;width:

89px;height:

146px;overflow:

hidden;z-index:

3;border:

1pxsolid#35363E;">

transparent;position:

absolute;left:

0px;top:

0px;width:

90px;height:

21px;overflow:

hidden;font:

bold16pxArial;color:

#666688;text-align:

center;">CHName

#303030;position:

absolute;left:

0px;top:

30px;width:

90px;height:

20px;overflow:

hidden;font:

bold14pxArial;color:

#9497aa;text-align:

center;">

#303030;position:

absolute;left:

0px;top:

59px;width:

90px;height:

20px;overflow:

hidden;font:

bold14pxArial;color:

#9497aa;text-align:

center;">

#303030;position:

absolute;left:

0px;top:

88px;width:

90px;height:

20px;overflow:

hidden;font:

bold14pxArial;color:

#9497aa;text-align:

center;">

#303030;position:

absolute;left:

0px;top:

117px;width:

90px;height:

20px;overflow:

hidden;font:

bold14pxArial;color:

#9497aa;text-align:

center;">

1.2.7复杂的逻辑能用java尽量用java解决不要用js

用户请求jsp后台通过多线程运行单实例的servlet代码,java的运行速度基本可以忽略。

而页面展示主要时间消耗在网络数据传输和浏览器解析排版上。

复杂的逻辑处理放在服务器端可以提高页面响应速度。

例如,xx模板的音乐播放列表要求按两种方式排序,并考虑有接节目置顶,置底。

而EPG和机顶盒都没有提供相关接口只有一个数据源接口,需要模板先取出数据再按方式排序并根据记录信息置顶置底。

很显然这些逻辑放在java里实现比用js速度会快很多,特别当节目很多的时候。

1.2.8JS数组、对象声明方式采用JSON格式

vararr=[];取代vararr=newArray();

varobj={};取代varobj=newObject();

1.2.9字符串连接优化

以数组的push、join方法代替多次字符串+号链接。

varstr=‘’;

for(vari=0;i<10000;i++){

str+=‘test’+i;

}

改为

vararyStr=[];

for(vari=0;i<10000;i++){

aryStr.push(“test”,i);

}

str=aryStr.join(‘’);

1.2.10用cloneNode(true)代替多次createElement操作

在循环中多次调用document.createElement动态创建DOM元素(显示列表一行数据,特别是复杂结构元素),可以先在页面定义一个隐藏的元素(里面可能包含其他元素),调用其cloneNode(true)创建。

for(vari=0;i<8;i++){

varnewElement=document.createElement(“div”);

varnewSpan=document.createElement(“span”);

newElement.appendChild(newSpan);

….

newElement.id=“..”;

newElement.style..

}

改为

页面中:

hidden”>

….

varbasicNode=document.getElementById(“id”);//页面中定义的隐藏div

for(vari=0;i<8;i++){

varnewElement=basicNode.cloneNode(true);

newElement.style.visibility=“visible”;

newElement.id=“..”;

newElement.style..

}

1.2.11类的共用方法声明

通过prototype为每个实例共享原型链的方法,不用每次创建。

functiontest(id,name){

this.id=id;

this.name=name;

this.setId=function(newId){

this.id=newId;

}

Setter、getter

}

改为

functiontest(id,name){

this.id=id;

this.name=name;

}

test.prototype.setId=function(newId){

this.id=newId;

}

1.3减小页面刷新区域

目前浏览器刷新区域的大小由更改元素所属的父节点决定,由于终端设备性能上的瓶颈,图形能力处理不够强大,应尽量减少每次页面刷新区域的大小。

需要频繁修改的局部布局(如焦点移动)要尽量限制其父节点范围,避免过大范围刷新,Body下面的DOM节点的变动都是全屏刷新的,这个需要注意。

同时还要注意,限制的刷新区域过小会导致浏览器刷新不全留下残影的现象。

1.3.1innerText、innerHTML和document.write

当需要使用js代码改变页面显示布局时,应尽量使用innerText,少用innerHTML,不要用document.write。

因为后两者浏览器处理慢,innerHTML会影响这个小DOM节点的属性和布局,document.write则直接影响整个页面的DOM,innerText只影响文本节点而不对element节点产生影响,而且innerText可以处理特殊字符(如“<”、“>”等),不会因为文本中包含这些特殊字符导致排版出错。

1.4避免在页面绘图时执行其它操作

由于浏览器排版绘图是一个很消耗时间的过程,且在此期间不会响应其他操作,用户体验很差,故应避免绘图对用户操作造成的不良影响。

1.4.1焦点移动延迟加数据

页面经常涉及到焦点落到某个位置上加载海报,标题等描述信息。

比如vod,music列表页

这时候可以考虑使用setTimeout延迟加载,这样会提高页面反应速度。

setTimeout需要特别注意的是及时清除定时任务。

比如焦点在第一个节目上我现在只关注第3个节目的海报或者描述信息。

如果用延迟加载焦点经过第2个节目时就不需要加载展示了。

1.4.2首次加载页面时延迟加载耗时的js代码

有些页面首次加载页面时还要执行很耗时的js操作。

这时我们可以考虑用定时器先让页面的div和图片先展示出来再执行js。

如果不用定时器直接在onload句柄中执行机顶盒中的浏览器会直到js运行完成再展示页面。

比如beeline的LPVR预约列表展示页。

首次进入页面肯定需要解析xml获得数据,数据量大的话速度会很慢。

而页面会等js解析完后再展示,用户体验很差。

1.5减少页面布局的复杂度

浏览器解析一个页面并布局完成需要遍历完整个DOM才会进行,DOM的结构越复杂,布局排版的时间就越长,DOM的层次越深,相对应的内存和运算等消耗也会更大,所以要尽量减少页面布局的复杂度,能用一个div元素完成的布局不要用两个或多个去实现,另外要减少空的和多余的布局元素。

由于table的实现至少为三层(table-tr-td)所以用table布局元素信息会较为繁琐,性能不高,应尽量用div代替。

1.6避免图片压缩拉伸

图片拉伸和压缩占用较多的cpu处理时间,所以要尽量避免,尤其避免拉伸压缩图片的移动,这种操作机顶盒处理很慢。

尽量保证用原有图片的大小展示。

1.7减小图片大小,规避大图片

这里的大小不仅指原始文件字节数的大小,也只图片长宽尺寸的大小。

前者影响下载速度,减慢页面加载时间;后者影响解析后占有的机顶盒内存量,由于机顶盒内存有限,不可能全部缓存所有图片,所以要尽量保证图片长宽尺寸也较小。

举例说明:

1个1280*720的png背景图片,解析后占有的机顶盒内存超过3M,而一般机顶盒可用于图片和文件缓存的内存最多30M(高清的盒子),而其中还要分出一大部分供图形加速使用。

1.8控制页面图片数量

页面图片数量不应太多(如:

100多个),这个会发出100多个请求会影响性能,等待时间较多,需注意。

一般出现此问题的情况是刚开机进行多个页面一同加载或者是某个页面中含大量小图片进行布局。

可以将很多小图片整合到一个大图片中使用。

1.9img标签和背景图

对于经常要切换图片的操作尽量用,应减少background的使用;这个主要是性能问题,用background的方式修改,对浏览器来说会多两层解析过程。

2特效

特效实现中CSS3效果是较好的,这里列述的仅为CSS3特效实现。

CSS3效果作用对象为div元素,请尽量不要直接对img应用该特效,以免引发浏览器bug

2.1移动

设置元素布局方式为postion:

absolute;配合webkitTransitionDuration属性修改元素的top和left值即可实现元素的移动特效。

varobj2do=document.getElementById("divId");

obj2do.style.top="100px";

obj2do.style.left="200px";

obj2do.style.webkitTransitionDuration="500ms";

2.2缩放

方案1:

配合webkitTransitionDuration属性修改元素的width和height值即可实现元素缩放特效,此缩放是修改元素的高度和宽度的缩放,修改的是指定元素本身的宽度和高度,其包含的子元素不受影响。

例:

如修改图片,直接对img做缩放。

varobj2do=document.getElementById("divId");

obj2do.style.width="100px";

obj2do.style.height="200px";

obj2do.style.webkitTransitionDuration="500ms";

方案2:

配合webkitTransitionDuration属性修改元素的webkitTransform值即可实现元素缩放特效,此缩放是相对于元素中心点的缩放,修改的是元素和其包含的子元素,所有相关元素均被拉伸或压缩。

例:

如修改图片,可对图片父元素或图片做缩放

varnode=document.getElementById("divId");

node.style.webkitTransitionDuration="300ms";

node.style.webkitTransform="scale(1.5)";

注:

正式使用时可能要结合left和top实现特定效果。

2.3透明度改变

配合webkitTransitionDuration属性修改元素的opacity值即可实现元素的移动特效。

Opacity:

0完全透明0.5半透明1不透明(原始图片)

varnode=document.getElementById("testDiv");

node.style.webkitTransitionDuration="1000ms";

node.style.opacity=0.5;

扩展:

呼吸效果:

/**功能:

显示焦点框呼吸效果**/

functionfocusBreath(focus){

focus.style.webkitTransitionDuration=myApp.breathTime;

clearInterval(focusBreathID);

focusBreathID=setInterval(function(){

if(opacityOperation==0){

focus.style.opacity=1;

opacityOperation=1;

}else{

focus.style.opacity=0.5;

opacityOperation=0;

}

},myApp.breathTime);

}

2.4其他组合特效

通过配合js计时器,组合移动、缩放、透明度改变等可以实现多层图片显示、跳跃、图片交替等其他特效效果,具体实现需要配合具体需求制作。

由于特效效果对终端性能要求高,不建议制作过于复杂的特效效果。

3多窗口与多帧的使用

一个窗口的多帧是由frameset或则iframe创建的,可以借助frames数组和parent,top等对象来访问一个窗口的不同帧。

模板页面就是用frameset标签创建了多个窗口。

我们经常用top对象来获得页面的最上层的window对象,这里面有EPG提供的很多js方法。

多窗口是由window.open()方法创建的。

创建出来的窗口可以在任何窗口通过窗口的名字获取:

window.getWindowByName(windowName);一个窗口可以通过window.opener访问创建该窗口的window对象。

熟悉了窗口与帧之间的关系以及访问方法可以很简单的解决多窗口的任何问题。

多窗口可以缓存页面解决页面第一次进来展示慢的问题。

多帧可以解决页面不刷新获取数据和页面刷新保存数据和执行定时任务功能。

其中页面不刷新获取数据速度慢效率低尽量用ajax实现。

机顶盒没有给主窗口起名字,所以机顶盒弹出来的tvms窗口无法获得原来的主窗口引用。

但是可以获得任何一个多窗口的window对象进而得到创建该多窗口的窗口。

3.1多窗口的几种应用场景

1,普通的弹出窗口,可以app键切换,可以del键关闭,如widget,tvms;

2,提升性能的隐藏窗口,不可以app键切换到非当前的隐藏窗口,不可以del键关闭;

3,类似IE模态对话框的阻塞式弹出窗口,不允许切换和关闭,必须关闭弹出窗口后,才能响应其他操作;

StarHub版本的需求,提出了一个窗

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 商务科技

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1