测试一下MonoBehaviour自己的Update函数调用消耗
创建20000个物体,每个物体上挂载一个带有MonoBehaviour自己的Update,脚本如下:
public class TestUpdate1 : MonoBehaviour
{
private void Update()
{
float a = 1.513f + 1.5141f;
float b = 1.513f + 1.5141f;
float c = 1.513f + 1.5141f;
float d = a * b / c;
}
}
看看每帧耗时:
每帧大约耗时5毫秒
再来试试把所有的Update集中调用
创建20000个物体,每个物体上挂载一个集中调用的Update,脚本如下:
public class TestUpdate : ComponentBase, IUpdate
{
public void OnUpdate()
{
float a = 1.513f + 1.5141f;
float b = 1.513f + 1.5141f;
float c = 1.513f + 1.5141f;
float d = a * b / c;
}
}
然后使用一个UpdateManager统一调用,代码如下:
public class UpdateManager : SingletonBehaviour<UpdateManager>
{
private List<IUpdate> _updateList = new List<IUpdate>();
/// <summary>
/// 添加更新
/// </summary>
/// <param name="call"></param>
public void Add(IUpdate call)
{
if (!_updateList.Contains(call))
_updateList.Add(call);
}
/// <summary>
/// 移除更新
/// </summary>
/// <param name="call"></param>
public void Remove(IUpdate call)
{
if (_updateList.Contains(call))
_updateList.Remove(call);
}
private void Update()
{
for (int i = 0; i < _updateList.Count; ++i)
_updateList[i].OnUpdate();
}
}
再来看看每帧耗时:
每帧耗时不到1毫秒
说明集中调用确实会比使用MonoBehaviour自己的Update更有效率,同样Awake,Start这些生命周期函数也是一样的,但是这些函数只执行一次,一般可以不用优化.
经过测试,这个耗时差和场景对象数量成正比,数量越多,耗时差就越大.
非常的简单.