专栏首页腾讯NEXT学位小游戏内存优化与性能优化

小游戏内存优化与性能优化

| 导语 听说你的小游戏内存超标?进来了解一下吧。

本文主要跟大家一起来探讨一下Cocos Creator小游戏开发过程中内存优化、性能优化和包体优化。

一、内存优化

因为 iOS小游戏和微信共用同一个进程,而微信在连续两次收到系统内存警告的时候会关闭小游戏并释放小游戏占用的内存。如果你的小游戏有外网用户反馈“闪退”,或者你自己测试的时候频繁出现“该小程序可能导致微信响应变慢被终止”等提示,那么就应该是时候优化你的小游戏内存了!

1、优化双份纹理(必做!)

在你的项目中添加如下代码,就可以减少大量内存:

这里面的原理是,当Creator使用DOM的Image对象去加载一个图片资源的时候,微信底层的引擎会解码图片数据,同时往GPU上传一份纹理,然后引擎的Sprite在渲染的时候会使用这个DOM Image再生成一份GPU纹理并上传,导致GPU里面存在双份纹理。使用 Image.scr = '' 可以释放掉GPU里面多出来的一份纹理,同时也会释放CPU端解码的纹理内存。所以,基本上对 Image对象调用了 src = '' 这个操作,这个Image对象占用的内存就释放干净了。

之前尝试使用DOM Image pool,当一个图片资源解码成功并且上传GPU以后,把这个Image对象的src置空后放入池子,然后重复利用。不过对比了一下内存占用,感觉 src = '' 之后内存立即就释放了,优化作用并不是很明显。

2、优化图集

最好对所有的碎图资源进行图集合并(Creator自带一个自动图集合并工具),并且最大限度填满图集,不要留有太多空白。图集的大小尽可能限制在1024*1024以下,因为有些图片有不少透明像素,合并图集的时候可以trim掉这些透明像素。另外合图还可以优化Drawcall,减少图片读取和解码操作,对性能也有一定优化。

另外,对于显示效果要求不高的界面,可以适当降低图片的尺寸。

3、优化Label

Creator1.9.3之前的版本,每创建一个系统字体就会生成一个离屏的Canvas对象,然后保存这个Canvas对象的context,每次draw一个系统字体的时候会调用这个context的fillText方法生成一张纹理并渲染。1.9.3以后我提交了一个优化,所有的系统字体渲染共享一个离屏Canvas,这样大概可以优化30M左右的内存(不同的项目效果不一样)。

老引擎参考PR地址:

optimization label memory #2693 fix label rendering issue #2880 (这个PR主要是Bug修复)

4、优化资源释放

对于二级弹框和场景资源释放,可以使用cc.loader.release接口配合场景的“自动释放”属性来实现 。

对于一个二级面板,我们可以约定这个二级面板引用的资源范围。我们把游戏中共用的资源放到Common图集中,把每个二级面板的资源放到自己的图集中。当释放资源的时候,我们可以通过 cc.loader.getDependsRecursively(‘prefab url’) API拿到面板Prefab所引用的所有资源,然后对这个返回的资源数组做资源释放。

比如,在我们的项目里面,释放资源的时候,我排除了Common,Main,Game/FX目录下面的图集资源:

 场景的资源释放只需要勾选一个属性就可以了:

二、性能优化

目前小游戏的性能瓶颈大多在JS层面,可以使用Chrome先去profiles性能热点,然后针对性地去做优化。

这里给出几点优化建议:

1、游戏中频繁更新的文字,推荐使用BMFont,系统字体会比较消耗性能。

2、优化Drawcall,尽可能减少Drawcall数量。

3、减少Mask组件的使用,该组件会导致游戏中的Drawcall数量变多。

4、禁用引擎的culling,禁用方法cc.macro.ENABLE_CULLING = false。

5、如果使用物理引擎,可以把物理引擎的step间隔调大。

6、优化节点树,减少节点数量。

7、场景中不要挂载过多的Prefab,可适当将一些Prefab变成动态加载的。

三、包体优化

因为微信小游戏对于包体有4M的限制,最近才刚开始升到8M,但是必须要分包,而且每一个分包的大小还是不能超过4M。

下面给出一些优化建议:

1、首包中不要包含过多的资源,如果一定要包含,请务必压缩。对于背景图片可以使用JPG,PNG图片可以使用png8进行压缩。

2、代码必须使用uglify进行压缩,尤其是第三方库,游戏代码如果使用release构建引擎有做uglify。如果想进一步压缩代码体积,需要考虑使用Google Closure Compiler进行高级压缩。

3、不需要动态加载的图片资源不要放到resources目录,放到此目录的资源在构建导出的时候,会生成资源映射关系到Settings.js中,会导致该Settings.js文件变大。另外为了防止缓存问题,需要使用md5,此时Settings.js文件会进一步膨胀。过气的活动Prefab也可以移出resources目录,所以定期资源清理也是必要的。

4、Settings.js文件优化,可以自己写脚本把md5Map里面的rawAssets的md5映射存到原本的rawAssets中,然后在boot.js里面还原md5Map即可。优化之后的Settings.js长这个样子:

boot.js里面还原md5AssetMap的的代码:

5、一定要使用release模式构建,这种方式构建出来的json资源会压缩,Settings.js也会优化。

6、对于引擎不使用的模块进行裁剪,这个可以减少引擎大小。

---------------------------------------------------------------

原文作者:腾讯工程师屈光辉。

来源:腾讯内部KM论坛。

你也想成为腾讯工程师?

也想年终奖人手一部 Iphone X?

那就快加入前端NEXT学位吧!

前端NEXT学位课程第八期火热招生中!

上腾讯课堂官网搜索Next学位还有大量免费体验课等你哟~

本文分享自微信公众号 - 腾讯NEXT学位(NextDegree)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-09-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 漫极客 CTO 李焱:大前端之路 - 如何用Web技术一统三端(Web、Desktop、Mobile)开发

    腾讯NEXT学位
  • 小程序的底层框架

    ? | 导语  前端的框架太多让人眼花缭乱,很多相似的地方,优秀的地方大家都会借鉴,同时又会有各自的一些特点。小程序也好,其他框架也好,理解他们的设计缘由、实...

    腾讯NEXT学位
  • 干货 | 认识数据库

    以前对数据库的了解,大概就是一个存放数据的地方,可进行增删查改,更多的就…慢慢学吧。

    腾讯NEXT学位
  • Web 前端常用专有名词的正确拼写

    本文遵守创作共享CC BY-NC-SA 4.0协议 网络平台如需转载必须与本人联系确认。

    Joel
  • Python爬虫进阶必备 | 关于某查猫查询参数的加密逻辑分析

    找到要分析的参数,通过首页的检索栏,输入企业名称关键字点击查询就可以抓到类似下面的两个包。

    咸鱼学Python
  • 在浏览器中使用TensorFlow.js和Python构建机器学习模型(附代码)

    你最喜欢用什么工具来编写机器学习模型?数据科学家们对这个永恒的问题会给出各种不同的答案。一些人喜欢RStudio,另一些人更喜欢Jupyter Notebook...

    大数据文摘
  • 独家 | 在浏览器中使用TensorFlow.js和Python构建机器学习模型(附代码)

    本文首先介绍了TensorFlow.js的重要性及其组件,并介绍使用其在浏览器中构建机器学习模型的方法。然后,构建使用计算机的网络摄像头检测身体姿势的应用程序。

    数据派THU
  • Vuex之结构

    之前整理了vuex的使用场景,现在开始学习学习怎么使用。我会根据官网api来重新学习一遍。

    wade
  • Vue.js学习笔记(3)

    程序员不务正业
  • 【C++】几种类型的new介绍

    函数Func2(), a==NULL 并不能起到保护内存分配失败的场景,需要用catch来处理。

    灰子学技术

扫码关注云+社区

领取腾讯云代金券