Unity3D项目优化文档

来源:互联网 发布:战舰世界青叶数据 编辑:程序博客网 时间:2024/06/16 01:07

Unity3D项目优化文档

@ (优化点)[CUP方面 |GPU方面 |内存方面]


  • Unity3D项目优化文档
    • 一CPU方面的优化
        • DrawCalls
        • 物理组件
        • 其他程序功能
    • 二GPU方面的优化
        • 优化方案
    • 三内存方面的优化


一.CPU方面的优化:

优化以下因素来提升CUP的速率:
@(优化点)[DrawCalls |物理组件 ]

  • DrawCalls :

    • 什么是DrawCalls?
      • DrawCalls就是对底层图形程序接口的调用。而去调用这个接口的就是CUP。比如有上千个物体,每一个物体都需要去调用一次底层接口,而每一次调用,CPU都要进行很多的计算工作,那么CPU必然会很消耗。但对于GPU来说,图形渲染处理的工作的都是一样的。
    • 优化方案
      • 尽量解放CPU在调用图形接口上的开销,可以使用以下方法优化:
        1. 使用Draw Call Batching(即是:“批处理绘制”,被批处理的2个或者以上物体的网格模型需要使用相同的材质),也就是描绘调用批处理。这样U3D在运行的时候可以将一些物体进行合并处理,从而只调用一次图形绘制接口。(其中Draw Call Batching 主要细分为:Static Batching(静态批处理)和Dynamic Batching两种)
        2. 通过把纹理打包成图集来减少材质的使用。
        3. 尽量减少使用反光,阴影。因为他会使物体进行多刺的渲染。
        4. 尽量多的使用预制件(Prefab)。可以极大的优化DrawCals的调用次数。

物理组件 :

  • 优化方案
    • 物理组件,是游戏中模拟计算物理效果的组件。那么物理计算的频率越高,CUP的计算量也就相应的增大。所以把Fixed Timestep调节到合适值会优化物理的运算。
    • 再这就是尽量不要使用网格碰撞器。因为网格碰撞器利用网格资源并在其上构建碰撞检测。所有他的计算量将会很大。

其他(程序功能) :

  • 尽量少使用Foreach,而使用for。
  • 不要直接访问gameobject的tag属性。最好换做CompareTag。因为访问Tag属性会在堆上额外的分配空间。
  • 尽量使用“池”,以实现空间的重复利用。
  • 尽量不要使用LINQ命令。

二.GPU方面的优化:

优化以下因素来提升GUP的速率:
@(优化点)[顶点数量|压缩图片 ]

  • 优化方案:

    • 减少模型的顶点数量(即相应的模型面数,复杂程度)。据了此次测试统计结果,尽量保持是250万面左右最佳。
    • 保持材质的数目尽可能的少。使得Uinty更容易的进行批处理。
    • 使用纹理图集(一张大图里面包含了很多的字贴图)来代替一系列单独的小贴图。
    • 使用光照纹理而不是非实时灯光。
    • 使用LOD,好处就是离的远,看不清的物体的细节可以忽略。
    • 遮挡剔除(多使用Occlusion culling)
    • 尽量使用mobile 版的shader。因为简单。
    • 使用mipmap。(和LOD类似)
    • 对于模型需求不是很精细的物体,尽量使用曲线细分的功能。

三.内存方面的优化:

优化以下因素来提升GUP的速率:
@(优化点)[Unity3D内部的内存|各种资源|逻辑 ]

  • 通常情况下,Unity游戏引擎的内存中大概需要存储的有:

    • 资源:纹理,网格,音频,动画。
    • GameObject和各种组件。
    • 引擎内部逻辑需要的内存:渲染器,物理系统,粒子系统等等。
  • 针对以上几点的优化方案有:

    • 处理纹理 :

      • 除非真正需要,否则不要创建面向纹理 的 Mipmap
      • 使用压缩纹理
      • 除非需要,否则不要将纹理设置为可读 状态(CPU 读/写)。 这样可避免额外的 CPU 副本,标记等。
      • 根据屏幕分辨率缩小纹理
    • 动画:删除动画中的冗余关键帧。

    • 网格模型 :
      • 删除网格中的不常用通道(在“Player”设置下方,启用 “Optimized Mesh Data”)。
      • 减少不必要的多余节点,面数,以及碰撞体。
      • 一个整体模型的面数尽量控制在250万。