1:在UIPanel中有一个静态的List,这个list包含所有的Panel,每个Panel有两个属于自己的list:一个List,一个List,每个panel都会在自己的子节点中向下寻找,把找到的Widget丢进自己的List中,这个行为在每一次走到叶节点,或者遇到panel的时候就会中断当前的分支,调到下一个分支
static list内部包含一个Sort排序方法,会基于panel的Depth进行一次排序
而panel内部也包含一个sort排序方法,会基于widget的Depth进行一次排序
当一个panel的list排序完成后,panel就会根据list来生成list,list中的第一个widget必定会创建一个新的Drawcall,之后的每一个widget都会拿出来和前一个进行对比,如果两者的material、texture、shader(简称M/T/S)一致,则把后面这个widget也丢给同一个Drawcall处理,如果两者的M/T/S有一丢丢不一样的地方,就会创建一个新的
Drawcall,也就是说,相同的M/T/S且下标连续的widget会共用一个Drawcall,而如果相同的M/T/S的widget中间隔着一个或多个不同M/T/S的widget,就会拆分出许多额外的Drawcall
各个panel的list最终会合并汇总一个静态的ActiveDrawcallList,最终供渲染时调用
UIGeometry
UIGeometry被UIwidget实例化之后,通过UIwidget的子类也就是UISprite,UILabel等,在OnFill()函数算出所需的Geometry缓存(顶点数,uv,color,法线,切线),之所以生成这些数据是为了之后生成Mesh来渲染
而UIPanel,通过遍历自己子类下面所有的UIWidget组件(已经按照深度排序),先创建一个UIDrawCall,然后把该widget的material,texture,shader对象以及Geometry的缓存传递给UIDrawCall,如此反复循环搜索该UIPanel下的每一个widget,只要是material,texture,shader都和上一个widget一样的widget,他们的缓存都传给同一个UIDrawcall,知道循环结束或者碰到一个材质球,贴图,shader对象任一不相同的widget,当遇到这种widget,循环会再创建一个新的UIDrawCall,然后传递material,texture,shader,缓存,如此这般,直到循环完全结束
每次有新的UIDrawCall产生,uipanel都会调用上一个UIDrawCall的UpdateGeometry()函数,来创建渲染所需的对象,这些对象分别是MeshFilter,MeshRender,和最重要的Mesh(Mesh的顶点,uv,color,法线,切线,还有三角面)
这些对象都会像我们正常在游戏中新建cube一样,依附在创建UIDrawCall时生成的GameObject上以便可以渲染。我们在editor中是看
NGUI渲染流程讲解
最新推荐文章于 2022-02-26 20:50:44 发布
本文详细介绍了Unity中NGUI的渲染流程,从UIPanel的List管理到Widget的排序,再到Drawcall的生成和优化。讲解了如何通过深度排序、Material、Texture和Shader的比较来减少Drawcall数量,以及UIGeometry、UIGeometry和UIDrawCall在构建Mesh过程中的作用。内容包括LateUpdate、UpdateSelf、FillAllDrawCalls等关键函数的功能,适合理解NGUI渲染机制和面试准备。
摘要由CSDN通过智能技术生成