NGUI开发优化技巧(上)

【Unity】 NGUI学习笔记(二)NGUI基础功能 Unity NGUI学习笔记(二)NGUI基础功能 NGUI的根节点为UI Root。所有的物体想要显示在界面上都必须挂在具有UI Panel组件的物体下。 UI Panel具有深度属性,深度决定了物体显示的层级,类似于z-index。 NGUI没有节点的概念,创建的物体直接就是Sprite、Label之类的。 NGUI主相机可以理解为没有Z轴,所以Clear Flags设置为Depth only(仅影响深度)。UI的深度值永远大于其他物体。 把UI Root及其子物体的Layer设置为UI层,再把UI相 阅读详情

UGUI和NGUI的区别:

使用率:NGUI占大多数,NGUI和UGUI的使用占比为81% : 19%;

易用性:NGUI占一定优势,UGUI仍在慢慢改善;

性能:如果都合理搭配,UGUI在性能上还是有一点优势的,在Unity5.2、5.3之后UGUI有一部分网格合并的操作是放在多线程中进行,相对来讲,性能有一定的提升;

但NGUI的优化相对更简单一些,主要是因为NGUI的Drawcall相对容易估计,可以知道Drawcall从哪里来的,也更容易定位网格的刷新是由什么元素引起的, 但UGUI的Drawcall难以估计,且网格重建的开销因为引入了多线程,也会被隐藏起来,所以优化起来,UGUI的难度相对更高一些;

 

屏幕自适应

1:UIRoot/Scaling Style

   — Flexible(PixelPerfect)

   — Constrained(FixedSize)


可以让用户指定一个区间,当真实屏幕的像素高度介于最大、最小高度之间,那么UI元素将保持原有的分辨率,也就是说,在这个范围之间,UI元素的像素和设备的像素是可以匹配的;在分辨率高的设配上UI会相对小一些,在分辨率低的设备上这些UI图片会相对大一些;这种模式较为复杂,使用不多;


不同的设备上看到的画面只是等比的缩放,布局更加容易,使用较多;


2:UIAnchor 在旧的NGUI版本上就存在,但现在使用较少,因为使用后,UI的层次会非常多;

3:UIRect/AnchorPoint:在较新的NGUI中,Anchor放在了UIRect这个类中;


Execute的模式会影响性能,对于静态的UI,不要使用On Update模式;

如果设置为On Update,则会在Profiler中看到UIRect.Update会比较高;

 

事件处理

1:UIButton

2:UIEventListener

NGUI和UGUI相差很大,UGUI中的事件处理没有使用到物理中的Physics.Raycast,而是通过

射线跟四边形去做一些检查,而NGUI会使用物理系统Physics或Physics2D;

在Unity4.X上UGUI事件检测的开销有时候可能会有比较高的持续开销,因为在Unity4.X中默认所有Graphics的元素(包含Image和Texture)都会作为事件检查的目标,除非把Camera给禁用掉,在Unity5.2中才出现对每一个Graphics可以设置RaycastTarget这个属性,去掉这个属性之后,可以不参与检测;

在NGUI中就不会出现这个问题,因为NGUI只会在需要检测的地方(Button、Toggle)挂上碰撞体,所以只有在挂了碰撞体的元素才会参与事件的检测;

 

可以借助UIEventListener组件,在按钮或UI元素上挂上这个组件,然后在一个统一的地方去检查,去处理所有Button;

如下代码所示:

using UnityEngine;
using System.Collections;

public class UIEventManager : MonoBehaviour {

    private UIButton[] buttons;

	// Use this for initialization
	void Start () {
	    buttons = GetComponentsInChildren<UIButton>();

        foreach (var button in buttons)
        {
            UIEventListener.Get(button.gameObject).onClick += OnButtonClick;
        }
	}
	
	// Update is called once per frame
	void Update () {
	
	}

    void OnButtonClick(GameObject go)
    {
        Debug.Log(go.name);
    }
}

自定义材质

1:Gray

2:ETC Split



比如:做一个会变灰的按钮,自定义的Shader放到UI元素上可以正常显示,但是把它放到ScrollView里面的滚动区域时,材质丢失或完全变黑,这是因为NGUI在处理滚动框里面的内容时,为了实现遮罩效果,会去动态替换里面元素的Shader;

 

把Texturefen采用ETC1分离为RGB和A图片后,替换原有的Shader,当放入ScrollView的裁剪区域后,图片变黑,想要恢复原状,需要把原有的Shader替换成NGUI可以识别的Shader;

比如:把Shader “UI/UI_ETC”替换为:Shader “Hidden/UI/UI_ETC 1”(只用替换Shader名字,1代表被1个Panel做了clipping,以此类推)



当我们需要提供一个自定义的材质时,需要附带3个配套的版本,以保证UI元素放到滚动区域后依然能够正常显示;

 

ParticleSystem交互

1:前后遮挡

2:ScrollView裁剪

 

如何把一个ParticleSystem放在两个UI元素之间?

通过脚本把ParticleSystem的Renderer的RenderQueue控制在两个UI元素之间;

 

当ParticleSystem放到了滚动区域之后(比如背包),有一些图标需要高亮或者特殊效果,当滚动背包时,希望背包区域把这些粒子裁减掉,但默认情况下,并不会被裁剪,因为粒子系统的Shader是另一种渲染方式,跟NGUI的不一样,NGUI不仅自身有一种UI的Shader,而且还需要去替换做clip裁剪的Shader版本;

一般可以考虑的会有以下几种方式:

1:转成序列帧,做成UI的方式去做,但是表现力会大打折扣,并且图片量会有所提升;

2:设计自定义的ParticleSystem的Shader,并且NGUI中裁剪的机制放到自定义的Shader中去,相对复杂一些,毕竟ParticleSystem的坐标系和产生的Mesh时候的坐标系的对应不一样;

3:通过额外的Camera去做,就是说Particle的裁剪是通过Camera的显示区域去做,这种限制比较大,多加的Camera使UI层级的管理会比较复杂,所以还是使用第二种方式;



代码如下:

using UnityEngine;
using System.Collections;

[ExecuteInEditMode]
[RequireComponent(typeof(ParticleSystemRenderer))]
public class UIParticle : MonoBehaviour {

    private UIPanel panel;
    private ParticleSystemRenderer pRenderer;
    private Material dyMaterial;
    private UIWidget cover;

	// Use this for initialization
	void Start () {
	    panel = GetComponentInParent<UIPanel>();
        pRenderer = GetComponent<ParticleSystemRenderer>();

       // dyMaterial = new Material(Shader.Find("Hidden/Unlit/Transparent Colored 1"))
        dyMaterial = new Material(Shader.Find("Unlit/Transparent Colored"))
        {
            renderQueue = 4000,
            mainTexture = pRenderer.sharedMaterial.mainTexture
        };
        pRenderer.material = dyMaterial;
	}
	
	// Update is called once per frame
	void OnWillRenderObject () {
        if (cover!=null && cover.isActiveAndEnabled && cover.drawCall!=null)
        {
            dyMaterial.renderQueue = cover.drawCall.renderQueue;
        }

        Vector4 cr = panel.drawCallClipRange;
        Vector2 soft = panel.clipSoftness;

	    Vector2 sharpness = new Vector2(1000.0f, 1000.0f);
		if (soft.x > 0f) sharpness.x = cr.z / soft.x;
		if (soft.y > 0f) sharpness.y = cr.w / soft.y;

        float scale = 1.0f / transform.lossyScale.x;
        Vector3 position = -panel.transform.position * scale;

		dyMaterial.SetVector(Shader.PropertyToID("_ClipRange0"), 
            new Vector4(-cr.x/cr.z + position.x/cr.z, -cr.y/cr.w + position.y/cr.w, 1f/cr.z*scale, 1f/cr.w*scale));
        dyMaterial.SetVector(Shader.PropertyToID("_ClipArgs0"), new Vector4(sharpness.x, sharpness.y, 0, 1));
	}

    void OnDestroy()
    {
        DestroyImmediate(dyMaterial);
        dyMaterial = null;
    }
}

UIDrawCall:管理UI的显示,任何材质的替换都是在这个类里面做的,包括在裁剪前替换材质,并把裁剪区域做一个限定,也都是在这个脚本里面进行的;

 

DrawCall优化:

1:Panel Tool

2:Draw Call Tool



优化时,可以看到每个Panel产生了多少个Drawcall;

如果Drawcall使用UISprite,材质一样,并且相邻,则会自动合并成一个Drawcall,如果没有合并,说明使用了UITexture,因为每个UITexture都会产生一个Drawcall;

 

多个Drawcall合成一个时,并不会增大内存,因为多个UI元素,每个UI元素都对应一个Mesh,对应的Mesh顶点固定,如果不合并Drawcall,则他们的Mesh是分开的,合并后Mesh是合并的,但定点数和顶点属性是固定的;

 


NGUI开发优化技巧 屏幕自适应  参考链接 屏幕适配参考 &amp; Scaling Style(UIRoot上)     主要用Constrained设置(content width和content height)进行整体布局------Constrained On Mobiles(NGUI做好了不同的适配)     或者如果是选取了Flexiable且横屏状态下,就需要动态改变适配的高度(一般是PC端) ... 阅读详情

相关推荐

Unity NGUI完整GUI开发实战指南

在Unity引擎的UI开发历程中,原生的虽然实现了基本的界面绘制功能,但其缺乏可视化编辑、性能低下以及难以维护等问题逐渐暴露,尤其在中大型项目中显得捉襟见肘。为了解决这些问题,开发者社区逐步转向使用第三方UI插件,而正是其中的佼佼者。NGUI由Tasharen Entertainment开发,凭借其出色的性能表现、模块化架构以及强大的可视化编辑能力,迅速在Unity社区中获得广泛认可。其核心价值主要体现在以下几个方面:性能优化。

weixin_35370061的博客 1482

NGUI

(一)NGUI NGUI概述:NGUI是严格遵循KISS原则并用C#编写的Unity(适用于专业版和免费版)插件, 全面支持iOS/Android和Flash。相比UGUI(Unity自带的UI系统),有着更高的性能和更低的学习难度。 在进入学习之前,首先下载NGUI插件,解压缩并导入到Untiy中:NUGI插件下载链接 NGUI插件包 导入NGUI插件包 导入NGUI插件包之后...

qq_36998053的博客 2552

dotnet-NGUI与tolua的高效轻量级游戏框架构建指南

为了丰富游戏框架的结构,开发者需要添加自定义组件。自定义组件可以通过继承NGUI或Unity自带的组件类,并添加特定功能来实现。以下是添加自定义组件的步骤:创建自定义组件类:在Unity编辑器中,右键点击Project面板中的Assets文件夹,选择Create -> C# Script,命名为”MyCustomNGUIComponent”。编写自定义逻辑:打开”MyCustomNGUIComponent”脚本,并编写需要的功能逻辑。

weixin_42596214的博客 1021

unity NGUI使用方法

很多基本模块比如按钮、slider等都能从Prefab中直接拖拽到场景中实现,但都需要有一个Collider(Prefab已经自带)因为不仅是UI,所有带有Collider的游戏物体都能接收到OnClick, OnPress这样的事件——前提是需要在Main Camera里面添加上event System组件,然后自定义脚本添加以下函数:如果不想写代码,也可以直接拖拽UIEventTrugger脚本来实现相关功能。

jkkk_的博客 2682

微信小程序如何集成EasyRTC实现零插件音视频通话?5步搞定完整接入流程

本文详细介绍了如何在微信小程序中集成EasyRTC SDK,实现零插件的实时音视频通话功能。通过5个关键步骤,包括环境配置、SDK初始化、核心功能实现、性能优化和问题排查,帮助开发者快速完成WebRTC技术在小程序中的落地应用,解决微信小程序原生不支持实时音视频通信的技术难题。

weixin_28340315的博客 144

别再手动改文献了!手把手教你定制Mendeley的GB/T 7714-2005引用格式(附常见问题修复)

本文详细指导如何定制Mendeley的GB/T 7714-2005引用格式,解决科研文献管理中的常见问题。通过深度解析Mendeley样式编辑器,精准控制作者显示规则、出版社信息精简及期刊页码处理,实现参考文献一键合规。附常见问题修复和实战调试方法,大幅提升学术写作效率。

weixin_26833503的博客 375

unity中NGUI与UGUI的区别?

什么是UI? UI即User Interface(用户界面)的简称。泛指用户的操作界面,UI设计主要指界面的样式,美观程度。而使用上,对软件的人机交互、操作逻辑、界面美观的整体设计则是同样重要的另一个门道。好的UI不仅是让软件变得有个性有品味,还要让软件的操作变得舒适、简单、自由,充分体现软件的定位和特点。 NGUI与UGUI详细对比 UGUI是官方4.6以后推出的一套UI组件,相对于之前的GUI倒是改头换面了,可视化操作,便捷、省心。NGUI则是unity一直以来最强的UI插件(没有之一),甚至还是官方新

panghuyou的博客 7319

KEPServer EX6的Modbus、MQTT和REST Server一站式配置整理说明

KEPServer EX6的Modbus、MQTT和REST Server一站式配置整理说明

syqenter的专栏 8963

[Unity3D]事半功倍:界面插件NGUI的使用教程与实例

原文地址:http://www.tasharen.com/?page_id=185 注明:该教程使用的NGUI是2.7.0,参考示例路径:Assert\NGUI\Examples\Scenes NGUI教程:步骤1-Scene 1.创建一个新的场景(New Scene)。2.选择并删除场景里的MainCamera。3.在NGUI菜单下选择Create a New UI,会打开...

all36426的博客 556

【调试记录】GT ip跑aurora 64b66b协议

如果不用,会出现这种情况:自回环测试,数据收发ok.一旦和对方通信,对方接收的就是一堆乱码,因为GT链路发送数据不能是全1或全0,或者长时间的1或0.否则线路容易受到干扰,毕竟线速率10多G,用了加扰和解扰,就可以提高抗干扰能力。64B66B编码,数据输入是64bit,输出是66bit,所以这之间存在着2bit的带宽差,Gearbox 就是用来解决这种差异的,实现方式是:将66bit数据拿出来2bit先存入Gearbox,然后输出64bit.发送同步码或控制数据时,配置成2.2.4 加扰和解扰!

weixin_41246509的博客 1605

Vue3集成百度实时语音识别

Vue3集成百度实时语音识别

weixin_61769998的博客 548

NGUI开发优化技巧(下)

NGUI更新开销:NGUI进行自身的数据更新以及生成网格的过程中所产生的开销,目前UI部分的CPU耗时大部分都是这部分的开销; NGUI的更新开销几乎全部来源于UIPanel.LateUpdate中;一般超过3~4ms,说明这部分更新开销较高; UI更新的数量和频率通过合理的布局,可以把这部分的开销限制在很多小的范围里面; 在关卡的切换或点击一些UI界面时,可以出现一些较高的峰值; 但

起个名字好难啊 2816

系统建模语言 (SysML)

系统建模语言

追赶时代的博客 751

Unity程序员如何理解NGUI开发流程与底层实现:原理与商业项目实战

《Unity程序员深入理解NGUI开发流程与底层实现》 本文系统解析了NGUI的核心架构与实现原理,为Unity开发者提供技术参考。文章首先指出NGUI在商业项目中的持续价值,特别针对300+款老游戏维护需求。核心内容分为两大部分: NGUI架构解析: 四层架构设计(渲染/布局/交互/动画) 与UGUI的关键差异(Transform坐标系统、组件化渲染、碰撞器事件) UIWidget基类实现机制 深度技术实现: 渲染管道流程分析 UIWidget类详细源码解读 UISprite等控件的具体实现方式 本文特别

小宝哥Code的专栏 1067

第5.2章 【自动驾驶行业融合定位核心】:手把手详解ESKF(误差卡尔曼滤波)理论公式及代码

自动驾驶定位中的ESKF(误差卡尔曼滤波)技术是解决IMU累积误差的关键,通过分离名义状态与误差状态实现高精度定位。其核心步骤包括:1)名义状态递推(位置/速度/姿态的基础物理计算);2)误差传播建模(雅可比矩阵F量化误差影响);3)协方差更新(评估定位不确定性)。ESKF在GNSS信号丢失(如隧道场景)、无卫星定位(地下车库)等场景发挥重要作用,通过融合多传感器数据维持定位精度。工程实现需解决零偏校准、协方差投影等关键问题,噪声参数需通过数据标定而非随意设置。掌握ESKF原理与实现是自动驾驶定位工程师的核

行知SLAM 707

华为OD机考双机位C卷 - 风险投资计划(Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 风险投资计划(OD上机考试双机位C卷)。提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。

算法大师! 548

NGUI UIButton组件

UIButton是NGUI中用于创建按钮的组件,它可以响应用户的点击、触摸或键盘输入,并触发相应的事件。UIButton适用于游戏中的菜单、对话、技能激活等交互场景。

Unity打怪升级 977

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

NGUI List优化

腾讯是如何做 Unity 手游性能优化的 https://juejin.im/entry/5774af485bbb50005925a3b1 Unity - NGUI - 优化ScrollView的一些心的 https://www.cnblogs.com/9-de/p/5109057.html NGUI滑动优化,滑动系数,滑动慢问题UIScrollView https://www.bobs...

weixin_30908941的博客 169

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

unity中NGUI制作UI界面的小建议

NGUI和UGUI的渲染方式是不同的,UI界面的拼接也是有差别的,这里就只说NGUI拼接UI界面相关的事项 一.NGUI中的drawCall统计规则: (1)一个UITexture就是一个单独的drawCall (2)每个Panel就是一个drawCall (3)相邻的depth的相同图集 合成一个drawcall(如果相邻的depth使用不同的图集,drawcall不能合并,每个图集就单独计为一个drawcall) 二.NGUI中的刷新规则: (1)首先对UiPanel,按照depth进行排序 (2)然后

木马人 702

【Unity插件】NGUI核心组件之UICamera

目录(?)[-] NGUI:UIPanel参数Tips NGUI:UIPanel UIPanel负责创建实际的集合图形。你不需要手动的添加UIPanel-一旦你创建一个控件,它会自动被添加。如果你想将你的UI渲染拆分到不同的Draw Call中,你可以手动创建你自己的UIPanel,例如你要创建一个分屏的游戏,每个屏用一个摄像机进行渲染,这种秦光下你就需要2个UI

xinshou_jiaoming的专栏 1253

记录一些U3D对象的优化

Component 相关优化 Transform 使用内建的数组,比如用 Vector3.zero 而不是 new Vector(0, 0, 0); transform.localRotation = Quaternion.Euler(Vector3.zero); transform.localScale =Vector3.one; transform.localPosition =Vector3...

qq_17347313的博客 290

UI方案及制作细节(NGUI/EZGUI/原生UI系统)

转载请留下本文原始链接,谢谢。本文会不定期更新维护,最近更新于2013.09.17。 http://blog.sina.com.cn/s/blog_5b6cb9500101bplv.html 一、方案选择 U3D项目的UI方案总的来说就三个,NGUI、EZGUI、用U3D原生UI。 U3D官方说的新UI系统迟迟不出来,在新UI系统出来

xiaodiao062的专栏 841

NGUI注意事项

1.NGUI中的Depth的适用范围是所有的控件必须在同一个Atlas下面。如果控件不在同一个Altas下面,则更改控件的Depth是没有效果的。 2.NGUI中每一个控件要和UIRoot在同一个Layer层中。 3.给控件添加Tween时,如果想初始情况不执行动画,则取消Tween组件的勾选即可。

chencongyu的专栏 962

Unity3D-深入剖析NGUI的游戏UI架构

Unity3D-NGUI分析,使用NGUI做UI须要注意的几个要点在此我想罗列一下,对我在U3D上做UI的一些总结,最后解剖一下NGUI的源码。它是假设架构和运作的。 在此前我介绍了自己项目的架构方式,所以在NGUI的利用上也是相同的做法,UI逻辑的程序不被绑定在物体上。那么怎样做到GUI输入消息的传递呢,答案是:我封装了一个关于NGUI输入消息的类。因为NGU...

weixin_30568591的博客 128
上一篇: Unity中Avatar换装实现
下一篇: NGUI开发优化技巧(下)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

独立游戏开发指南

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值