我的思路

在移动设备上打开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、对于本地数据可以进行缓存,避免在循环中进行查询或文件读写。

UI性能优化的更多相关文章

  1. Android UI性能优化详解

    设计师,开发人员,需求研究和测试都会影响到一个app最后的UI展示,所有人都很乐于去建议app应该怎么去展示UI.UI也是app和用户打交道的部分,直接对用户形成品牌意识,需要仔细的设计.无论你的ap ...

  2. Unity UI性能优化技巧

    本文将介绍一些提升Unity UI性能的技巧.更多优化技巧,可以观看Unity工程师Ian Dundore在Unite Europe 2017的演讲<使用Unity性能提升技巧>. 1.划 ...

  3. Android UI性能优化实战, 识别View中的性能问题

    出自:[张鸿洋的博客]来源:http://blog.csdn.net/lmj623565791/article/details/45556391 1.概述 2015年初google发布了Android ...

  4. Android UI性能优化实战 识别绘制中的性能问题

    转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/45556391: 本文出自:[张鸿洋的博客] 1.概述 2015年初google ...

  5. [看图说话] 基于Spark UI性能优化与调试——初级篇

    Spark有几种部署的模式,单机版.集群版等等,平时单机版在数据量不大的时候可以跟传统的java程序一样进行断电调试.但是在集群上调试就比较麻烦了...远程断点不太方便,只能通过Log的形式,进行分析 ...

  6. Feathers UI 性能优化

    Feathers UI作者写的 http://joshblog.net/2013/feathers-performance-tips/

  7. 关于UI性能优化

    1.使用已经有的VIEW,而不是每次都去新生成一个 2.创建自定义类来进行组件和数据的缓存,在下一次调用的时候直接从FLAG中取出 3.分页,预加载 使用VIEWSTUB进行调用时加载 VIEWSTU ...

  8. android app性能优化大汇总(UI渲染性能优化)

    UI性能测试 性能优化都需要有一个目标,UI的性能优化也是一样.你可能会觉得“我的app加载很快”很重要,但我们还需要了解终端用户的期望,是否可以去量化这些期望呢?我们可以从人机交互心理学的角度来考虑 ...

  9. Android应用性能优化(转)

    人类大脑与眼睛对一个画面的连贯性感知其实是有一个界限的,譬如我们看电影会觉得画面很自然连贯(帧率为24fps),用手机当然也需要感知屏幕操作的连贯性(尤其是动画过度),所以Android索性就把达到这 ...

随机推荐

  1. 使用javax.script包实现Java设置JS脚本中的变量

    下面例子中,我们通过javax.script包ScriptEngine.put()方法设置JS脚本中的变量,JS把所有在线用户输出. package ajava.code.javase; import ...

  2. 《天书夜读:从汇编语言到windows内核编程》九 时间与定时器

    1)使用如下自定义函数获取自系统启动后经历的毫秒数:KeQueryTimeIncrement.KeQueryTickCount void MyGetTickCount(PULONG msec) { L ...

  3. [转载] Bitmap的秘密

    转载自http://www.infoq.com/cn/articles/the-secret-of-bitmap/ 之前已经参加过几次QCon峰会,不过今年QCon 2014 上海峰会对我来说比较特别 ...

  4. [转载] java多线程学习-java.util.concurrent详解(四) BlockingQueue

    转载自http://janeky.iteye.com/blog/770671 ------------------------------------------------------------- ...

  5. flask + Python3 实现的的API自动化测试平台---- IAPTest接口测试平台

    **背景: 1.平时测试接口,总是现写代码,对测试用例的管理,以及测试报告的管理持久化做的不够,              2.工作中移动端开发和后端开发总是不能并行进行,需要一个mock的依赖来让他 ...

  6. 照虎画猫写自己的Spring——依赖注入

    前言 上篇<照虎画猫写自己的Spring>从无到有讲述并实现了下面几点 声明配置文件,用于声明需要加载使用的类 加载配置文件,读取配置文件 解析配置文件,需要将配置文件中声明的标签转换为F ...

  7. jQuery中使用$.each()遍历后台响应的json字符串问题

    今天在做练习项目的时候,使用$.each()方法遍历后台传过来的json字符串时,chrome浏览器中发现如下问题  Cannot use 'in' operator to search for 'l ...

  8. 重要:关于PPT转图片需要注意的问题

    关于PPT转图片的问题需要注意的问题   我们有一个项目做过直接上传ppt的功能,但是网页不可能显示ppt,所以只能把ppt转成pdf或者图片来显示,我们的做法是转成了图片,然后使用swiper做成类 ...

  9. Beautifulsoup分解

    from urllib.request import Request, ProxyHandler from urllib.request import build_opener from bs4 im ...

  10. 【javaFX学习】(二) 控件手册

    这里写的控件可能不是所有的控件,但是应该是比较齐全并足够用的了,后面还有图表类的,3d模型类,放在后面来写吧,太多了.javafx的功能比以前想象中的要强大.而且也很方便,所有的控件写完后再用Scen ...