UIGrid/UITable 性能优化
性能优化
排行榜,邮件,关卡等数据列表项,一般在玩家打开面板时,都会重新刷新一次数据,那是否有必要每次都生成列表项呢?
假如每次列表的内容有变动就Instance 新的Gameobject,这是没有必要的浪费。本文想做的就是避免频繁生成新的Gameobject。
运行效果
思路及流程图
循环利用UIGrid下已有child,改变child的数据(不同child渲染不同的数据)。需要生成时就生成,不需要生成则根据情况显示隐藏
流程图如下所示
实现方法
1、创建工具类:动态生成child ,隐藏多余的child
2、工具类使用方法:
传入template obj(prefab)、data ,ResizeGrid
设置每一个Child的内容
XUIHelper
public class XUIHelper
{
/// <summary>
/// 传入指定数量, 对UIGrid里指定数量项SetActive(true)/或创建, 其余的SetActive(false)
/// 常用于UIGrid下的对象动态增长
/// </summary>
public static void ResizeUIGridGameObjects(UIGrid uiGrid, int resizeCount, GameObject templateForNew = null)
{
if (templateForNew == null && uiGrid.transform.childCount <= 0)
{
CDebug.LogError("template为空 && uigrid childCount为0");
return;
}
if (templateForNew == null) templateForNew = uiGrid.transform.GetChild(0).gameObject;
_ResizeUIWidgetContainerGameObjects(uiGrid.transform, resizeCount, templateForNew);
uiGrid.Reposition();
} public static void ResizeUITableGameObjects(UITable uiTable, int resizeCount, GameObject templateForNew = null)
{
if (templateForNew == null && uiTable.transform.childCount <= 0)
{
CDebug.LogError("template为空 && uigrid childCount为0");
return;
}
if (templateForNew == null) templateForNew = uiTable.transform.GetChild(0).gameObject;
_ResizeUIWidgetContainerGameObjects(uiTable.transform, resizeCount, templateForNew);
uiTable.Reposition();
} public static void _ResizeUIWidgetContainerGameObjects(Transform transf, int resizeCount, GameObject templateForNew)
{
if (templateForNew == null)
templateForNew = default(GameObject); for (int i = 0; i < resizeCount; i++)
{
GameObject newTemplate = null;
if (i >= transf.childCount) //child不足 instantiate
{
newTemplate = Object.Instantiate(templateForNew) as GameObject;
newTemplate.transform.parent = transf;
ResetLocalTransform(newTemplate.transform);
}
newTemplate = transf.GetChild(i).gameObject;
if (!newTemplate.activeSelf)
newTemplate.SetActive(true);
} //多余的child setActive(false)
for (int i = resizeCount; i < transf.childCount; ++i)
{
GameObject newTemplate = transf.GetChild(i).gameObject;
if (newTemplate.activeSelf)
newTemplate.SetActive(false);
}
} /// <summary>
/// 模仿 NGUISelectionTool的同名方法,将位置旋转缩放清零
/// </summary>
/// <param name="t"></param>
public static void ResetLocalTransform(Transform t)
{
t.localPosition = Vector3.zero;
t.localRotation = Quaternion.identity;
t.localScale = Vector3.one;
}
}
使用方法
public class XUILevel :CUIController
{
private UIGrid LevelGrid;
private List<CLevelInfo> LevelList;
private GameObject LevelTemplate; public void RefreshUI()
{
//刷新Grid
XUIHelper.ResizeUIGridGameObjects(LevelGrid, LevelList.Count, LevelTemplate); var idx = 0;
foreach (var levelInfo in LevelList)
{
var child = LevelGrid.transform.GetChild(idx);
child.name = "Level-"+levelInfo.Id;
GetControl<UILabel>("Label", child).text = levelInfo.Name;
child.GetComponent<UIEventListener>().onClick = OnClickLevel; //...... 其它的操作
idx++;
}
LevelGrid.GetComponent<UIGrid>().enabled = true;
LevelGrid.Reposition();
} void OnClickLevel(GameObject obj)
{ }
}
UIGrid/UITable 性能优化的更多相关文章
- 01.SQLServer性能优化之----强大的文件组----分盘存储
汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 文章内容皆自己的理解,如有不足之处欢迎指正~谢谢 前天有学弟问逆天:“逆天,有没有一种方 ...
- 03.SQLServer性能优化之---存储优化系列
汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 概 述:http://www.cnblogs.com/dunitian/p/60413 ...
- Web性能优化:What? Why? How?
为什么要提升web性能? Web性能黄金准则:只有10%~20%的最终用户响应时间花在了下载html文档上,其余的80%~90%时间花在了下载页面组件上. web性能对于用户体验有及其重要的影响,根据 ...
- Web性能优化:图片优化
程序员都是懒孩子,想直接看自动优化的点:传送门 我自己的Blog:http://cabbit.me/web-image-optimization/ HTTP Archieve有个统计,图片内容已经占到 ...
- C#中那些[举手之劳]的性能优化
隔了很久没写东西了,主要是最近比较忙,更主要的是最近比较懒...... 其实这篇很早就想写了 工作和生活中经常可以看到一些程序猿,写代码的时候只关注代码的逻辑性,而不考虑运行效率 其实这对大多数程序猿 ...
- JavaScript性能优化
如今主流浏览器都在比拼JavaScript引擎的执行速度,但最终都会达到一个理论极限,即无限接近编译后程序执行速度. 这种情况下决定程序速度的另一个重要因素就是代码本身. 在这里我们会分门别类的介绍J ...
- 02.SQLServer性能优化之---牛逼的OSQL----大数据导入
汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 上一篇:01.SQLServer性能优化之----强大的文件组----分盘存储 http ...
- C++ 应用程序性能优化
C++ 应用程序性能优化 eryar@163.com 1. Introduction 对于几何造型内核OpenCASCADE,由于会涉及到大量的数值算法,如矩阵相关计算,微积分,Newton迭代法解方 ...
- Android性能优化之利用LeakCanary检测内存泄漏及解决办法
前言: 最近公司C轮融资成功了,移动团队准备扩大一下,需要招聘Android开发工程师,陆陆续续面试了几位Android应聘者,面试过程中聊到性能优化中如何避免内存泄漏问题时,很少有人全面的回答上来. ...
随机推荐
- JavaScript 开发者经常忽略或误用的七个基础知识点(转)
JavaScript 本身可以算是一门简单的语言,但我们也不断用智慧和灵活的模式来改进它.昨天我们将这些模式应用到了 JavaScript 框架中,今天这些框架又驱动了我们的 Web 应用程序.很多新 ...
- sharepoint2013的最少下载策略概述(MDS)
该策略是 SharePoint 2013 中的一种新功能,通过在用户导航到新页面时仅发送差异内容来减少页面加载时间. 最少下载策略 (MDS) 是 SharePoint 2013 中的一种新技术,可减 ...
- Snort - manual 笔记(五)
1.9 Miscellaneous 1.9.1 Running Snort as a Daemon 如果你想让Snort作为守护程序运行,你可以在最后加上 -D 选项.清注意如果你想通过发送一个 SI ...
- CentOS5.5挂载本地ISO镜像
操作步骤: 一.挂载iso文件到挂载点 [root@server ~ ]# mount -o loop /mnt/iso/CentOS5.iso /mnt/cdrom 二.查看挂载状态 [root@ ...
- 限制EditText 输入的字节数
1.代码 name_tv = (EditText) findViewById( R.id.name_tv ); name_tv.addTextChangedListener(new TextWatch ...
- CLLocationManagerDelegate不调用didUpdateLocations (地图)
这是因为xcode升级造成的定位权限设置问题.升级xcode6以后打开以前xcode5工程,程序不能定位.工程升级到xcode6编译时需要iOS8 要自己写授权,不然没权限定位.解决方法:首先在 in ...
- Android 加载大图片到内存
本文演示android中图片加载到内存 首先设计界面: 代码如下: <LinearLayout xmlns:android="http://schemas.android.com/ap ...
- DragLayout: QQ5.0侧拉菜单的新特效
一.项目概要 1.1 项目效果如图: 1.2 需要使用到的技术 ViewDragHelper: 要实现和QQ5.0侧滑的特效,需要借助谷歌在2013年I/O大会上发布的ViewDragHelper ...
- 多线程(pthread、NSThread、GCD)
pthread C语言编写 跨平台可移植 线程生命周期需要我们来管理 使用困难 NSThread 面向对象的 可直接操作线程对象 线程生命周期需要我们来管理 使用简单 资源互斥(@synchroniz ...
- 统计整个Xcode工程代码行数
打开终端,ls 查看目录,用cd命令 定位到工程所在的目录,然后调用以下命名即可把每个源代码文件行数及总数统计出来: find . "(" -name "*.m" ...