问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何将 HTML5 性能发挥到极致

发布网友 发布时间:2022-04-23 02:38

我来回答

1个回答

热心网友 时间:2022-04-19 08:08

HTML5作为新兴领域越来越热。然而在移动设备硬件性能弱于PC的背景下,对性能的需求显得更为重要,而HTML5性能优化前与优化后有着极大的差别,如何优化才能提高性能,对此熟知的人很少。本文以LayaAir引擎为例,通过代码示例详细阐述如何利用引擎对HTML5作出性能的极致优化。

主题包括: 

代码执行基本原理 

基准测试 

内存优化 

图形渲染性能 

减少CPU使用量 

其他优化策略

第1节:代码执行基本原理

LayaAir引擎支持AS3、TypeScript、JavaScript三种语言开发,然而无论是采用哪种开发语言,最终执行的都是JavaScript代码。所有看到的画面都是通过引擎绘制出来的,更新频率取决于开发者指定的FPS,WEB前端例如指定帧频率为60FPS,则运行时每个帧的执行时间为六十分之一秒,所以帧速越高,视觉上感觉越流畅,60帧是满帧。

由于实际运行环境是在浏览器中,因此性能还取决于JavaScript解释器的效率,指定的FPS帧速在低性能解释器中可能不会达到,学习交流所以这部分不是开发者能够决定的,开发者能作的是尽可能通过优化,在低端设备或低性能浏览器中,提升FPS帧速。

LayaAir引擎在每帧都会重绘,请加群在性能优化时,除了关注每帧执行逻辑代码带来的CPU消耗,还需要注意每帧调用绘图指令的数量以及GPU的纹理提交次数。

第2节:基准测试

LayaAir引擎内置的性能统计工具可用于基准测试,97345400实时检测当前性能。开发者可以使用laya.utils.Stat类,通过Stat.show() 显示统计面板。备注10具体编写代码如下例所示:

Stat.show(0,0); //AS3的面板调用写法       
Laya.Stat.show(0,0); //TS与JS的面板调用写法

统计参数的意义: 

FPS: 
每秒呈现的帧数(数字越高越好)。 
使用canvas渲染时,描述字段显示为FPS(Canvas),使用WebGL渲染时,描述字段显示为FPS(WebGL)。

Sprite: 
渲染节点数量(数字越低越好)。 
Sprite统计所有渲染节点(包括容器),这个数字的大小会影响引擎节点遍历,数据组织和渲染的次数。

DrawCall: 
DrawCall在canvas和WebGL渲染下代表不同的意义(越少越好)。 
Canvas下表示每帧的绘制次数,包括图片、文字、矢量图。尽量*在100之下。 
WebGL下表示渲染提交批次,每次准备数据并通知GPU渲染绘制的过程称为1次DrawCall,在每1次DrawCall中除了在通知GPU的渲染上比较耗时之外,切换材质与shader也是非常耗时的操作。 DrawCall的次数是决定性能的重要指标,尽量*在100之下。

Canvas: 
三个数值 —— 每帧重绘的画布数量 / 缓存类型为“normal”类型的画布数量 / 缓存类型为“bitmap”类型的画布数量”。 
CurMem:仅限WebGL渲染,表示内存与显存占用(越低越好)。 
Shader:仅限WebGL渲染,表示每帧Shader提交次数。

无论是Canvas模式还是WebGL模式,我们都需要重点关注DrawCall,Sprite,Canvas这三个参数,然后针对性地进行优化。(参见“图形渲染性能”)

第3节:内存优化

对象池 
对象池,涉及到不断重复使用对象。在初始化应用程序期间创建一定数量的对象并将其存储在一个池中。对一个对象完成操作后,将该对象放回到池中,在需要新对象时可以对其进行检索。 
由于实例化对象成本很高,使用对象池重用对象可减少实例化对象的需求。还可以减少垃圾回收器运行的机会,从而提高程序的运行速度。 

以下代码演示使用 

Laya.utils.Pool:

ar SPRITE_SIGN = 'spriteSign';
var sprites = [];
function initialize()
{
for (var i = 0; i < 1000; i++)
{
var sp = Pool.getItemByClass(SPRITE_SIGN, Sprite)
sprites.push(sp);
Laya.stage.addChild(sp);
}
}
initialize();

在initialize中创建大小为1000的对象池。

以下代码在当单击鼠标时,将删除显示列表中的所有显示对象,并在以后的其他任务中重复使用这些对象:

Laya.stage.on("click", this, function()
{
var sp;
for(var i = 0, len = sprites.length; i < len; i++)
{
sp = sprites.pop();
Pool.recover(SPRITE_SIGN, sp);
Laya.stage.removeChild(sp);
}
});

调用Pool.recover后,指定的对象会被回收至池内。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
苹果电脑电池充不进电苹果电脑充不进去电是怎么回事 苹果电脑不充电没反应苹果电脑充电指示灯不亮充不了电怎么办 狗狗更加忠诚护家、善解人意,养一只宠物陪伴自己,泰迪能长多大... 描写泰迪狗的外形和特点的句子 国外留学有用吗 花钱出国留学有用吗 !这叫什么号 百万医疗赔付后是否可以续保 前一年理赔过医疗险还能续保吗? 医疗住院险理赔后还能购买吗? 如何深入学习Html5? 怎么用tomcat怎么运行html5游戏 cocos2d-x c++ 开发 在html5上怎么运行和开发及调试 怎么让浏览器运行HTML5的定位? html5源码怎么运行 用什么软件来执行html5的函数代码 html5 app是怎么运行的 如何制作高音质DIY手机彩铃? 手机彩铃怎么制作? 拨打别人手机是听到的手机彩铃怎么制作的? 如何制作手机彩铃 怎样制作手机彩铃? 手机怎样制作彩铃 怎么制作手机彩铃免费 如何给自己的手机制作个性彩铃 制作手机彩铃,要交给公司多少钱。公司是怎么收费的 制作企业彩铃一般得多少钱? 如何自制手机彩铃? 手机商务彩铃的制作费怎么收取? 学信网学籍怎么查学生的学籍变更 新手怎样在云主机上部署Html5项目? 新新手怎样在云主机上部署Html5项目 如何实现html5页面,自动提示添加到主屏幕 煮面时荷包蛋总会散开,有什么办法能够打出一个完美的荷包蛋? 如何打个完美的荷包蛋? 水煮荷包蛋应该什么时候下锅?怎样才能完整不散花? 怎样才能煮出一个完整的荷包蛋? 乳胶漆刷什么颜色好看? 如何煮一个完整的荷包蛋? 请教,客厅墙面乳胶漆用什么颜色好 煮荷包蛋容易散,有什么方法可以煮出完整的荷包蛋? 装修涂什么颜色好看?如何选择乳胶漆颜色搭配? 怎样煮一个完整的荷包蛋。注意!是水煮。 乳胶漆颜色如何搭配搭配 客厅乳胶漆颜色搭配效果图 在煮荷包蛋时,应该掌握哪几个技巧,才会使荷包蛋滑嫩完整? 客厅一般用什么颜色的乳胶漆好看 现代简约的装修墙面漆什么颜色好看? 想要做出个个完整的荷包蛋,要注意些什么? 墙面刷乳胶漆,刷什么颜色好看 朋友在国外我可以给他直接汇款吗