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索性就把达到这 ...
随机推荐
- 最近ssh遇到异常及解决
1.SSH框架,spring和struts整合,action中注入service不成功,检测是否缺少 struts2-spring-plugin-2.3.4.1.jar包 2.字符串转 json 加了 ...
- 《天书夜读:从汇编语言到windows内核编程》六 驱动、设备、与请求
1)跳入到基础篇的内核编程第7章,驱动入口函数DriverEnter的返回值决定驱动程序是否加载成功,当打算反汇编阅读驱动内核程序时,可寻找该位置. 2)DRIVER_OBJECT下的派遣函数(分发函 ...
- Linux端图形处理工具ImageMagick在Centos上的安装
一.安装背景程序要用到用户上传图片,编辑的功能,能进行旋转,裁剪,缩放等. 二.ImageMagick介绍 ImageMagick是用C语言开发图片处理程序.可以对图片进行改变大小.旋转.锐化.减色或 ...
- 使用XML设计某大学主页站点地图--ASP.NET
一.使用XML设计某大学主页站点地图步骤如下 1.创建一个空网站,在项目文件上右击,然后[添加新项],选择[站点地图],新建一个可默认为Web.sitemap的文件. 2.在Web.sitemap里修 ...
- 使用flex
Flex如何处理二义性模式: 1.词法分析器匹配输入时匹配尽可能多的字符串 2.如果两个模式都可以匹配的话,匹配在程序中更早出现的模式 上下文相关的记号 flex提供起始状态(start state) ...
- Struts2-045验证脚本
#! /usr/bin/env python # encoding:utf-8 import urllib2 import sys from poster.encode import multipar ...
- python利用for..in遍历,while循环嵌套编译九九乘法表的几种模式
运用for....in...遍历的四种方向的九九乘法表: 左下角: import sysfor i in range(1,10): for j in range(1,i+1): sys.stdout. ...
- RAC(ReactiveCocoa)使用方法(二)
RAC(ReactiveCocoa)使用方法(一) RAC(ReactiveCocoa)使用方法(二) 上篇文章:RAC(ReactiveCocoa)使用方法(一) 中主要介绍了一些RAC中常见类的用 ...
- 大道至简第一章Java伪代码读后感
import.java.大道至简.*; //周爱民 import.java.读后感*; public class shawanyia { //1. 编程的精义 while(山没有消失) {if(愚公没 ...
- JavaSE之绘制菱形
在JavaSE的算法练习中,绘制菱形是一个比较常见的案例.菱形效果如下图所示: 我们在解决算法问题时,通常情况下,先不要急于马上编码,而是要先观察,找出解决问题的关键所在. 在上图中,我们可以看到,菱 ...