查看: 7337|回复: 1
打印 上一主题 下一主题

[其他] NGUI中的scrollview使用心得(转载)

[复制链接]

2317

主题

54

听众

2万

积分

资深设计师

Rank: 7Rank: 7Rank: 7

纳金币
20645
精华
62

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

跳转到指定楼层
楼主
发表于 2014-10-18 03:19:43 |只看该作者 |倒序浏览
在使用NGUI的Scroll View的时候,碰到Scroll Item太多的话(超过100个),在滑动的过程中就会明显掉帧。究其原因就是NGUI每帧会对所有的Scroll Item进行更新,无论它是否显示。

NGUI 3.5.5加入了UIWrapContent,它会将不显示的Scroll Item设为disabled,这样就使得每帧更新的Scroll Item减少到当前显示的那几个,就再也不会出现掉帧的情况了。


不过UIWrapContent只能创建循环的Scroll View,不过只需要简单的几处修改,就能实现在普通的Scroll View上。


  • 复制一份UIWrapContent.cs,重命名为UIBetterGrid.cs,修改类名

    // line: 19 - 20, file: UIWrapContent.cs[AddComponentMenu("NGUI/Interaction/Wrap Content")]public class UIWrapContent : MonoBehaviour

    修改后的代码如下:

    // line: 19 - 20, file: UIBetterGrid.cs[AddComponentMenu("NGUI/Interaction/Better Grid")]public class UIBetterGrid : MonoBehaviour

  • 修改初始化代码

    // line: 52 - 54, file: UIWrapContent.csmScroll.restrictWithinPanel = false;if (mScroll.dragEffect == UIScrollView.DragEffect.MomentumAndSpring)mScroll.dragEffect = UIScrollView.DragEffect.Momentum;

    修改后的代码如下:

    // line: 52 - 54, file: UIBetterGrid.csmScroll.restrictWithinPanel = true;//if (mScroll.dragEffect == UIScrollView.DragEffect.MomentumAndSpring)//mScroll.dragEffect = UIScrollView.DragEffect.Momentum;

  • 注释创建首尾循环的代码

    // line 159 - 170, file: UIBetterGrid.cs //if (distance < -extents)//{//        t.localPosition += new Vector3(extents * 2f, 0f, 0f);//        distance = t.localPosition.x - center.x;//        UpdateItem(t, i);//}//else if (distance > extents)//{//        t.localPosition -= new Vector3(extents * 2f, 0f, 0f);//        distance = t.localPosition.x - center.x;//        UpdateItem(t, i);//}        // line 190 - 201, file: UIBetterGrid.cs//if (distance < -extents)//{//        t.localPosition += new Vector3(0f, extents * 2f, 0f);//        distance = t.localPosition.y - center.y;//        UpdateItem(t, i);//}//else if (distance > extents)//{//        t.localPosition -= new Vector3(0f, extents * 2f, 0f);//        distance = t.localPosition.y - center.y;//        UpdateItem(t, i);//}

  • 修改UIScrollView.cs

    // line 173, file: UIWrapContent.csmBounds = NGUIMath.CalculateRelativeWidgetBounds(mTrans, mTrans);  

    修改后的代码如下:

    // line 173, file: UIBetterGrid.cs                mBounds = NGUIMath.CalculateRelativeWidgetBounds(mTrans, mTrans,true);  


最后,使用NGUI自带的例子Example 7 - Scroll View (Panel).unity测试下性能吧。把例子中的UIGrid替换为UIBetterGrid,试试复制成百上千个scroll item,跑起来一点也不会卡。


分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏1 支持支持0 反对反对0
回复

使用道具 举报

hyui    

1

主题

2

听众

6671

积分

高级设计师

Rank: 6Rank: 6

纳金币
2715
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

沙发
发表于 2014-10-18 03:53:36 |只看该作者
thakns for this news !
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2025-7-19 04:28 , Processed in 0.062629 second(s), 31 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部