25.Unity机制生命周期函数问题

25.性能优化-Unity机制问题-生命周期函数


25.1 知识点

生命周期函数的调用顺序

在进行性能调试和问题定位时,如果不了解或忽略生命周期函数的执行顺序,可能会导致调试误判或遗漏真实性能问题。例如:

  1. 错误归因性能开销的位置
    在 Profiler 中看到帧开头有较大开销时,容易误以为是某个 Update() 耗时过长,而实际可能是前面的 Start()OnEnable() 里的初始化造成的。因此不能只关注 Update 部分,也要关注 AwakeOnEnableStart 中的逻辑,因为卡顿有时就是这些初始化逻辑导致的。

  2. 逻辑初始化顺序错乱导致异常
    场景中不同脚本里的同名生命周期函数(如多个脚本的 AwakeStart)的执行顺序默认是不确定的。当两个脚本有依赖关系时(例如 A 依赖 B 的初始化结果),必须保证 A 在使用 B 的数据时,B 已经完成初始化。否则会出现逻辑错误或表现异常。

等等。

需要自定义执行顺序时,可在 Project Settings → Script Execution Order 中设置:将脚本加入自定义顺序列表,通过数值控制是在默认时间之前还是之后执行(负值更早、正值更晚),从上到下依次执行。

不用的生命周期函数

如果在脚本里定义了生命周期函数,但函数体内没有任何逻辑,它们仍然会被 Unity 按生命周期调用,从而带来额外的性能开销。因此要避免在脚本中写空的生命周期函数

尤其要注意那些每帧都会调用的生命周期函数,空实现也会每帧执行一次调用,累积开销更明显:

  1. Update
  2. LateUpdate
  3. FixedUpdate
  4. OnGUI

不需要用时就不要声明这些函数;若曾经用过后来删掉了逻辑,记得把函数本身也删掉。


25.2 知识点代码

Lesson25_性能优化_Unity机制问题_生命周期函数.cs

public class Lesson25_性能优化_Unity机制问题_生命周期函数
{
    #region 知识点一 生命周期函数的调用顺序

    /*
     * 进行性能调试和问题定位时,若不了解或忽略生命周期函数的执行顺序,
     * 可能导致调试误判或遗漏真实性能问题。
     *
     * 例如:
     * 1. 错误归因 —— 帧开头开销可能来自 Start/OnEnable 的初始化,而非 Update;
     *    需同时关注 Awake、OnEnable、Start 中的逻辑。
     * 2. 逻辑初始化顺序错乱 —— 不同脚本中同名生命周期函数的执行时机默认不确定;
     *    若 A 依赖 B 的初始化数据,必须保证 B 先于 A 完成初始化。
     *
     * 需要定义顺序时,在 Project Settings 的 Script Execution Order 中设置。
     */

    #endregion

    #region 知识点二 不用的生命周期函数

    /*
     * 定义了生命周期函数但未写任何逻辑,仍会带来额外性能开销。
     * 应避免写空的生命周期函数;
     * 特别要避免空实现每帧调用的:Update、LateUpdate、FixedUpdate、OnGUI。
     */

    #endregion
}

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏