zoukankan      html  css  js  c++  java
  • Unity UGUI优化整理

    看了不少UI优化方面的东西,还是记下来方便记忆,优化性能往往是在各种选择之间做出平衡(空间换时间,或者GPU换CPU,舍弃精度等)。

    主要优化点在减少Drawcall,减少Overdraw。

    Mask

    使用Mask会额外消耗多一个Drawcall来创建Mask,做像素剔除。

    Mask不利于层级合并。原本同一图集里的ui可以合并层级,仅需一个Drawcall渲染,如果加入Mask,就会将一个ui整体分割成了Mask下的子ui与其他ui,两者只能各自进行层级合并,至少要两个Drawcall。Mask用得多了,一个ui整体会被分割得四分五裂,就会严重影响层次合并的效率了。

    当只需要使用矩形Mak时,用RectMask2D

    当需要用圆形Mask的替代办法:https://www.cnblogs.com/leoin2012/p/6425089.html

    需要使用多边形Mask时,用:https://www.cnblogs.com/leoin2012/p/6822859.html

    字体

    尽量减少字体特效,outline,渐变等,可以使用带有描边的字体文件,尽量统一字体风格,减少不必要的额外字体文件,不用richtext。

    降低Overdraw

    设计上减少UI元素重叠,禁用不可见的UI,不要使用空的Image。

    动静Canvas分离

    在UGUI中,网格的更新或重建(为了尽可能合并UI部分的DrawCall)是以Canvas为单位的,且只在其中的UI元素发生变动(位置、颜色等)时才会进行。因此,将动态UI元素与静态UI元素分离后,可以将动态UI元素的变化所引起的网格更新或重建所涉及到的范围变小,从而降低一定的开销。而静态UI元素所在的Canvas则不会出现网格更新和重建的开销。

    合并材质

    。。。

    RawImage

    网络下载的图片可以使用rawImage组件显示,不需要转换成Sprite的话会快一些

    界面切换

    可以尝试通过添加一个 Layer 如 OutUI, 且在 Camera 的 Culling Mask 中将其取消勾选(即不渲染该 Layer)。从而在 UI 界面切换时,直接通过修改 Canvas 的 Layer 来实现“隐藏”。但需要注意事件的屏蔽,禁用动态的 UI 元素等等。
    这种做法的优点在于切换时基本没有开销,也不会产生多余的 Draw Call,但缺点在于“隐藏时”依然还会有一定的持续开销(通常不太大),而其对应的 Mesh 也会始终存在于内存中(通常也不太大)。

  • 相关阅读:
    Practice3_5_vector_sort_struct_gold_silver_bronze_playerName1
    Practice3_4_vector_sort_struct_string
    Practice3_3_vector_sort_struct
    Practice3_2_vector_sort_struct
    2017多校第9场 HDU 6170 Two strings DP
    BZOJ 3771 生成函数,FFT
    BZOJ 3028 食物 生成函数
    Codeforces Round #428 (Div. 2) 题解
    2017中国大学生程序设计竞赛
    2017多校第8场 HDU 6133 Army Formations 线段树合并
  • 原文地址:https://www.cnblogs.com/Mr147/p/10821070.html
Copyright © 2011-2022 走看看