欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

《laya踩坑日记》性能优化 (不断更新添加)

程序员文章站 2022-03-26 10:29:29
文本优化不对文本的属性(例如大小、颜色、粗细、斜体、对齐等等)作出任何改变的话。那我们可以使用changeText()来替换文本...

文本优化

不对文本的属性(例如大小、颜色、粗细、斜体、对齐等等)作出任何改变的话。那我们可以使用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的整数次幂,比如下图很明显,这样会节省很多显存,同理其他资源

《laya踩坑日记》性能优化 (不断更新添加)

优化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优化

  1. 减少动态查找,减少对象上组件的查找
  2. 减少try catch的使用,被try catch的函数执行会变得非常慢
  3. 计时器里尽可能不要在循环里创建对象及复杂计算,比如发射大量子弹
  4. 清理对象时,也要清理其内部的timer
  5. 少用autosize和getbounds,autoSize在获取宽高并且显示列表的状态发生改变时会重新计算,对拥有大量子对象的容器应用autoSize是不可取的
  6. 改变帧率   Stage.FRAME_SLOW维持FPS在30;Stage.FRAME_FAST维持FPS在60;Stage.FRAME_MOUSE则选择性维持FPS在30或60帧。推荐使用Stage.FRAME_MOUSE
  7. 使用callLater  callLater使代码块延迟至本帧渲染前执行
  8. 图片/图集加载  资源按照关卡,场景等分类加载,使用后卸载
  9. 一帧只计算一部分,放到一个待计算列表里,每一帧,只拿出若干个进行计算,这样有的怪会晚几帧才会飘出伤害,在视觉上是没有区别的。但就不会在释放技能的时候卡一下。
  10. Laya.Stage.getTimeFromFrameStart:获得当前时间距离当前帧开始时间的差值,可以设置阈值将剩余的事情放到下一帧执行
  11. 重写 View.createView  可以设置一次只加载一部分,比如背包先加载背景-道具底栏-道具等做法

显存优化

图片纹理压缩

png/jpg需要cpu解码成纹理,才能被GPU使用

使用charome性能分析器

Network:查看资源下载速度

performace:解决性能瓶颈,查看山峰图的情况,以此判断出卡顿情况或者update处理事件过长

Memory:查看是否存在内存泄漏,   连续15分钟+变卡的游戏大部分都是内存泄漏造成的

 

 

 

 

 

本文地址:https://blog.csdn.net/weixin_41640571/article/details/110236584

相关标签: laya2.2.0 laya