UI性能优化

本人的思路

每当动设备上打开UI界面卡顿,等待时增长,页面白块,等等体验是异常糟糕的。本文记录自己在工作中解决UI卡顿的主意。

自我要由以下方面着手

资源量

界面打开做的操作

界面自身的逻辑

IO的读写(包括接受的网络协议数据量)

自的环境

列类别:大型3DMMOARPG

Unity3D 5.3.7
基于UGUI,UI基础框架下KSFramework:https://github.com/mr-kelly/KSFramework

客户端配置文件通过sqlite存储(在Lua中读取数据)

测试机型

OPPOA57 中端机器 ,3G内存

翔参数:http://detail.zol.com.cn/1161/1160598/param.shtml

优化目标

打开界面的刹那,就能够赢得反映,等待时在0.2s之内。

页面的情好是逐月显示,但非盼出现堵塞的状况。

UI的Assetbundle大小

提议一个UI界面的之Assetbundle文件大小在1mb里,且因关系毫不超过三个,在包出来的*.manifest文件中(Dependencies节点)可以看到资源指关系。

若一个界面的图片量过多,美术可以设想在计划上简单图集,重复使用,九宫格,抽离大的背景图等方式,减少资源量。

建议:一个界面使用一个图集,减少图集间的交叉引用。

UI图占用的内存

翻单个界面的资源占用内存大小

1、点击 Window – 点击Profiler ,打开Profiler ,切换到
Memory页签

2、点击 Detaild – 点击 Take Sample ,选择
Assets/Texture2D,查看各个张图纸占用的内存

提议:单个界面图集的内存占用控制在1~2M之内,其它特殊状况,可以设想做成大图加载

整个UI界面的Gameobject数量

只要UI界面中Gameobject的多寡过多,在加载Assetbundle实例化Gameobject时,耗时会重新增长。

本身的例子:

(1个道具Prefab的Gameobject数量在10个左右)

统计UI界面的gameobject数量脚本

[MenuItem("UI/统计当前场景的Gameobject数量")]
    public static void MenuGameobjectCount()
    {
        var obj = GameObject.FindObjectOfType<UIWindowAsset>();
        if (obj)
        {
            var graphics = obj.GetComponentsInChildren<Transform>(true);
            Debug.LogFormat("当前场景的Gameobject数量:{0}",graphics.Length);
        }
    }

建议:单个界面的gameobject数量控制以100缘内

开拓界面做的操作

减去在UI打开瞬间开的操作,耗时底乘除还是操作可以延时处理。

每帧生成Gameobject

如若列表的数目过多,建议每帧或者间隔多少帧进行Instantiate操作。

以身作则代码:

function UIRewardMonthly:Update()
    if self.index and  self.index <= self.maxCell then
        local item = GameObject.Instantiate(self.itemCell.gameObject)
        item.transform:SetParent(self.scrollContent.transform, false)
        self:DoRenderItem(self.index, item.transform, self.uiCache[self.index])
        if self.index == self.maxCell then
            --print("全部格子生成完成")
        end
        self.index = self.index + 1
    end
end

IO的读取

以动端的IO操作是颇耗时的,比如读写配置文件。

剖析网络数据吧是同样种IO的操作,如果网络数据量大,解析为是于耗时的。

建议:

1、尽量减少在开辟界面时开IO的操作。

2、对需的数额提前处理,数量很多底大网数据可以进行分页。

3、对于当地数据可以开展缓存,避免在循环中展开查询或文件读写。

网站地图xml地图