Advertisement

unity性能优化研究

阅读量:

一,你是否还在代码里面直接使用transform呢?

不引用transform

复制代码
  * on click big loop count指的是我鼠标每次点击执行多少次外循环(当前外循环次数为100次),
  * loop count是指内循环次数(当前内循环次数为10万次)。
  * 平均每次测试时间指的是执行1次外循环,也就是执行10万次内循环所花费的时间(也就是下图中被鼠标框选的代码执行10万次的时间)
  * 测试总时长除以已经测试的次数得到平均每次测试时间

可见不引用transform每次测试平均花费24.28ms

      • 这是我的测试时间的代码,用的是stopwatch(图中的sw是指stopWatch sw = new())

引用transform

复制代码
  * 在start方法里面引用了trans=transform
      • 下面我们使用trans每次将花费多少时间,如下图

花费16.08ms

总结,通过对比24.28ms和16.08ms可以得出预先将transform引用将会大大减少运算量。

二,选择合适的方法

复制代码
* 这里我先把position的新位置存起来,再赋值给transform(注意要在start里面先把把物体的位置赋值给zanchun加上下图选中的代码,从此zanchun就相当于物体的位置)
    • 如下图所示,每次只需要10.06毫秒
    • 那么为什么会比刚刚的16.08ms还要少呢?我们把那个+=展开看看!
    • 可以看到这一行代码在等号右边还进行了一次取trans.position的操作,一次这样的操作要比给zanchun赋值消耗大,所以使用zanchun来缓存trans的新位置可以减少一次"."操作达到减少消耗的目的。因此就出现了我们的10.06ms

总结,通过以上分析我们就知道了更新transform.position的较佳方式,先引用transform为trans,然后用zanchun代替transform.position的新位置,就能使原本24.28ms变为10.06ms了!其他的需要写在update里面的方法都可以考虑一下是否能够先引用,是否能减少一些"."操作,这些每一帧都需要执行的方法的优化感觉还有有点必要的。啥?客户叫我们优化一下性能?我们叫客户升级硬件设备!😈

  • ps:本人第一次发文,也不是很懂,然后文中测试的时间可能有些误差但是大体是这样的!有任何问题可以直接提!批评改正都可以!最后附上代码,可以使用按钮button调用里面的showTime方法测试时间。
复制代码
        1. using System.Collections;

    
        2. using System.Collections.Generic;
    
        3. using System.Diagnostics;
    
        4. using UnityEngine;
    
        5.  
    
        6. public class timeTest : MonoBehaviour
    
        7. {
    
        8.     Stopwatch sw = new ();
    
        9.     public int loopCount = 100000;
    
        10.     public int onClickBigLoopCount = 1;
    
        11.     public int 已经测试的次数;
    
        12.     public double 平均每次测试时间, 测试总时长;
    
        13.     public Transform trans;
    
        14.     public Vector3 zanchun;
    
        15.     public Vector3 Vspeed;
    
        16.     public float vx, vy, moveSpeed;
    
        17.     void Start()
    
        18.     {
    
        19.         trans = transform;
    
        20.         zanchun = trans.position;
    
        21.     }
    
        22.     public void showTime()//写入你想要测试的方法
    
        23.     {
    
        24.         for (int j = 0; j < onClickBigLoopCount; j++)
    
        25.         {
    
        26.             sw.Restart();
    
        27.             for (int i = 0; i < loopCount; i++)
    
        28.             {
    
        29.                 zanchun+= Vspeed* Time.fixedDeltaTime;
    
        30.                 trans.position = zanchun;
    
        31.             }
    
        32.             sw.Stop();
    
        33.             已经测试的次数++;
    
        34.             测试总时长 += sw.ElapsedMilliseconds;
    
        35.             平均每次测试时间 = 测试总时长 / 已经测试的次数;
    
        36.             UnityEngine.Debug.Log(sw.ElapsedMilliseconds);
    
        37.         }
    
        38.     }
    
        39.  
    
        40. }

全部评论 (0)

还没有任何评论哟~