问一个ui加载性能优化的问题

我在做ui管理的时候发现在原生安卓上 无论打开什么ui 都不能做到“秒开”,试过加载prefab,原生的性能和h5(浏览器)比,还是差了一大截,特别是实例化对象,
我也勾选了优化多次创建的性能,还是明显能给人感觉到一顿一顿的卡顿,如果是一个200k左右的prefab 这个会更明显!
之前想过 创建好后 就不销毁,直接设置opacity 来控制隐藏显示,但是我们游戏系统比较负责 ui 就有一两百个界面,我不可能所有都缓存起来,内存吃不消,查了一圈也没找到更好的优化方案,我以前是quick 和2dx的老用户,明显在感觉到 在原生方面 ,性能不是一个量级。。。看了官网说的2.2.x 和2dx quick性能持平,我保持质疑态度,光看运行时的fps是不可取的,但是创建实例效率实在是太低了。。。为什么官方不做一个功能 构建项目 把json转为flatbuffer ?开发的时候 还是json 这样会不会更快一点? 我看了下论坛90%的人 都是用creator 做小游戏,但是我们是做传统的商业网游,目前市面上也没发现一个用creator做的商业网游比较成熟的案例,心里特别没底。

总结下我目前能想到的优化点:
1,图片改为etc1
2,经常打开的界面,可以loading的时候预先加载,关闭的时候 不真正的remove 而是设置opacity
3,ui里面动态加载的item,采用分帧(治标不治本)
4,经常创建的界面勾选 优化多次创建的性能

请问有没有谁对原生这块做过比较好的性能优化的?项目是偏商业网游的 不是小游戏

2赞

百度《开黑三国》,了解一下~~我们从QUICK转过来CCC的,和你遇到的问题一样,基本也是无解……

对于JS这种全是异步行为的内存管理与进程管理,我们依然毫无办法,任由他卡。

顺便羡慕一下,《AKF》的性能表现真好

同关注

原生Android下

  1. cc.loader 动态加载一个本地 Prefab,好像是会影响渲染,导致FPS下降。动态加载 200k Prefab 会很明显,如果过程中有序列帧动画,能明显感觉到动画跳帧了,不连贯
  2. 实例化 Prefab 为一个节点的时候,同楼主反馈,一卡一卡
  3. 尝试过分帧创建实例,在创建那时候依旧会感觉到FPS的下降,界面小卡
  4. 界面大多采用 setPosition 到很远一个地方,同时设置 opacity 为 0 去代替 active = false 的效果,比楼主多一个 setPosition 是为了解决触摸事件还有可能被触发的问题。但是,在opacity变化(特别变为0和变为255)的时候,依旧能感觉到卡顿

实际上,这些小卡顿问题,在低端机上会比较明显,新一点的机器表现没那么明显,但是细心体会依旧会发现不能实现“秒开”

在这个前提下,还有一点可以肯定的是,动态加载并实例化大的Prefab肯定比小的Prefab相对卡一点,所以一种优化思路就是将Prefab颗粒度再降低,但是这可能会增加很多开发工作

可是AFK是用的cocos2djs 说不定还是一个远古的定制版本,我感觉吧现在的ccc工具链是比以前好点了,工具链在性能和稳定性方面根本不值得一提

这个,我想过,就是把prefab拆分为很多小的,这样就可以多个异步加载,但是这样就增加了开发的工作量,拼界面修改界面也变得很麻烦,也同样会增加文件数量,我们工程比较大,界面就一两百个。

:slightly_smiling:顶一下 希望大家一起来探讨 也希望官房的大佬们能给点建设性意见

这个没什么好说的,不管用什么,资源大了肯定就会卡,只有异步预加载。

你应该没看我详细描述吧

读取资源是会导致卡顿,所以我们没法在底层去优化的话,就尽量在开发层面去优化。我们现在现在使用的方式有

  1. 细分每个prefab的粒度,尽量不让每个加载prefab的大小大于100k,有些不必要的资源可以初始化的时候动态加载,但是这会导致项目难维护
  2. 加载资源和播放动画尽量不一起运行。一般的弹框打开会有打开动画,也会这个时候初始化界面,如果初始化界面会创建很多item,也会导致打开动画卡顿严重,所以我们是弹框打开动画播放完后再进行初始化界面的操作
    3.禁止使用系统字体和富文本,这个两个东西会导致严重卡顿,尽量使用bmfont字体
    4.列表类弹框有scrollview和很多item的就使用动态复用列表,这样不会因为显示数量太多导致需要创建过多的item,动态复用列表在论坛和github里都有很多,一搜就可以找到

如果还有其他方法的话可以互相沟通哈哈~

1赞

现在用的哪个版本的呢

这个问题真的非常影响体验,希望官方能早日优化一下。另外1.x-1.10.1基本上能做到秒开,从2.x开始就卡顿的厉害。

mark
很常见的问题

就算是拆分后打开界面后异步加载,如果此时又有滚动列表,还是会感觉到卡顿的。

就没人关注这个基本问题么

天天吹嘘性能多好

@jare

官方嗯? 关注哈呗

顶顶, 基本需求啊

老帖子居然被挖出来了
以前做的一片偏重度手游的时候也遇到了此类问题,用的是1.9.3。使用的策略跟上面的差不多,基本就是拆分prefab异步加载,减少实例化prefab的大小,同时增加prefab缓存队列,对于游戏内的热点prefab做缓存,prefab里面的资源做分帧加载,如果弹窗用的是animation动画,尽量改成程序代码实现。如果缓存过多,还需要加一套内存释放机制。
差不多这样就基本解决了特别卡的问题,但是还是会有小的卡顿,没办法做到秒开。当时我们主程的说法是creator 性能天然比2dx差。

原生android确实卡,果断放弃了原生,直接用原生webview。

分享一个我们遇到的引起卡顿的点,仅作参考。

有一个界面会显示很多技能图标,技能图标合成为一张张的plist。这些plist算起来有几百个图片帧。在第一次加载这些plist的时候会非常的慢。原因是每个图片帧都有一个独立的json文件,显示界面的时候需要加载上百个json文件,所以很卡。

因为这些图标都是用代码动态显示的,所以我作了一个优化:把碎图合成一张大图之后,不用plist文件,而是用脚本生成一个json文件,里面描述了每一张碎图的位图,像这样子:

{
    "mh_fsxl5": [4,0,726,662,64,72,0,0,80,80],
    ...
}

然后用代码动态生成SpriteFrame显示出来。没优化之前打开界面需要2秒左右,优化完打开只有300毫秒左右。

这个方法只适用于动态加载的图集,对于需要在编辑器里设计的图片,试试在打包的时候对Bundle选择合成一个JSON,这样就不会有很多碎的json,文件IO大大减少,也许会有效果。

9赞

看过大神之前animation的优化,确实牛逼,我都想投奔了