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、对于本地数据可以进行缓存,避免在循环中进行查询或文件读写。
UI性能优化的更多相关文章
- Android UI性能优化详解
设计师,开发人员,需求研究和测试都会影响到一个app最后的UI展示,所有人都很乐于去建议app应该怎么去展示UI.UI也是app和用户打交道的部分,直接对用户形成品牌意识,需要仔细的设计.无论你的ap ...
- Unity UI性能优化技巧
本文将介绍一些提升Unity UI性能的技巧.更多优化技巧,可以观看Unity工程师Ian Dundore在Unite Europe 2017的演讲<使用Unity性能提升技巧>. 1.划 ...
- Android UI性能优化实战, 识别View中的性能问题
出自:[张鸿洋的博客]来源:http://blog.csdn.net/lmj623565791/article/details/45556391 1.概述 2015年初google发布了Android ...
- Android UI性能优化实战 识别绘制中的性能问题
转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/45556391: 本文出自:[张鸿洋的博客] 1.概述 2015年初google ...
- [看图说话] 基于Spark UI性能优化与调试——初级篇
Spark有几种部署的模式,单机版.集群版等等,平时单机版在数据量不大的时候可以跟传统的java程序一样进行断电调试.但是在集群上调试就比较麻烦了...远程断点不太方便,只能通过Log的形式,进行分析 ...
- Feathers UI 性能优化
Feathers UI作者写的 http://joshblog.net/2013/feathers-performance-tips/
- 关于UI性能优化
1.使用已经有的VIEW,而不是每次都去新生成一个 2.创建自定义类来进行组件和数据的缓存,在下一次调用的时候直接从FLAG中取出 3.分页,预加载 使用VIEWSTUB进行调用时加载 VIEWSTU ...
- android app性能优化大汇总(UI渲染性能优化)
UI性能测试 性能优化都需要有一个目标,UI的性能优化也是一样.你可能会觉得“我的app加载很快”很重要,但我们还需要了解终端用户的期望,是否可以去量化这些期望呢?我们可以从人机交互心理学的角度来考虑 ...
- Android应用性能优化(转)
人类大脑与眼睛对一个画面的连贯性感知其实是有一个界限的,譬如我们看电影会觉得画面很自然连贯(帧率为24fps),用手机当然也需要感知屏幕操作的连贯性(尤其是动画过度),所以Android索性就把达到这 ...
随机推荐
- java二维码生成
import java.io.File; import java.nio.file.Path; import java.util.HashMap; import com.google.zxing.Ba ...
- .Net主线程扑捉子线程中的异常
首先看一段C#代码:运行后发现主线程通过try{}catch{}是不能扑捉子线程中的抛出来的异常. 代码 ); } public void run() { ...
- [转载] epoll详解
转载自http://blog.csdn.net/xiajun07061225/article/details/9250579 什么是epoll epoll是什么?按照man手册的说法:是为处理大批量句 ...
- RabbitMQ消息队列系列教程(一)认识RabbitMQ
摘要 RabbitMQ是最为流行的消息中间件,是处理高并发业务的利器.本系列教程,将跟大家一起学习RabbitMQ. 目录 RabbitMQ是什么? RabbitMQ的特点是什么? 一.RabbitM ...
- EditText 限制输入整数和小数 的位数
如题,本文主要说的就是 如何限制 EditText 中 可输入整数和小数 的位数 . 近期,由于公司业务需求中有价格输入功能,给出的要求说是,必须整数能输入几位,小数能输入几位...好嘛,产品一句话 ...
- 【SpringMVC】使用Myeclipse创建SpringMVC项目【超详细教程】
之前一直是使用Eclipse创建Web项目,用IDEA和MyEclipse的创建SpringMVC项目的时候时不时会遇到一些问题,这里把这个过程记录一下,希望能帮助到那些有需要的朋友.我是用的是MyE ...
- Unity3D获取资源的方法整理:
在使用Unity3D做项目时,获取资源的方法大致分为两种.一种是通过写代码的方式,在程序运行时,自动获取资源:一种是通过手动拖拽的方式进行获取.不管是什么类型的资源都能通过这两种方式获得,下面拿图片资 ...
- TFboy养成记 多层感知器 MLP
内容总结与莫烦的视频. 这里多层感知器代码写的是一个简单的三层神经网络,输入层,隐藏层,输出层.代码的目的是你和一个二次曲线.同时,为了保证数据的自然,添加了mean为0,steddv为0.05的噪声 ...
- python学习笔记 tuple
1. ()去声明.与list类似,但是其元素不能改变. 2. 需要注意的是1中的不能改变是指()中的元素不能改变,如果其元素是一个list,那么list中的元素是可以改变的,不论是大小还是其他的. 3 ...
- JAVA基础2——类初始化相关执行顺序
类初始化相关执行顺序 几个概念说明 代码块的含义与作用 static静态代码块: 一般用于初始化类中的静态变量.比如:给静态的数组或者list变量赋初值.使用static静态代码块进行初始化与直接在定 ...