性能优化

排行榜,邮件,关卡等数据列表项,一般在玩家打开面板时,都会重新刷新一次数据,那是否有必要每次都生成列表项呢?

假如每次列表的内容有变动就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 性能优化的更多相关文章

  1. 01.SQLServer性能优化之----强大的文件组----分盘存储

    汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 文章内容皆自己的理解,如有不足之处欢迎指正~谢谢 前天有学弟问逆天:“逆天,有没有一种方 ...

  2. 03.SQLServer性能优化之---存储优化系列

    汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 概  述:http://www.cnblogs.com/dunitian/p/60413 ...

  3. Web性能优化:What? Why? How?

    为什么要提升web性能? Web性能黄金准则:只有10%~20%的最终用户响应时间花在了下载html文档上,其余的80%~90%时间花在了下载页面组件上. web性能对于用户体验有及其重要的影响,根据 ...

  4. Web性能优化:图片优化

    程序员都是懒孩子,想直接看自动优化的点:传送门 我自己的Blog:http://cabbit.me/web-image-optimization/ HTTP Archieve有个统计,图片内容已经占到 ...

  5. C#中那些[举手之劳]的性能优化

    隔了很久没写东西了,主要是最近比较忙,更主要的是最近比较懒...... 其实这篇很早就想写了 工作和生活中经常可以看到一些程序猿,写代码的时候只关注代码的逻辑性,而不考虑运行效率 其实这对大多数程序猿 ...

  6. JavaScript性能优化

    如今主流浏览器都在比拼JavaScript引擎的执行速度,但最终都会达到一个理论极限,即无限接近编译后程序执行速度. 这种情况下决定程序速度的另一个重要因素就是代码本身. 在这里我们会分门别类的介绍J ...

  7. 02.SQLServer性能优化之---牛逼的OSQL----大数据导入

    汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 上一篇:01.SQLServer性能优化之----强大的文件组----分盘存储 http ...

  8. C++ 应用程序性能优化

    C++ 应用程序性能优化 eryar@163.com 1. Introduction 对于几何造型内核OpenCASCADE,由于会涉及到大量的数值算法,如矩阵相关计算,微积分,Newton迭代法解方 ...

  9. Android性能优化之利用LeakCanary检测内存泄漏及解决办法

    前言: 最近公司C轮融资成功了,移动团队准备扩大一下,需要招聘Android开发工程师,陆陆续续面试了几位Android应聘者,面试过程中聊到性能优化中如何避免内存泄漏问题时,很少有人全面的回答上来. ...

随机推荐

  1. asp.net正则模板引擎代码

    我们申明一个数组 ]; 接下来关键的正则表达式: RegexOptions options = RegexOptions.None; //嵌套模板标签(兼容) r[] = new Regex(@&qu ...

  2. 移动Web开发的bug及解决方案

    我目前移动Web开发遇到的bug以及解决方案(慢慢补充当中). 1.android4.0以上一部分手机的webview中,当canvas小于屏幕大小时,绘图时会出现重影,就是说一个图只绘制了一遍,却出 ...

  3. javascript --- 原型初探七日谈(三)

    原型陷阱: 在处理原型问题上时,我们要注意两种行为. 1. 当我们对原型对象执行完全替换的时候,有可能会触发原型链的某种异常. 2. prototype.constructor 属性是不可靠的. 下面 ...

  4. CSS学习总结(三)

    一.属性选择符 如下表所示: 例子如下: <head> <meta charset="utf-8"> <style type="text/c ...

  5. Java继承中的转型及其内存分配

    看书的时候被一段代码能凌乱啦,代码是这样的: package 继承; abstract class People { public String tag = "疯狂Java讲义"; ...

  6. ios 怎么解决Could not find Developer Disk Image

  7. cocoapods pod setup

    在终端  输入 pod setup  之后 你会发现 一直没有反应    会出现这种情况   如下图   你要耐心等一下. 直到看到Setup completed    就算是成功了.(你的网络要好) ...

  8. 常见HTTP状态码

    常见HTTP状态码 200 OK 301 Moved Permanently 302 Found 304 Not Modified 307 Temporary Redirect 400 Bad Req ...

  9. 示例详解:UIScrollview 与 Autolayout 的那点事

    前言 自从写了介绍Masonry那篇文章以后 就一直有人对UIScrollView的那个例子不是很理解 UIView *container = [UIView new]; [scrollView ad ...

  10. PHP延迟静态绑定 static关键字

    示例代码1 abstract class Parent { } class Man extends Parent { public static function create(){ return n ...