zoukankan      html  css  js  c++  java
  • NGUI 降低drawcall

    前置说明一:

    Unity中的drawcall定义:

    每次引擎准备数据并通知GPU的过程称为一次Draw Call。

    Unity(或者说基本全部图形引擎)生成一帧画面的处理过程大致能够这样简化描写叙述:引擎首先经过简单的可见性測试。确定摄像机能够看到的物体,然后把这些物体的顶点(包含本地位置、法线、UV等),(顶点怎样组成三角形),变换(就是物体的位置、旋转、缩放、以及摄像机位置等)。相关光源,纹理,渲染方式(由材质/Shader决定)等数据准备好,然后通知图形API——或者就简单地看作是通知GPU——開始绘制,GPU基于这些数据,经过一系列运算,在屏幕上画出成千上万的三角形。终于构成一幅图像。


    前置说明二:

    NGUI中的UIWidget的显示顺序:

    每个UIWidget的显示顺序由depth值决定。跟z轴没关系,而这个depth值是由两部分组成的,一个是UIWidget所在的UIPanel的depth和UIwidget自身的depth值进行加权计算。

    而且。UIPanel的权重很大。能够觉得,UIPanel的depth大的全部UIWidget比UIPanel的depth小的全部UIWidget比最后计算的depth一定大。举个样例:


    UIPanel1    depth  x                      UIPanel2    depth  y

    UIWidget1  depth  m                      UIWidget2  depth  n


    仅仅要 x > y,那么无论m和n的大小,UIWidget1最后的depth一定大于UIWidget2。



    降低drawcall的规则:

    1、同一个UIPanel下的texture和font尽量放在同一个altals下。

    也表达了另外一个意思。使用同一个altals的元素尽量放在同一个UIPanel以下。

    2、假设一个UIPanel以下使用了多个altals,那么尽量让使用同样altals的元素连续,尽量避免altals交叉。


    规则1的前半部分好理解。后半部分,參照前面显示顺序问题能够知道。

    假设使用同一个altals的元素在两个不同的UIPanel以下,这就必定导致它们的drawcall分离。所以即使调整它们的depth一致。也无法合并成一个drawcall.


    规则2的意思,举个样例就明确了:

    同一个UIPanel下有4个UIWidget。w1,w2。w3。w4。

    当中 W1和W2引用altals1。

    当中 W3和W4引用altals2。


    假设它们的depth顺序为  w1 : 1,w2 :2,w3 : 3,w4 : 4。

    那么整个渲染须要2个drawcall。由于渲染顺序为 w1,w2。w3,w4。

    而w1和w2公用一个altals,所以能够合并成一个drawcall。同理w3和w4能够合并成一个drawcall。


    而假设它们的depth顺序为: w1 : 1。w2 :3,w3 : 2,w4 : 4。

    那么整个渲染须要4个drawcall。由于渲染顺序为 w1。w3,w2,w4。

    由于w1和w3不是公用一个altals,所以仅仅能分开渲染。同理w3和w2,w2和w4也仅仅能分开渲染。






  • 相关阅读:
    C语言与汇编的嵌入式编程:统计字符串中各字符出现的次数
    一个汇编小demo
    C语言与汇编的嵌入式编程:求100以内素数
    TCP网络调试助手上提示错误:“1035 未知错误”的有效解决方法,本人实测确实可行
    一个支持国密SM2/SM3/SM4/SM9/ZUC/SSL的密码工具箱
    DRM(device resource management)介绍
    TODO
    pinctrl(1)——pinctrl子系统的使用
    GPIO使用总结
    Gerrit使用技巧
  • 原文地址:https://www.cnblogs.com/brucemengbm/p/6690559.html
Copyright © 2011-2022 走看看