• QQ
  • nahooten@sina.com
  • 常州市九洲新世界花苑15-2

游戏开发

Unity render优化qa

原创内容,转载请注明原文网址:http://homeqin.cn/a/wenzhangboke/jishutiandi/youxikaifa/2019/0405/444.html

Unity render优化qa

 
 
本篇文章中,我们常州网站开发建设给大家整理了一些Unity中常见渲染优化问题,并给出相对应的处理方法。
 
几个关键局部的渲染优化问题:
DrawCall
半透明物体渲染
多层纹理渲染
Graphics.PresentAndSync
VBO
相机后处置特效
 
一、DrawCall相关
 
Q1:挪动游戏场景中,相同的怪物,DrawCall会动态兼并吗?如下设置可行吗?
Unity渲染优化的相关问题
 
Unity渲染优化的相关问题
 
默许状况下,带蒙皮的Mesh是不支持动态合批的。假如场景中相同材质的蒙皮网格数量很多,能够思索经过插件MeshBaker来停止兼并,详细办法大家能够参考好插件让你事半功倍!
 
Q2:DrawCall和SetpassCall,这两个指标主要是看哪一个?关于这点众口一词,很多中央都是说看SetPassCall,但是在UWA的性能测试中,还是把DrawCall当成独一指标。
Unity渲染优化的相关问题
 
在 Unity 5.x 中,SetPass Call与 Draw Call相比,SetPass Call的指标与性能相关性更大(比方Static Batching的开启不影响Draw Call数,而SetPass Call通常会明显降落)。但 SetPass Call在某些状况下也同样存在问题,比方往一个场景中添加恣意个相邻且材质相同的大网格物体(使Dynamic Batching失效)时,SetPass Call并不会变化。因而在UWA中,我们所运用的是相似Profiler 中 Total Batches 这一项指标,通常该数值与 Frame Debugger 中的数值根本分歧,因而能够经过该工具来查看每个Batch的内容,从而更有针对性地停止优化。
 
Q3:我UWA报告中“渲染模块”界面中看到大局部场景中的三角面片数是正常的,但在某一帧时DrawCall、Traingle、蒙皮网格数骤然提升,请问这可能是什么缘由招致的?这三个参数的变化曲线能否有规律?为什么我在切换场景的时分也会有400多的DrawCall呢?
Unity渲染优化的相关问题
 
从图中看,这种状况发作在场景切换处。这种状况的发作缘由很可能为一次性动态加载大量GameObejct,然后再手动Deactive当前并不需求运用的GameObject。研发团队能够查看该峰值处的场景称号和相关截图,从而来进一步定位发作该问题的基本缘由。
 
Q4:关于Static Batching, 场景中物件组合成大的Mesh,那么判别子Mesh要合入大的Mesh中的根据是什么?材质?勾选Static?
Unity渲染优化的相关问题
 
我有一个模型A并勾选Static,运用材质A,怎样看到也和其他材质的Mesh兼并到一块去了(Combined Mesh)?
Unity渲染优化的相关问题
 
Unity渲染优化的相关问题
 
勾选Static的GameObject下的Mesh都会被合入CombineMesh(无论什么材质),且每个Mesh都作为SubMesh存在。在Unity 5.3之前,关于渲染次第相邻且材质相同的SubMesh则会动态将其索引数组拼合,从而合成一个Draw Call。而Unity 5.3之后则不再拼合索引数组,由于在不切换材质时产生多个Draw Call的开支并不大,而这多个Draw Call会被统计为一个Batch。
 
Q5:Unity对Dynamic Batching的数量能否有限制?或者说对Saved by Batch的数量能否有限制?
 
Unity关于任何Mesh的面片都有65536的个数限制,拼合后的面片数也是如此。
 
Q6:游戏开发运营讨教,角色分部件换装可行吗?比方衣服裤子分开,都是用Skinned Mesh Render,有没有方法兼并降低Draw Call?
 
能够经过兼并网格的方式来到达降低Draw Call的效果,详细可查看Asset Store中的换装例子:Character Customization。但是,在角色换装时需求留意以下几点:
(1)配备与角色必需是共用一套骨骼的;
(2)各配备之间所用的材质必需相同。
开发者需求留意,只要同时满足以上两个条件时,才干到达只运用少量Draw Call来停止动态换装的效果。
 
Q7:请问,Canvas里的东西移出了屏幕后,DrawCall没降低,那么它还会每帧去绘制吗?
 
DrawCall没降低,阐明CPU仍然将这局部的网格提交到了GPU。因而固然UI元素曾经不可见,但其CPU开支(包括切换渲染状态,提交VBO等)仍然是在的,只是对GPU不会形成明显影响,由于最终并没有停止像素的渲染。
 
Q8:能否对提升NGUI的渲染效率提供一些思绪?
 
开发团队能够从以下几点动手:
通常一个Panel会产生1个或多个Draw Call,以一个Panel为单位,Draw Call 的数量通常由当前 Panel 中运用的Atlas、Font的数量所决议。
要降低UI渲染时的 Draw Call数量则需求对 Atlas 的制造停止合理的规划,即在保证运用较少的 Atlas 的同时,还需求保证 Atlas之间不会存在穿插遮挡。
要留意UI Texture的运用,每个UITexture本身会占用一个Draw Call,同时假如其Depth值交叉在了其他来自相同Atlas的UISprite中,还会招致Draw Call的打断,形成不用要的额外Draw Call。
另外还能够借助Panel Tool和Draw Call Tool来对UI局部的Draw Call停止剖析,前者能够显现每个UIPanel包含了几个Draw Call,然后者能够显现每个Draw Call由哪些UIWidget组成。"
 
Q9:关于场景中玩家和NPC名字的DrawCall的问题。我们项目中是运用TextMesh挂到场景单位上,但是这样每个名字就占了一个DrawCall,请问有没有好的方法优化呢?
 
游戏中的HUD的做法普通有两种,一种是如上的做法,另一种则是经过NGUI/UGUI来制造HUD。第二种的完成办法大致如下:
计算屏幕中角色在屏幕中的位置;
依据屏幕中的位置来计算各自HUD的位置,并依据HUD的数量分别放置在一个或几个Panel/Canvas下。
第二种办法的优势是尽可能用少的Draw Call数来渲染角色的HUD。开发团队能够就该办法来停止尝试。
 
二、半透明物体渲染相关
 
Q1:这个批渲染是什么?仿佛开支很高 。
Unity渲染优化的相关问题
 
从图中看出,这是场景中不透明物体的渲染开支。倡议研发团队对当时场景中的不透明物体(地形、建筑等)停止进一步检测,主要查看其三角面片数能否过高、Shader能否过于复杂等。
 
三、多层纹理渲染相关
 
Q1:我们游戏用的是T4M,4层Tilling贴图+1层交融贴图,发现手机发热现象严重,影响性能的表现,请问有什么规范或者参考数据吗?
 
关于中低端机器来说,我们倡议地形纹理所刷的层数要尽可能小于3层。在中低端设备中,纹理采样次数越多,则GPU的压力越大,发热效果也就越明显。
 
在UWA性能测评报告中,我们参加了针对Graphics.PresentAndSync的统计,从而让大家来看到项目运转过程中,GPU的压力状况。同时,在设备的温度显现中,倡议大家关注温度的走势图,看看能否存在大幅向下回落的状况,假如存在,则很可能是设备由于过热而主动降频。
 
Graphics.PresentAndSync耗时统计
Unity渲染优化的相关问题
 
设备温度走势
Unity渲染优化的相关问题
 
四、Graphics.PresentAndSync相关
 
Q1:我们常州手游开发在编译安卓版本时,在某些设备上(Sony L36h,小米4)调试时,发现有一个时间耗费项叫Graphics.PresentAndSync,该函数对性能的耗费会特别夸大(渲染20毫秒,这个能到达50毫秒)。查了相关文档,发现该函数仿佛和安卓设备的垂直同步有关,但是大局部安卓设备的垂直同步是不能够关闭的。请问有什么好的方法处理吗?
 
概括来说,该值很高表示 GPU 担负很重,能够从降面,或者简化shader动手。
 
Graphics.PresentAndSync 是指主线程停止Present时的等候时间和等候垂直同步的时间。该参数在Profiler中CPU占用通常较高,且仅在发布版本中能够看到。究其缘由,其实是CPU和GPU之间的垂直同步(VSync)招致的,主要是与项目能否开启多线程渲染有关。当项目开启多线程渲染时,你看到的则是Gfx.WaitForPresent;当项目未开启多线程渲染时,看到的则是Graphics.PresentAndSync。
 
其中的原理,能够参照我们之前对其函数的细致解释:扒一扒Profiler中这几个“占坑鬼”。
 
五、VBO相关
 
Q1:我们如今有一个场景,Draw Call和面数都在正常范围内,Camera的间隔也和其他场景一样,但是VBO却十分高。下图是该场景的数据状况,该场景下有很多复用的模型,假如不勾选Static那VBO会降落,但是Draw Call会上升。那我能否经过兼并模型的方式把VBO降下来呢?
Unity渲染优化的相关问题
 
当你勾选Static时,Unity 会将其停止 Static Batching,进而将生成一个较大的VBO来停止渲染,同时降低Draw Call。而假如不勾选时,则引擎无法对其停止Batch,所以VBO会降低,而Draw Call升高。
 
对此,我们的倡议如下:
普通来讲,降低Draw Call的意义大于降低VBO;
在Draw Call较低的状况下,比方当前的50+,能够思索恰当增加一些Draw Call来降低VBO的占用,一方面能够降低带宽的压力,另一方面也能够恰当降低一些内存。
 
六、相机后处置特效相关
 
Q1:关于抗锯齿和BLOOM,有什么好的优化计划或者优秀插件引荐?
 
通常在中低端的设备上,抗锯齿并没有比拟高效的计划;而关于中高端的设备,可尝试直接运用 Unity 内置的 MSAA 功用,但也只引荐运用 2x。
 
关于Bloom效果,以下是适用于挪动端,且评价较好的一款插件:BloomPro
Unity渲染优化的相关问题
 
Unity渲染优化的相关问题
 
Q2:如何在挪动设备上,对Bloom和全屏抗锯齿停止优化?Unity规范资源里面自带的效率比拟低(曾经尝试过Bloom(Optimized))。
 
倡议运用Asset Store上合适挪动端的Bloom Shader插件,比方FxPro: Bloom&DOF和BloomPro等。
关于AA,目前在挪动设备上并没有特别优化的办法,仅能倡议在低端设备上关闭AA功用,而在高端设备上可尝试开启较低倍数(2x)的MSAA。
 
七、Shader解析相关
 
Q1:图中的Material.SetPassFast占用很高,这是我在第一次实例化一个特效,但是第二次实例化就不会呈现高值了,请问能怎样优化吗?
Unity渲染优化的相关问题
 
该过程是在处置Shader,Unity 5.3以后在第一次显现时才会将Shader停止Warmup,所以就会形成一次峰值卡顿。研发团队能够参考我们之前的分享:Unity加载模块深度解析之Shader篇以加深了解。
 
Q2:Shader.Parse 和 Shader.CreateGpuProgram 到底是做什么的?它们什么时分执行?
Unity渲染优化的相关问题
 
Shader.Parse表现的是Shader的加载和解析, Shader.CreateGpuProgram 是将Shader传入GPU的一次提交,GPU驱动会对其停止编译,以顺应于特定的设备或平台。在Unity 5.x版本中,Shader.Parse在Shader资源加载时停止执行,而 Shader.CreateGpuProgram在所在GameObject第一渲染时停止执行。
 
八、其他
 
Q1:如下图,我们发现WaitingForJob这个函数耗费过高招致了卡顿,请问该卡顿能否由于渲染压力过大招致?
Unity渲染优化的相关问题
 
Unity渲染优化的相关问题
 
从常州游戏开发培训图中看,该线程最后是在等候 Canvas.sortjob,而这是 UI 排序形成的开支(自Unity5.2版本开端,UGUI的局部计算曾经移出了主线程)。
详情参考:http://blogs.unity3d.com/2015/09/07/making-the-ui-backend-faster/
因而理论上,这是 UI 的 canvas.sortjob 在指定的时间上没有完成,从而使得渲染线程等候,且最终招致主线程停止等候而形成的开支。

上篇:上一篇:Unity中lineRenderer的运用
下篇:下一篇:开发网络游戏的延迟处置办法,播送