CocosCreator性能调优优化集锦
前⾔
⼀、为什么要做性能优化?
性能:是⼀种优秀的能⼒。唤醒快、运⾏持久、稳定。这种能⼒在游戏上能让你的⽤户感觉很爽,表征表现为加载快,⼿机不发热,运⾏流畅,不卡顿。所以,性能优化的终极⽬标是,让你的⽤户感觉很爽,当然这种爽你不能以牺牲⾃⼰为代价,要考虑成本和副作⽤(总不能频繁使⽤伟哥对吧)。我们要优化性能,⾸先要搞明⽩是哪些因素会影响性能?是体⼒不⾏就得加强锻炼,是操劳过度就应该学会休息。在我们的游戏中,哪些因素会影响性能呢?
⼆、影响性能的因素有哪些?
如果⼤家不知道如何,那我给⼤家引导下。当你玩游戏的时候,⾸先是不是要将你的游戏加载到内存。前戏太长,你肯定会等得不耐烦吧,不爽,是不是要优化。那么第⼀个问题来了,如何优化游戏加载速度(三、1),我们先记录下来,下⾯逐⼀讲解。
其次,你好不容易把东西放内存⾥去了,但是屏幕没任何东西,也不给你发出点声⾳。这体验不好!也就是说屏幕渲染游戏界⾯耗时太长,卡顿,需要优化,所以,第⼆个问题,如何优化渲染速度(三、2)?
最后游戏运⾏过程中,运⾏速度受什么影响?与设备内存、CPU、代码有关,所以我们要做内存优化(三、3)、CPU占⽤及性能优化(三、4)。
三、性能优化从哪些⽅⾯着⼿?
1.如何优化游戏加载速度【加载优化】 问⼤家⼀个问题,你⼀个8M的东西和⼈家⼀个1M的东西,你说谁会先加载进去?肯定是1M的,所以⾸先要想⽅设法优化包体⼤⼩。
这⾥有个⼤家可以⼀起学习交流哦
**【优化包体⼤⼩】的⽅法有哪些?**⾸先想下你的包体⾥⾯有啥?哪些东西占⽤的内存最⼤,哪些东西压缩的可能性最⼤?项⽬路径下有res、scenes、scripts,还有游戏引擎,等。简⾔之,包体的组成分为:资源和代码。
**(1)资源:图⽚、声⾳、动画等。**避免⼤尺⼨的图⽚出现:纯⾊图⽚或有规律的图⽚⽤⼀像素的图⽚表⽰,带圆⾓的按钮背景图⽚⽤九宫格形式展⽰。另外有⼀点也要格外注意,cocos creator所⽀持的最⼤图⽚尺⼨为20482048,超过这个尺⼨的图⽚在显⽰时会有问题,常见于⼀些Spine动画打包出来后没注意资源图⽚尺⼨,导致动画显⽰异常。如果是地图资源超过20482048,常见于⼀些mmo项⽬,这种情况下,需要对地图资源进⾏切分,切分成⼩于2048*2048的若⼲图⽚,在游戏中再拼接在
⼀起。
**图⽚压缩:**图⽚的压缩格式:背景,jpg体积要⼩于png,背景图⽚jpg,很多图⽚格式,导出美术图后,这些图,仍然可以压缩。百度搜索在线压缩图⽚,即可到相应⽹站直接操作。https://www.yasuotu/
图⽚分辨率:1920x1080 > 960x540,减少分辨率;–>降低了清晰度的;尽可能的时候九宫格的图⽚,来代替⼀张整图按钮
200x100, 300x100;–>⼤⼤的降低的图⽚的分斌率,这样就可以节省资源;
图⽚资源的模块化:
类似这样,将各个界⾯的美术资源、帧动画分类并且打包成图集也是⽐较好的处理⽅法,将资源进⾏模块化。这样在加载时,以及游戏运⾏时,会有以下⼏点好处:
1.提升加载速度
省去了多次打开/关闭⽂件所带来的时间损耗
2.减少⽂件的体积
多张图⽚合并到⼀起,在包体上⾯会有⼀定的优化
3.减少D r awC all
1
使⽤时,由于这些美术资源都是⼀起配合使⽤的,因此放在⼀张图集中,可以减少渲染的DrawCall数量,对渲染的性能也有优化的作⽤。
如下是压缩后的⾳乐⽂件和压缩前的⾳乐⽂件⼤⼩对⽐,缩⼩为压缩前的⼗分之⼀了。
字库:
尽可能的不要⾃⼰带字库。(1)特效⽂字,尽量使⽤位图字体,⼏个字母+图⽚,体积远远⼩于⼀个完整的字库,性能还要好,数字、界⾯的⽂字,例如我们的《》中就是采⽤这种⽅案!bmpfont – .png + .fnt⽂件;(2)尽可能的使⽤系统字库;(3)字库可以压缩fontmin;特定的数量固定的⽂字;(4)位图字与⽮量字,哪个性能更好? ? ? 位图字:速度快,但是,内存⼤;⽮量字:速度慢,但是内存⼩;
**【预制体】:**⾸先先说⼀下prefab在使⽤时的步骤:从⽂件中读取数据 → 反序列化数据 → 还原得到Prefab节点树 → 预处理 → 实例化 Prefab这块的加载优化主要集中在两个地⽅:⼀个是load加载耗时优化,另⼀个是实例化耗时优化。①合理拆分Prefab越⼤的prefab⽂件在加载过程中的耗时是越长的,⽽且通常不是等⽐,⽽是以类似平⽅曲线这样的去增加时长的。例如读取⼀个100kb的⽂件,可能耗时也就10毫秒,但对于⼀个1M或者是2M的⽂件,我们在加载时就不是100毫秒,可能就是⼏百毫秒。类似这样七⼋百kb的prefab⽂件,我们就要去思考⼀下,是不是⾥⾯的节点都必须做成⼀个prefab?是否可以拆分成2个以上的prefab,通过拼接的⽅式组合?⼀个prefab我们可以将它看作为⼀个功能模块,⽽功能模块并不是越⼤越好,⽽是功能职责越单⼀越好,遵循这个原则,我们可以对prefab做更好的拆分。记住:职责单⼀原则,逻辑清晰,解耦,便于后期维护。加载快!!js文字动画特效
②延迟加载资源
在场景处可以到。在Creator的资源管理器中点击编辑好的prefab资源,在属性检查器中我们可以看到延迟加载资源的选项。勾选这个选项可以减少prefab的加载耗时,但⾸次显⽰的耗时会增加。
这是由于勾选后,Prefab所引⽤的资源,像图⽚、⾳效这些,不会在load时加载,⽽是会在Prefab第⼀次显⽰的时候再进⾏资源的加载。因此需要根据具体的使⽤环境进⾏选择。
③选择优化策略
在prefab的属性检查器中,我们可以看到优化策略这个选项。这个也需要我们根据实际的使⽤情况进⾏选择。当我们选择“优化多次创建性能”这个选项时,Prefab加载后会进⾏⼀个预处理的操作,这个预处理其实就是动态⽣成⼀些prefab的实例化代码,并把这些代码交给jit 去进⾏优化。这样在实例化时的耗时将会⼤⼤减少,相应的,在load时的耗时会有所增加。
当我们选择“优化单次创建性能”这个选项时,prefab加载后会跳过预处理的步骤,这样在加载时的耗时会减少很多,但实例化时的耗时会增加。例如⼀些固定UI界⾯,由于⽅便加载场景或者时进⾏功能划分,通常会做成prefab,这种prefab只会加载⼀次的,就可以选择这个选项,提升加载的性能。
需要注意的有⼀点:由于⼩游戏平台禁⽤了动态加载代码,类似eval这些不能使⽤,因此优化策略这个选项在⼩游戏平台是⽆效的。
**(2)代码:**代码体积(引擎+业务逻辑代码) -⼤头在引擎。解决⽅案:引擎:⾮常简单,你只要把不要的模块去掉就可以了,你要知道哪些模块是占体积多的,物理引擎,能不⽤的模块,就不⽤。【项⽬设置】-【模块设置】,只打包必要模块即可。
能不⽤tilemap就不⽤,因为Cocos中有⾜够优秀的2D编辑器,可以替代tilemap,能⽤碰撞检测引擎就不⽤物理引擎。可以通过项⽬设置,去掉游戏中没有使⽤的功能模块,减少包体⼤⼩。如下图,将不需要的模块去掉,再打包。
业务逻辑代码⼀般我们也没法修改,你的业务逻辑差不多,但是,要注意⼀个95%以上的同学,都会忽略的⼀个事实:src⽂件夹内的settings⽂件。
其实settings⽂件⼤⼩是可以修改的。⾸先⼤家要搞明⽩它的⼤⼩是由谁决定的?如果你不搞清楚这个问题,你就没办法优化,即使别⼈告诉你这么做,你也会纳闷。所有需要代码加载的资源放到resources,否则坚决不放到resources⽂件夹内。因为程序不知道哪些资源需要加载,也不知道你什么时候加载,所以会⼀股脑在settings⽂件中建⽴资源的映射。
如下图所⽰,将资源放在res中和将资源放在resources⽂件夹下,settings⽂件的⼤⼩对⽐。注意:需
要清空build再打包。
2.如何优化渲染速度【渲染优化】
渲染⽅⾯优化主要集中在如何降低draw call上,draw call越多,渲染的压⼒也就越⼤,对应的帧率可能就会下降,正常情况下如果draw call超过100就有可能带来卡顿,所以要注意这⽅⾯的优化。draw call:游戏场景⾥⾯物体,分⼏次提交给显卡绘制,这个次数就是等于drawall次数。100个物体,100次提交给GPU,就是100个draw call。
**draw call过⾼为什么会影响性能?**GPU:每次绘制我们的图像—》⼀次能吞吐⼀定数⽬的三⾓形的,如果你的draw call过⾼,每次绘制的时候,GPU本来可以⼀次吃更多的三⾓形,但是你没有让我吃饱,GPU性能没有发挥出来。CPU:10个精灵,–》10张图⽚;每次渲染管道⾥⾯再绘制的时候,只能带⼀张纹理, 每个精灵的纹理对象,是不⼀样的, 所以⽆法合批() 到底什么样的能在⼀个draw call⾥⾯绘制呢? mesh相同—纹理相同,shader要相同,参数要相同,draw call合批-- >绘制; ⽐如,10个物体:sprite1, sprite2, sprite3, label, 9宫格sprite, sprite; 推荐⽅法:
【1】合并渲染批次,降低 D r awC all,提升渲染性能
(1)使⽤⾃动图集或使⽤ TexturePacker 对碎图进⾏打包处理:只有图集内的精灵才有可能在⼀个draw call绘制→合批.这样操作的话,可以让多个 Sprite 渲染的纹理都是同⼀张图集图⽚,合并这些 sprite 的渲染批次,就可以减少 DrawCall 以及 CPU 的运算开销。(2)合批的时候,尽可能的不要打乱了合批:例如上⾯label的出现打乱了sprite的结构,就不能合批。(3)为什么label会单独做⼀个draw call?⽂字会绘制在纹理中。(4)资源处理,减少 Mask 组件数量:由于 Mask 组件需要在 stencil 和 content 前后都添加修改 gl 状态的 render command,因此使⽤ Mask 会打断我们的 DrawCall 批处理。对于⼀些特殊的显⽰,例如圆⾓的 icon 等,如果条件允许,尽量不要使⽤Mask 组件来进⾏处理,⽽是通过对资源进⾏处理达到同样的效果。⽬前 Mask 组件、Spine 组件、DragonBone 组件都会打断批处理,在节点结构上我们要避免被打断的情况发⽣。(5)复⽤节点,减少节点数:当显⽰或隐藏这个界
⾯时,⼤量的节点会带来⼤量的 enable 和 disable 的开销。⽐如好友排⾏,假设有1000名好友,没必要设置1000个节点,设置⼀页显⽰的节点即可,之后更换这些节点的显⽰内容。
最快的办法就是合并碎图成图集,然后同⼀图集的按照顺序摆放节点,中间不能插⼊其他图集的节点。
3.内存优化
静态资源的内存管理:静态资源指的是场景中直接或间接引⽤到的所有资源(脚本动态加载的资源不算在内)。在场景资源的属性编辑器中可以勾选“⾃动释放资源”选项,从⽽在切换场景时,会⾃动将旧场景使⽤的静态资源释放掉,从⽽节省内存的占⽤。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论