查看: 713|回复: 0
打印 上一主题 下一主题

[其他] Unity3D 性能优化的几个方法

[复制链接]

9903

主题

126

听众

7万

积分

首席设计师

Rank: 8Rank: 8

纳金币
53456
精华
316

最佳新人 热心会员 灌水之王 活跃会员 突出贡献 荣誉管理 论坛元老

跳转到指定楼层
楼主
发表于 2015-9-27 01:33:16 |只看该作者 |倒序浏览

一丶优化
1)、定时重复处理用InvokeRepeating 函数实现
例如:  void Start()
         {
            InvokeRepeating ("DoSomeThing", 0.5f , 1.0f);    //启动0.5秒后每隔1秒执行一次 DoSomeThing 函数;
          }   

2)、尽量避免每帧处理
例如:  void Update()
         {
         DoSomeThing();
         }
改为:  void Update()
       {
           if(Time.frameCount%5 == 0)      //每帧处理改为每5帧处理一次;
           {
            DoSomeThing();  
            }
        }  

3)、优化 Update, FixedUpdate, LateUpdate 等每帧处理的函数
例如:   void Update()
          {
           Vector3 pos = transform.position;
          }
改为:   private Vector3 pos;
           void Update()
          {
           pos = transform.position;
           }

4)、主动垃圾回收
           //给某个对象GameObject绑上以下代码;
例如:   void Update()
        {
             if(Time.frameCount%50==0)
           {
              System.GC.Collect();  
            }
        }   

5)、运行时尽量减少 Tris 和 Draw Calls
例如:  预览的时候 , 点开Stats , 查看图形渲染的开销情况 ; 特别注意 Tris 和 Draw Calls 这两个参数。
          一般来说 , 要做到 :
          Tris  保持在 7.5 K 以下
          Draw Calls 保持在 20 以下

6)、压缩 Mesh
例如: 导入 3D 模型后,在不影响显示效果的前提下,最好打开 Mesh Compression;
        Off,Low,Medium,High 这几个选项,可酌情选取。

7)、避免大量使用 Unity  自带的 Sphere  等内建 Mesh
例如: Unity 内建的Mesh,多边形的数量比较大,如果物体不要求特别圆滑,导入其他的简单3D模型代替。

8)、优化数学计算
例如: 如果可以避免使用浮点型(float),尽量使用整形(int),尽量少用复杂的数学函数比如 Sin 和 Cos 等等。

9)、减少固定增量时间
例如: 将固定增量时间值设定在0.04-0.067区间(即,每秒15-25帧); 你可以通过 Edit --> Project Settings --> Time 来改变这个值 。
         这样做可以降低 FixedUpdate  函数被调用的频率以及物理引擎执行碰撞检测与刚体更新的频率;假如你使用了较低的固定增量时间
         并且在主角身上使用刚体部件,那么你可以启用插值办法来平滑刚体组件。

10)、减少 GetComponet 的调用
例如: 使用 GetComponet 或者内置组件访问器会产生明显的开销;你可以通过一次获取组件的引用避免开销,并将该引用分配给一个
         变量(有时称为"缓存"的引用)。如:
         void Update()
         {
             transform.Translate(0,1,0);
         }
改为:
        private  Transform myTransform;
         void Awake()
        {
             myTransform = transform;
        }
         void Update()
        {
             myTransform .Translate(0,1,0);
        }

例如: 你应该避免分配新的对象,除非你真的需要,因为对象不在使用时,会增加垃圾回收系统的开销;你可以经常重复使用数组和其他对象,而不是分配新的数组
         或对象;这样做好处是尽量减少垃圾的回收工作;同时,在某些可能的情况下,你也可以使用结构(struct)来代替类(class);这是因为,结构变量主要存
         放在栈区而非堆区;因为栈的分配较快,并且不调用垃圾回收操作,所以当结构变量比较小时可以提升程序的运行性能;但是当结构体较大时,虽然它仍可避
         免分配/回收的开销,而它由于"传值"操作也会导致单独的开销,实际上它可能比等效对象类的效率还要低。

分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

关闭

站长推荐上一条 /1 下一条

手机版|纳金网 ( 闽ICP备08008928号

GMT+8, 2024-5-6 07:10 , Processed in 0.086525 second(s), 29 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部