drawcall的角度性能调优

  1. 1)drawcall是什么,降低drawcall对性能调优的意义
  2.     面试题: drawcall是什么?
  3.         (1)我们的游戏,提交给GPU来绘制;
  4.         (2)drawcall就是: 我们的整个场景里面,分几个批次提交给显卡绘制,整个就是drawcall
  5.         (3)100个物体需要绘制,分多少次批次提交给我们的GPU,整个批次就算drawcall
  6.     面试题: 为什么降低drawcall对性能有好处?
  7.         (1)对于cpu而言,一次提交给GPU,会比多次提交性能更好,省cpu
  8.         (2)GPU: GPU吞吐量,一次性处理多少个面(三角形),每次提交的物体越多,GPU性能就更容易;
  9.              如: 每次开机,GPU本来可以处理1000个三角形-->但是你每次给它提交的只有10个面--》性能得到发挥
  10. 2)UGUI降低drawcall的方法
  11.     (1)创建一个项目,来使用UGUI来搭建一个界面;
  12.     (2)drawcall:    Batches:20
  13.     (3)如何来看UGUI到底占用了多少个drawcall:
  14.         当我们优化drawcall的时候,我们首先要看看,哪些物体占用了多少drawcall:
  15.             如果我把UGUI隐藏,那么这个时候,drawcall是2。 因此UGUI占用20-2=18个drawcall
  16.     (4)当你优化drawcall的时候,一定要分析场景里面drawcall的消耗情况,你才能对症下药--》性能调优.
  17.         18个drawcall    
  18.     (5)剩下的这2个drawcall分别是谁?
  19.         天空盒一个drawcall;
  20.         背景;
  21.         
  22.     (6)UGUI如何降低drawcall呢?-->将UGUI里面使用的图片-->图集里面;
  23.         一般UGUI的drawcall能够合并,shader算法要一样,纹理对象要一样
  24.             我们的图片是单个的图,因此没办法合批
  25.             结论: 同样的纹理,同样的shader,因此可以合并;
  26.             
  27.         图集: 将散图打到一个图集里面,然后我们在绘制UGUI物体的时候,根据纹理坐标,来找到小图;
  28.         
  29.     (7)UGUI优化drawcall时,就是将UGUI的图片打成图集
  30.         1:开启图集模式:Editor-->Editor设置-->Sprite Packer;
  31.         2:你要将哪些图片打入到一个图集里,
  32.         
  33.         3:启动打包生成图集,window-->SpritePacker
  34.         Sprite Packer-->Repack
  35.         
  36.         
  37.         2个Label 1个drawcall
  38.         
  39.     (8)UGUI drawcall打断
  40.         Image + 图集 一堆节点-->drawcall--》1个drawcall 
  41.         Text肯定会打乱我们的drawcall
  42.         
  43.         按道理应该是4个drawcall,但是为什么unity UGUI怎么是2个drawcall呢?
  44.         
  45.         unity会根据位置,对场景的影响,来改变物体的层级绘制顺序,能尽可能的降低drawcall:
  46.             如:unity检测到2个label绘制顺序不影响显示,因此会延后绘制;
  47.             
  48.             如果:label的位置影响了绘制,unity则不会优化,drawcall从4-->6
  49.     
  50.     
  51. 3)Text的主要原理与drawcall的影响
  52.     Text使用了UI/Default
  53.     
  54.     Text对于unity而言,底层用的是和Image是同样的shader
  55.         Text使用了UI/Defaulthe Images是一样的,就是显示的纹理贴图
  56.         
  57.     Unity: Text的核心原理:
  58.         通过Text组件 + 矢量字库 + 字体大小 + 文本内容 生成一个--》文本内容显示的效果--》生成一个贴图;
  59.         底层 文本--》贴图来对待,只不过这个贴图不是Image, 而是通过Text组件 矢量字库,绘制到一个纹理贴图对象上的;
  60.         
  61.     问题来了:
  62.         2个Label-->2个不同的纹理对象,drawcall合并,label应该是2个drawcall才对, Image + 2 = 3个drawcall 2个drawcall?
  63.             内容和大小
  64.         unity在处理Label的时候,能够将文字--》尽可能的生成到一个纹理里面--》图集--》额定的大小。
  65.         
  66.         别的游戏引擎: Label直接打断drawcall,几个Label几个drawcall.  因此unity对于Label这块还是优化的很好的。
  67. 4)RawImage对drawcall的影响;
  68.     面试问: RawImage和Image有什么区别?
  69.         
  70.     RawImage: Texture + Sprite
  71.     Image: Sprite
  72.     
  73.     
  74.     RawImage支持设置我们的uv坐标
  75.     Image不支持
  76.     
  77.     RawImage: 单独占用一个drawcall,即时同一个图集的不同图片,也无法合并drawcall。除非: 同样图片是可以合并
  78.         性能没Image好,单色支持更多
  79.     
  80.     Image还可以做些其他的效果,比如:九宫格等
  81.     
  82.     
  83. 5)OnGUI对drawcall的影响
  84.     OnGUI:做昵称,做血条?--》不行--》性能不好--》为什么呢?从drawcall的角度分析一下OnGUI

猜你喜欢

转载自blog.csdn.net/themagickeyjianan/article/details/107287139