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应聘者,面试过程中聊到性能优化中如何避免内存泄漏问题时,很少有人全面的回答上来. ...
随机推荐
- asp.net正则模板引擎代码
我们申明一个数组 ]; 接下来关键的正则表达式: RegexOptions options = RegexOptions.None; //嵌套模板标签(兼容) r[] = new Regex(@&qu ...
- 移动Web开发的bug及解决方案
我目前移动Web开发遇到的bug以及解决方案(慢慢补充当中). 1.android4.0以上一部分手机的webview中,当canvas小于屏幕大小时,绘图时会出现重影,就是说一个图只绘制了一遍,却出 ...
- javascript --- 原型初探七日谈(三)
原型陷阱: 在处理原型问题上时,我们要注意两种行为. 1. 当我们对原型对象执行完全替换的时候,有可能会触发原型链的某种异常. 2. prototype.constructor 属性是不可靠的. 下面 ...
- CSS学习总结(三)
一.属性选择符 如下表所示: 例子如下: <head> <meta charset="utf-8"> <style type="text/c ...
- Java继承中的转型及其内存分配
看书的时候被一段代码能凌乱啦,代码是这样的: package 继承; abstract class People { public String tag = "疯狂Java讲义"; ...
- ios 怎么解决Could not find Developer Disk Image
- cocoapods pod setup
在终端 输入 pod setup 之后 你会发现 一直没有反应 会出现这种情况 如下图 你要耐心等一下. 直到看到Setup completed 就算是成功了.(你的网络要好) ...
- 常见HTTP状态码
常见HTTP状态码 200 OK 301 Moved Permanently 302 Found 304 Not Modified 307 Temporary Redirect 400 Bad Req ...
- 示例详解:UIScrollview 与 Autolayout 的那点事
前言 自从写了介绍Masonry那篇文章以后 就一直有人对UIScrollView的那个例子不是很理解 UIView *container = [UIView new]; [scrollView ad ...
- PHP延迟静态绑定 static关键字
示例代码1 abstract class Parent { } class Man extends Parent { public static function create(){ return n ...