《laya踩坑日记》性能优化 (不断更新添加)
文本优化
不对文本的属性(例如大小、颜色、粗细、斜体、对齐等等)作出任何改变的话。那我们可以使用changeText()来替换文本
文字描边少用,设置了描边的文本比没有描边的文本多调用一次绘图指令
加载优化
自定义worker,解决项目中耗费CPU的地方
各个dialog界面资源在打开时再去加载,可以用小加载过渡,一个界面的UI资源放在同一个文件件内
加载后的界面及时清理 Laya.loader.clearTextureRes(urlStr);
内存优化
1、对象池优化-----------------------laya.utils.Pool
static getItem(sign: string): any {}
static getPoolSizeBySign(sign: string) {}
static getItemByCreateFun(sign: string, createFun: Function, caller: any = null): any {}
static getItemByClass(sign: string, cls: new () => any): any {}
回收同理
最好上面再封装一层 PoolManager
2、使用Handler.create(使用了对象池)
可回收,可重用
3、释放内存
JavaScript运行时无法启动垃圾回收器。要确保一个对象能够被回收,需要删除对该对象的所有引用。Sprite提供的
destory()
方法会帮助设置内部引用为null。尽可能将引 用设置为null,以便垃圾回收器用较少时间来查找对象4、资源卸载
Laya.loader.clearRes(asset);
5、减少使用滤镜,遮罩
原因:运行时将在内存中创建两张位图。其中每个位图的大小与显示对象相同。将第一个位图创建为显示对象的栅格化版本,然后用于生成应用滤镜的另一个位图,当修改滤镜的某个属性或者显示对象时,内存中的两个位图都将更新以创建生成的位图,这两个位图可能会占用大量内存。此外,此过程涉及CPU计算,动态更新时将会降低性能
6、资源
图片资源缩小,在程序中放大,可能造成糊的情况,比如非焦点的缩小67%,这样scale设置1.5就是原设计大小了
资源压缩,图片压缩,android使用ogg格式的音效,MP3的bgm
动画资源的帧可尽量少,特别是技能的。手机上一闪而过不影响太多效果,图片可以缩的更小。在程序放大即可
图片为2的整数幂:在手机上,图片传到显存后,宽高会变成2的整数次幂,比如下图很明显,这样会节省很多显存,同理其他资源
优化sprite
减少层次嵌套,减少sprite
非可见区域设置visible=false,比如打开界面的时候,可以把人物以及界面上的特效的visible设置false,可以有效降低drawCall
大量静态或者不经常变化的内容,设置cacheAs normal\ bitmap
catchAs
normal:减少sprite节点数,Canvas下进行画布缓存,webgl模式下进行命令缓存(渲染命令)。该模式性能优化中等,它能减少每帧渲染的节点数,但不会减少DrawCall数和Shader数
bitmap:减少drawCall和sprite,Canvas下依然是画布缓存,在webgl模式下使用renderTarget缓存,相当于缓存成静态位图提交显卡渲染。这里需要注意的是,webGL下renderTarget缓存模式有2048大小限制,超出2048会额外增加内存开销。另外,不断重绘时开销也比较大,但是会减少drawcall,渲染性能最高
注意:代码中设置cacheAsBitmap=true,实质上等同于cacheAs的normal模式,并不是bitmap模式。当值为”normal”时,Canvas下进行画布缓存,webgl模式下进行命令缓存。webGL下命令缓存模式只会减少节点遍历及命令组织,不会减少drawcall,性能中等。
简单总结:
normal:只缓存渲染命令,会减少 sprite节点数,优化节点渲染,不会增加内存
bitmap:直接换成成一个静态位图,之后不再提交渲染,所以会增加内存,有效减少sprite节点数和drawCall
/** * 指定显示对象是否缓存为静态图像。功能同cacheAs的normal模式。建议优先使用cacheAs代替。 */ public function get cacheAsBitmap():Boolean { return cacheAs !== "none"; } public function set cacheAsBitmap(value:Boolean):void { //TODO:去掉关联 cacheAs = value ? (_$P["hasFilter"] ? "none" : "normal") : "none"; }
降低drawCall总结
- 尽量保证同图集的图片渲染顺序是挨着的,如果不同图集交叉渲染,会增加DrawCall数量。
- 尽量保证同一个面板中的所有资源用一个图集,这样能减少提交批次。
- 程序字在游戏里是会单个字生成图片绘制在动态图集里,所以程序字也是一个图集,把所有的文字统一放在界面最上层可以减少drawcall,根据界面判断
- 相同资源放在同一个容器(box)下面,比如玩家A.影子.玩家B.影子会生成四个drawCall,修改成 box(影子,影子),box(玩家A,玩家B)就可以减少成3个drawcall,N+个角色就减少N个drawcall
- 对复杂静态内容设置cacheAs,cacheAs主要通过两方面提升性能。一是减少节点遍历和顶点计算;二是减少drawCall,使用好cacheAs是游戏优化的关键。
- cacheAs静态缓存:设置cacheAs后,还可以设置staticCache=true以阻止自动更新缓存,同时可以手动调用reCache方法更新缓存
- 以下场合减少使用cacheAs: 1、单一图片或者字设置"bitmap"会增加drawCall。 2、容器内有动画等经常变化,可查看统计面板的第一个值(0/0/0)来判断是否一致刷新Canvas缓存
CPU优化
- 减少动态查找,减少对象上组件的查找
- 减少try catch的使用,被try catch的函数执行会变得非常慢
- 计时器里尽可能不要在循环里创建对象及复杂计算,比如发射大量子弹
- 清理对象时,也要清理其内部的timer
- 少用autosize和getbounds,autoSize在获取宽高并且显示列表的状态发生改变时会重新计算,对拥有大量子对象的容器应用autoSize是不可取的
- 改变帧率 Stage.FRAME_SLOW维持FPS在30;Stage.FRAME_FAST维持FPS在60;Stage.FRAME_MOUSE则选择性维持FPS在30或60帧。推荐使用Stage.FRAME_MOUSE
- 使用callLater callLater使代码块延迟至本帧渲染前执行
- 图片/图集加载 资源按照关卡,场景等分类加载,使用后卸载
- 一帧只计算一部分,放到一个待计算列表里,每一帧,只拿出若干个进行计算,这样有的怪会晚几帧才会飘出伤害,在视觉上是没有区别的。但就不会在释放技能的时候卡一下。
- Laya.Stage.getTimeFromFrameStart:获得当前时间距离当前帧开始时间的差值,可以设置阈值将剩余的事情放到下一帧执行
- 重写 View.createView 可以设置一次只加载一部分,比如背包先加载背景-道具底栏-道具等做法
显存优化
图片纹理压缩
png/jpg需要cpu解码成纹理,才能被GPU使用
使用charome性能分析器
Network:查看资源下载速度
performace:解决性能瓶颈,查看山峰图的情况,以此判断出卡顿情况或者update处理事件过长
Memory:查看是否存在内存泄漏, 连续15分钟+变卡的游戏大部分都是内存泄漏造成的
本文地址:https://blog.csdn.net/weixin_41640571/article/details/110236584