美文网首页unity优化Unity技术分享Unity跨平台技术分享
Unity性能优化中Profiler常见高损耗节点

Unity性能优化中Profiler常见高损耗节点

作者: RichMartin | 来源:发表于2019-10-31 15:46 被阅读0次

    A

    • Animator.Initialize
      主要是在Instantiate实例化时引起(实际上,GameObject.Active操作也会引起Animator.Initialize),而其具体的耗时原因是相关资源(主要是AnimationClip资源)的加载所致。

    C

    • Camera.Render
      是Unity引擎的主要渲染函数,其中负责了绝大部分场景的渲染工作

    • Canvas.SendWillRenderCanvases
      为UGUI中非常重要的接口,经常会出现较高的性能开销。当Canvas中的UI元素出现了长、宽或Alpha变化时,UGUI会更新其所在Canvas中所有UI元素的Transform、状态等等。Canvas中UI Mesh顶点较多的话,则该项将会出现较高的CPU开销。

    • Canvas.SendWillRenderCanvases()
      该API为UI元素自身发生变化(比如被Enable或者被缩放,移动并不算)时所产生的调用。发生在canvas被渲染之前。

    • Canvas.BuildBatch
      该API为UI元素合并的Mesh需要改变时所产生的调用。通常之前所提到的Canvas.SendWillRenderCanvases()的调用都会引起Canvas.BuildBatch的调用。另外,Canvas中的UI元素发生移动也会引起Canvas.BuildBatch的调用。

    E

    • EventSystem.Update
      来自被触发的响应事件,这部分的开销实际上并不属于事件系统本身,比如:某次点击触发了一个开销很高的逻辑函数,尤其是涉及到资源的加载和实例化。

    F

    • Font.CacheFontForText
      主要是指生成动态字体Font Texture的开销, 一次性打开UI界面中的文字越多,其开销越大。

    G

    • Gpaphics.PresentAndSync
      – 反映GPU上的渲染压力

    • GameObject.Deactivate
      实际上GameObject.Activate/Deactivate本身通常不会产生很高的开销,主要都是由其上或其子节点上的组件的OnEnable/OnDisable操作引起,比如UI相关的组件在OnEnable和OnDisable中都会有较多的操作,所以较复杂的UI界面的GameObject.Activate/Deactivate会有很高的开销。

    • GameObject.Instantiate
      Instantiate的卡顿与三部分开销相关:相关资源加载、脚本组件的序列化和构造函数的执行,并且绝大部分原因均是相关资源加载导致。

    • Gfx.WaitForPresent && Graphics.PresentAndSync
      这两个参数在Profiler中经常出现CPU占用较高的情况,且仅在发布版本中可以看到。究其原因,其实是CPU和GPU之间的垂直同步(VSync)导致的,之所以会有两种参数,主要是与项目是否开启多线程渲染有关。当项目开启多线程渲染时,你看到的则是Gfx.WaitForPresent;当项目未开启多线程渲染时,看到的则是Graphics.PresentAndSync。

    L

    • Loading.UpdatePreloading
      为Unity引擎的主要加载函数。场景中的资源加载(包括Texture、Mesh、Shader、AnimationClip等)和相关序列化操作均在其中体现。因此,如果该值开销较高,建议研发团队对资源进行进一步的优化和控制。

    • LogStringToConsole
      Unity中有些问题不输出在Console上,而是输出在Editor Log上了,右键Console > Open Editor Log可以打开编辑器日志,查看具体错误信息。

    M

    • MeshSkinning.Update
      (蒙皮网格每帧更新)和Animation.Update and Animator.Update(骨骼动画的更新开销)两个函数

    • MaskableGraphic.OnEnable
      在UGUI中,Image组件并没有重写其父类的OnEnable函数,所以在激活时会出现MaskableGraphic.OnEnable。其中出现堆内存开销的话,通常是因为其父类函数Graphic.OnEnable中,UGUI在进行全局容器的Add等类似的操作时,遇到了扩容等产生堆内存的操作。

    O

    • OnTransformChanged
      是UI元素在移动时触发的,所以该回调的开销是不可避免的,但一般来说该回调本身耗时并不会太高

    • Overdraw
      该模块可以帮助用户直接查看项目运行时每帧都渲染的像素数量,从而反映出设备GPU端所承受的压力。我们可以看到下面的图片中有地方是黑色,有地方是红色。颜色越红,表示该处像素在当前帧中被填充的次数较多,进而GPU的压力也就越大。移动VR开发者需要特别关注这部分的情况。

    P

    • Profiler.FinalizeAndSendFrame
      这个是Unity Profiler在记录和传输性能数据的开销,研发团队可忽略,因为在release版本中,该项并不存在;

    • Physics.Processing
      影响物理系统耗时的因素主要为Contacts数量(碰撞对数量)、Rigidbody API的使用情况和每帧的调用次数。

    S

    • Shader.Parse体现的是Shader的加载和解析
    • Shader.CreateGpuProgram 是将Shader传入GPU的一次提交,GPU驱动会对其进行编译,以适应于特定的设备或平台。
      在Unity 5.x版本中,Shader.Parse在Shader资源加载时进行执行,而 Shader.CreateGpuProgram在所在GameObject第一渲染时进行执行。
    • ScrollRect.LateUpdate()

    U

    • UIEvents.IMGUIRenderOverlays

    • 一旦发现UIEvents.IMGUIRenderOverlays中花费了大量的主线程CPU时间以及GC分配,这就表明在项目的代码库中的某处使用了Unity的即时模式GUI系统:即便是在代码库中仅出现一次OnGUI方法,也会导致IMGUI系统在游戏运行时进行初始化和处理。
      重要的是IMGUI非常低效,不适合生产代码。

      void OnGUI() { if(GUI.Button(new Rect(100, 100, 100, 100), "Load UI")) { //TODO } }

    W

    • WaitForJobGroup
      这个是主线程在等待子线程完成的耗时开销,如果该项较高,那么说明该帧中某子线程的开销很大。就目 前我们优化过的项目而言,绝大部分均为UGUI在子线程的开销所致。
    • WaitForTargetFPS
      该参数一般出现在CPU开销过低,且通过设定了目标帧率的情况下(Application.targetFrameRate)。当上一帧低于目标帧率时,将会在本帧产生一个WaitForTargetFPS的空闲等待耗时,以维持目标帧率。

    相关文章

      网友评论

        本文标题:Unity性能优化中Profiler常见高损耗节点

        本文链接:https://www.haomeiwen.com/subject/tqdtbctx.html