NGUI 必读1 NGUI渲染基础机制

原文 NGUI三大基础机制:https://gameinstitute.qq.com/community/detail/109914

本文介绍以NGUI的版本是3.6.0版本为基础

基础介绍

  NGUI的UIWidget, UIDrawCall,UIGeometry和 UIPanel等基础脚本。

Ø  UIWidget是UI的基础组件(UILabel,UISprite)的基类,含有组件的基本信息(width,Height,color 锚点等)

Ø  UIGeometry是UIWidget的几何数据,记录了顶点坐标,贴图的UVs和颜色等信息

Ø  UIDrawCall是将多个UIWidget的UIGeometry组合起来一起绘制

Ø  UIPanel 用于管理UIWidget、UIDrawCall等,实现界面的渲染裁剪、更新。

Ø  UIRoot  UI界面的根目录,用于分辨率适配和事件广播。

MeshFilter 和Mesh介绍:

  MeshFilter网格过滤器用于从你的资源中获取网格信息(Mesh)并将其传递到用于将其渲染到屏幕的网格渲染器当中。MeshFilter 与 Mesh 联合使用,使模型显示到屏幕上。要想在场景中看到这个网格(mesh),还需要为游戏对象(GameObject)添加一个网格渲染器(MeshRenderer),它应该是自动被添加的。但是如果你将它从你的对象中移除。你必须手动重新添加它。如果网格渲染器(MeshRenderer)不存在,这个网格仍将存在于你的场景中。但是它将不会被绘制。

  NGUI的渲染机制

  要详细的了解NGUI渲染机制,首先需要打开NGUI隐藏的渲染节点,秘密就在在UIDrawCall.Create(string name) 中的HideFlags.HideAndDontSave, typeof(UIDrawCall));这一行代码。打开在UIDrawCall.cs文件,打开SHOW_HIDDEN_OBJECTS宏定义。就可以看到在渲染过程中,每一个UIDrawCall对应一个把UIDrawCall作为组建的节点【在编辑器可见】如图所示:

从上面的图就可以看出来,NGUI渲染实际上就是对通过对Mesh的渲染实现的。整个NGUI的渲染过程就把图片和文字按照一定顺序和规则组织成一系列的Mesh,然后通过Unity自身的渲染流程实现渲染。

  NGUI的渲染流程

  渲染过程开始的地方UIPanel.LateUpdate:在这个函数有函数调用Updateself 。

  Updateself中:UpdateWidgets:更新UIWeight的位置信息、可见性[含Alpha]、UV信息,是否渲染刷新。UIsprite就是继承于UIWeight的OnFill函数实现多样的化的填装方式(即把UIWeight所需要的数据处理到UIGeometry节点中),如:拉伸、九宫格等等。

FillAllDrawCalls:全体DrawCall节点刷新。

FillDrawCall:单个DrawCall节点刷新。

  首先介绍FillDrawCall:顾名思义,这个函数是刷新单个的Drawcall节点

找到属于这个DrawCall的UIWeight,然后对找到的每个UIWeight处理UV数据的组装,而这个UIWeight的数据就保存在自身的UIGeometry节点上。然后把这个Draw的数据刷新到Mesh上面去即采用UIDrawCall.UpdateGemetry。

  其次是FillAllDrawCalls:顾名思义,这个函数是刷新所有的的Drawcall节点,及重建Drawcall即节点。第一步:删除已经存在的Drawcall节点。第二步:对所有的UIWeight经行排序主要按照深度值和材质。第三步:逐个顺序处理UIWeight,把相邻且具有相同的材质的UIWeight的UIGeometry数据添加到同一个UIDrawCall上来,然后把数据刷新到Mesh上。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值