美文网首页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