CocosCreator内存与性能优化
一、内存优化
因为 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、对于引擎不使用的模块进行裁剪,这个可以减少引擎大小。
CocosCreator内存与性能优化的更多相关文章
- 利用 gperftools 对nginx mysql 内存管理 性能优化
利用 gperftools 对nginx 与 mysql 进行 内存管理 性能优化 降低负载. Gperftools 是由谷歌开发.官方对gperftools 的介绍为: These tools ...
- [Android 性能优化系列]内存之提升篇--应用应该怎样管理内存
大家假设喜欢我的博客,请关注一下我的微博,请点击这里(http://weibo.com/kifile),谢谢 转载请标明出处(http://blog.csdn.net/kifile),再次感谢 原文地 ...
- Go 程序的性能优化及 pprof 的使用
Go 程序的性能优化及 pprof 的使用 程序的性能优化无非就是对程序占用资源的优化.对于服务器而言,最重要的两项资源莫过于 CPU 和内存.性能优化,就是在对于不影响程序数据处理能力的情况下,我们 ...
- 使用pprof及Go 程序的性能优化
使用Golang 程序的性能优化及 Pprof 程序的性能优化无非就是对程序占用资源的优化.对于服务器而言,最重要的两项资源莫过于 CPU 和内存.性能优化,就是在对于不影响程序数据处理能力的情况下, ...
- Android性能优化之利用LeakCanary检测内存泄漏及解决办法
前言: 最近公司C轮融资成功了,移动团队准备扩大一下,需要招聘Android开发工程师,陆陆续续面试了几位Android应聘者,面试过程中聊到性能优化中如何避免内存泄漏问题时,很少有人全面的回答上来. ...
- Java内存模型及性能优化
最近在做一个项目的性能优化,遇到好多以前没有关注过的性能问题,一头雾水,今天做个笔记,简单记录下JVM相关的参数设置. 一.JVM内存模型 首先介绍下Java程序具体执行的过程: Java源代码文件( ...
- JVM内存模型和性能优化 转
JVM内存模型和性能优化 JVM内存模型优点 内置基于内存的并发模型: 多线程机制 同步锁Synchronization 大量线程安全型库包支持 基于内存的并发机制,粒度灵活控制,灵活度高于 ...
- JVM内存模型和性能优化
JVM内存模型优点 内置基于内存的并发模型: 多线程机制 同步锁Synchronization 大量线程安全型库包支持 基于内存的并发机制,粒度灵活控制,灵活度高于数据库锁. 多核并行计算模 ...
- Android性能优化之内存篇
下面是内存篇章的学习笔记,部分内容与前面的性能优化典范有重合,欢迎大家一起学习交流! 1)Memory, GC, and Performance 众所周知,与C/C++需要通过手动编码来申请以及释放内 ...
随机推荐
- Andriod正式打包、以及升级应用 重新打包 修改应用名称、应用图 标、应用启动画面
一, Android 正式打包.以及升级应用重新打包 1.android studio 把 Flutter 打包成正式包 2.修改应用版本以及升级打包 找到 AndroidManifest.xml ...
- 【资源分享】CS起源 V34.4044(经典版本)
*----------------------------------------------[下载区]----------------------------------------------* ...
- flutter web 配置环境及运行(windows)
此下 操作 都是基于 windows 一, 将镜像添加到 用户环境变量中 由于在国内访问Flutter有时可能会受到限制,Flutter官方为中国开发者搭建了临时镜像,大家可以将如下环境变量加入到用 ...
- 设置背景图片的方式(优秀)--把图片放在一个div里面
优点: 此种情况可以保证图片充满整个windows,即使有扩展显示器也可以 <div id="formbackground" style="position:abs ...
- C语言随笔4:指针数组、数组指针
数组: 1:数组名为地址,表达方法: Int A[10]; A;//数组名表示首地址 &A;//数组名加取地址符,仍然表示首地址 &A[0];//第0个元素的地址,即首地址 数组名是指 ...
- vue指令及组件
复习 """ vue: 为什么选择vue - 综合其他框架优点,轻量级,中文API,数据驱动,组件化开发,数据的双向绑定,虚拟DO 渐进式js框架 - 选择性控制 - 创 ...
- 转载: HDMI 基础知识
转自:http://www.cnblogs.com/TaigaCon/p/3840653.html HDMI,全称为(High Definition Multimedia Interface)高清多媒 ...
- 【C语言】(指针) 将两个数排序
原理就不讲了,这里用来理解指针的使用方法 代码1: #include <stdio.h> int main() { int a, b;/* 实际变量的声明 */ int* p, * q;/ ...
- CSS学习(8)盒模型
box:盒子,每个元素在页面中都会生成一个矩形区域(盒子) 盒子类型: 1.行盒,display属性=inline的元素,不换行(默认值) 2.块盒,display属性=block的元素,换行 浏览器 ...
- python关于操作文件的相关模块(os,sys,shutil,subprocess,configparser)
一:os模块 os模块提供了许多允许你程序与操作系统直接交互的功能 功能 说明 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirna ...