公司H5游戏客户端性能优化整理

近期在一家公司负责H5游戏加载速度优化,这里把近期做的项目优化项做一个整理分享:

html渲染流程

HTML解析过程:构建DOM树、构建CSSOM树、根据DOM树和CSSOM树构建render树、有了render树就开始布局Layout、最后绘制paint。

1、构建DOM树:   将HTML构建成一个DOM树,也就是构建节点,把所有的节点都构建出来。

2、构建CSSOM:   解析css去构建CSSOM树。

3、构建render树: DOM已经构建好了,css也有了,浏览器就会根据这两个来构造render树。

4、布局:      当render树有了,通过render树,浏览器开始计算各个节点的位置和样式。

5、绘制:      遍历render树,在页面上绘制每个节点。

6、重排reflow:  当render树绘制完成之后,比如JavaScript改变样式或添加节点,这时候render树就需要重新计算。

7、重绘repaint:  重新绘制页面。

HTML整个解析过程看起来很简单,但是我们要知道解析过程中css、js和dom的加载顺序。我们都知道HTML是自上往下解析的,在解析过程中:

1、如果遇到link和style,那就就会去下载这些外部的css资源,但是css跟DOM的构建是并行的,就是说不会阻塞DOM树的构建。

2、如果遇到script,那么页面就会停止html的解析和渲染把控制权交给JavaScript,直到脚本加载完毕或者是执行完毕。

  1> 没有defer和async标签的script会立即加载并执行。
  2> 有async标签的js,js的加载执行和html的解析和渲染并行。
  3> 有defer标签的js,js的加载和html的解析和渲染并行,但会在html解析完成后执行,在触发DOMContentLoaded事件前执行。

3、页面的渲染是依靠render树,也就是说如果css没有加载完成,页面也不会渲染显示。

4、JavaScript执行过程中有可能需要改变样式,所以css加载也会阻塞JavaScript的加载。

5、JavaScript执行过程中如果操作DOM,但是DOM树又是在JavaScript之后才能构建,就会报错,找不到节点。

6、DOMContentLoaded和onload的区别:DOMContentLoaded在html解析完毕后执行,loload在页面完全加载完成后执行(包括样式和图片)。

 

html相关优化

其中对我们项目首屏启动速度影响最大的就是网络请求,所以优化的重点就是使用文件缓存和减少Http请求(页面中每发送一次请求,都会完成请求+响应这个完成的HTTP事务,会消耗性能,造成HTTP链接通道阻塞)。

1.html代码压缩。

2.减少页面上引用的文件数量(非首屏依赖CSS或者js文件、图片资源的引用,等首屏展示后静默下载(按实际项目需求))。

3.减少域名查询:DNS查询和解析域名也需要消耗时间,不同域名使用越少越好。

4.优化页面加载顺序:1.将css文件放在head中 2.js放在body的底部。

以下贴出示例的html文件内容,以注释进一步说明优化内容:

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>title</title>
    <meta name="viewport" content="width=device-width,user-scalable=no,initial-scale=1, minimum-scale=1,maximum-scale=1" />
    <meta name="full-screen" content="yes" />
    <meta name="x5-fullscreen" content="true" />
    <meta name="360-fullscreen" content="true" />
    <meta name="screen-orientation" content="portrait" />
    <meta name="x5-orientation" content="portrait">

    //初始化只加载首屏页面渲染依赖的css文件,非初始化依赖css文件,等游戏主包js下载后初始化由WebCssManager.js动态引入
    <link rel="stylesheet" href="./css/layout.css">

</head>

<body onload="load()">
    <script src="src/res/loading.js"></script> //游戏定制页,在主包下载之前过度显示,避免因下载主包导致首屏展示太慢,提高游戏体验
    <script>
     //SDK或者外部插件,全部由插件管理类管理,初始化依赖的SDK在管理类下载完后立即执行,其他插件或者渠道SDK等主包下载完成后下载
        var loadPluginManager = function() {
            var script = document.createElement(‘script‘);
            script.onload = function() {//下载js主包}
            script.onerror = function(err) {loadPluginManager();}
            script.src = "./plugin/webPluginManager.js";
            document.body.appendChild(script);
        }
        loadPluginManager();
    </script>
    <canvas id="gameCanvas" width="1136" height="640"></canvas></body>

</html>//html代码逻辑尽量少,只引入少量文件避免过多的HTTP请求

 

HTTP相关优化

1.如果支持http合并请求就合并请求。合并资源,减少 HTTP 请求数,minify / gzip 压缩,webP,lazyLoad。
  


静态资源打包,因为浏览器下载静态文件的时候是有线程数限制的:同一时间针对同一域名下的请求有一定数量限制,超过限制数目的请求会被阻塞。为了提高性能,服务器端会把js/css  合并成一个文件(因为都是文本嘛)再向客户端输出,这样页面能更快的展现。

2.缓存:HTTP 协议缓存请求,离线缓存 manifest,离线数据缓存localStorage。

CSS使用注意

1.正确使用 Display 属性,因为 Display 属性会影响页面的渲染。

2.避免图片和 iFrame 等空 Src。

3.尽量避免重设图片大小。

4.避免 CSS 表达式。

5.移除空的 CSS 规则。

6.不滥用 Web 字体、Float。

7.不声明过多的 Font-Size。

8.值为 0 时不需要单位。

游戏流程优化


示例:打包出来的项目结构(不含子包),其中主包js文件大小2.9MB左右,资源文件大概15MB(压缩后,png类型资源在打包的时候会额外生成一份Webp格式(android使用webp、ios使用png))。

项目结构优化:

  1.(棋牌大厅)游戏主包或者游戏子包(棋牌游戏)的发布直接覆盖原包内容(便于没变动文件使用缓存),其中主包目录和子包目录独立分开,便于版本缓存管理。

资源相关优化:

  1.打包并压缩所有游戏js文件。

  2.合并所有CSS文件(按自身项目情况而定)。

  3.合并非初始化所需插件或者SDK文件(按自身项目情况而定)。

  4.压缩图片资源,png纹理生成一份webp格式(并再次压缩75%)供android使用(按自身项目情况而定,因为webp纹理下载后需要解码,算上解码耗时小图使用webp不划算)。

  5.合并所有资源集合图plist文件(减少大量http请求数、IO)。

  6.项目结构中大厅游戏版本号只影响html文件和主包文件名,资源文件依赖MD5,游戏子包根据服务器下发版本号区分http请求。

流程逻辑相关优化:

  前言:因为我们游戏APP、微信小程序、h5都是共同游戏服务器,针对h5通讯流程后端没做任何优化,共用一套(连接大厅服务器(含请求进入大厅相关接口)、连接游戏服务器(webSocket)(含请求进入游戏房间相关接口)耗时长),充分利用通讯耗时做该做的事情(如下载图片资源):异步执行游戏中同步顺序执行的逻辑(按实际情况而定)。

  1.连接大厅服务器、请求大厅相关接口的同时下载游戏资源(部分资源直接载入纹理缓存)(此处必须保持异步平衡,连接大厅耗时充分用来下载和预览资源)(注意控制同时请求数量,因为大部分浏览器并发请求数是4-6个)。

  2.进游戏房间同上。

  3.异步执行影响游戏流程中部分独立不互相影响的流程(如GPS、影响游戏流程的接口)。

  4.通过分享进游戏,只预览少量大厅通用资源和对应游戏资源,跳过大厅相关流程且不创建大厅相关界面,直接进游戏房间(通讯和游戏资源下载预览同上,且保持异步平衡)。

游戏渲染优化

1.相同图集里的图一次性连续渲染完,减少Draw Call。2.减少被遮挡或者超出可视区的单位渲染。3.部分UI元素较多的界面或者场景建议使用分帧加载,元素量大的则规划渲染规则。4.减少算法复杂度。5.合并资源减少IO。6.允许情况下减低帧率。

代码编写优化

这里先推荐一本书:《代码整洁之道》:代码质量与其整洁度成正比。干净的代码,既在质量上较为可靠,也为后期维护、升级奠定了良好基础。

js原生库推荐 : Lodash (一个一致性、模块化、高性能的 JavaScript 实用工具库。它内部封装了诸多对字符串、数组、对象等常见数据类型的处理函数)。

1.适当使用函数式编程

2.编写代码适当的使用异步编程

3.在js中尽量减少闭包的使用

4.封装尽量做到低耦合高内聚。

原文地址:https://www.cnblogs.com/xyptechnology/p/11996591.html

时间: 2024-11-08 22:45:40

公司H5游戏客户端性能优化整理的相关文章

( 转)从四分钟到两秒——谈谈客户端性能优化的一些最佳实践

转:http://www.cnblogs.com/marvin/p/WinformOptimizSkill.html 背景 最近跟售后经理吃饭,他跟我再次谈起两年前为公司临时写的一个客户端,仍然非常激动的跟我说,这个客户端完爆了公司其他版本的客户端,包括最老的Delphi写的,Asp.Net写的,以及最新的Wpf写的客户端.无论是多么大的界面(集成的机房多),这个系统都是瞬间打开,而且运行非常稳定,一旦成功部署之后基本没有任何问题. 这个版本的客户端仅仅只是一个临时替代的版本:原来的Delphi

Android客户端性能优化(魅族资深工程师毫无保留奉献)

本文由魅族科技有限公司资深Android开发工程师degao(嵌入式企鹅圈原创团队成员)撰写,是degao在嵌入式企鹅圈发表的第一篇原创文章,毫无保留地总结分享其在领导魅族多个项目开发中的Android客户端性能优化经验,极具实践价值! 即日起,嵌入式企鹅圈将在之前五个专栏(Linux内核驱动情景分析.资源紧缺型SOC嵌入式架构设计.嵌入式交叉工具链及其应用.嵌入式设计和编程.微信硬件平台和物联网解决方案)新增Android开发专栏!更多Android.Linux.嵌入式和物联网原创技术分享敬请

游戏开发性能优化经验总结

优化概论 说起游戏的优化,在游戏开发中经常分为这几步: 首先要确定游戏中经常会出现哪些问题 – Profile 然后确定在哪些方向进行性能优化 – Analyze 最后再尽可能将问题逐个解决 – Solve 游戏开发中一定是先做工具,进行Profile,再进行优化,所以,说优化就不得不再扯一下Profile 常见的工具有一些是引擎和IDE自带的,比如Unity自带的Profiler,就包含了CPU,GPU,Memory等等各式各样的性能分析工具,其他的比如GPA,Xcode Instrument

Android编码规范及性能优化整理

最近看到新人的android代码实在问题太多,一些基本的地方都有问题,于是重新培训了下代码规范,希望后面能慢慢好起来. 一.Android编码规范 1.java代码中不出现中文,最多注释中可以出现中文 2.局部变量命名.静态成员变量命名只能包含字母,单词首字母出第一个外,都为大写,其他字母都为小写 3.常量命名只能包含字母和_,字母全部大写,单词之间用_隔开 4.layout中的id命名命名模式为:view缩写_模块名称_view的逻辑名称view的缩写详情如下LayoutView:lvRela

H5移动前端性能优化

在移动端,因手机的配置和3/4G网络的原因,从两个方面解决性能优化问题,1.加载不超过3秒,用loading或者资源不要超过1M.2.渲染速度. 基于以上两个方面,所有影响首屏加载和渲染的代码应在处理逻辑中后置. 加载优化: 1.Http请求: 减少Http请求,手机浏览器同时响应请求为4个请求,所以,尽量合并js和css,并且对图片进行合并. 2.缓存: 使用缓存可以减少向服务器的请求数,节省加载时间,所以所有静态资源都要在服务器端设置缓存,并且尽量使用长Cache(长Cache资源的更新可使

web网站性能优化整理

.tab { width: 600px; table-layout: fixed; border-collapse: collapse } .tab th,.tab td { text-align: center; border: 1px solid #ddd !important; line-height: 40px; color: #FFFF83 !important; background-color: #282c34 !important } ul.code { background-c

游戏渲染性能优化

忘记了以前是不是写过类似的文章了,不管了,结合近几年经验总结一下. 先从最核心的部分开始.如果熟悉图形API的朋友都应该可以理解,要想渲染一个模型,我们至少需要做两个操作,设置各种状态,调用绘图函数.这两个操作都会引起性能损失.我们分头来说 先说设置各种状态.都什么状态呢,比如使用什么纹理,是用什么着色器,是否开启Alpha测试,是否双面显示,是否使用混合以及怎么混合,等等.我们可以管这些状态统称为材质.这些信息通过调用图形API,再通过驱动进而设置给显卡.这需要时间,而且有些状态改变很耗时.

前端小游戏页面性能优化

公司是做教育类游戏开发,以前是用flash制作,现在开始使用CreateJS框架开发Canvas游戏.今天突然收到一个任务:游戏在iPad2下面游戏会打不开,然后自动刷新,再加载不出来,然后再刷新,陷入了死循环…… 发现问题: 屏幕左上角提示 “因出现错误 重新加载了网页” 解决问题: 通过度娘得知此问题是由越狱或内存引起的.排除越狱可能(因为没有越狱),剩下就是内存问题.打开Chrome更多工具里面的任务管理器(快捷键Shift+Esc)看到单页内存占用量一路飙升到800,000K左右,当时自

安卓用户使用微信H5牛牛平台性能优化方面的探索方案

经常遇到一个问题,微信H5牛牛平台网站(h5.fanshubbs.com)页面由于缓存问题经常在微信H5牛牛平台网站(h5.fanshubbs.com)发布新版本之后客户端App看不到最新的效果,之前由于杂七杂八的问题项目工期紧没好好研究,最近抽空研究了下缓存问题. 缓存问题具体表现为:UIWebview首次打开加载慢:第二次加载速度明显快:H5资源更新过后在App上看不到更改的效果 为此我认为是缓存造成的问题,我进入App目录下,看到Library下的Caches下面有很多文件名称很长的文件,