Unity核心原理(1)生命周期

游戏物体生命周期

  • 场景中的游戏物体通过脚本来控制其具体行为。
  • 生命周期流程图:点击跳转
  • 脚本里重点事件函数:
    • Awake:游戏物体实例化后并处于激活状态时调用,即使脚本组件没有激活也会调用,而且总是在Start()函数之前调用
    • OnEnable:游戏物体与脚本组件激活时调用(会反复触发)
    • Start:游戏物体与脚本组件处于激活状态,在Update()运行前调用(只调用一次,当物体关闭激活状态,再打开时不会反复触发)
    • FixedUpdate:根据设定的帧率运行(帧率固定,主要用于刚体运算,存在平衡机制去约束)
    • Update:每帧调用一次(帧率不固定,与硬件性能以及逻辑复杂度相关)
    • LateUpdate:每帧调用一次,在Update()之后调用
    • OnDisable:游戏物体/脚本组件关闭激活时调用(会反复触发)
    • OnDestroy:当游戏物体销毁时调用

 

  • 注意:在一个场景加载以后,场景当中的每个物体都会遵循上述原则去运行物体上挂载脚本的函数

核心要素

  • OnEnable/OnDisable可以反复触发
  • Awake/Start始终只触发一次
  • FixedUpdate运行帧率由:Edit-Project Settings-Time-Fixed Timestep的值决定 注:每秒运行帧率相等不代表运行时间相等。可通过Time.realtimeSinceStartup测试出来每次FixedUpdate()调用时间间隔是不一样的。
  • 为保证FixedUpate的固定帧率,通过设置Edit-Project Settings-Time Maximum Allowed Timestep来实现平衡机制,限定每次FixedUpdate()运行的最长时间。实现效果与性能的平衡。

帧循环/主线程概念

  • 为了保证数据安全,Unity核心的游戏逻辑全部都是在一个线程里完成。也就是我们常说的Unity主线程。 在主线程上运行一次完整的游戏逻辑帧我们称之为完成了一次帧循环,也称为主循环。
  • 注意几点:
    • 一个逻辑帧我们通常是指一次包含了以Update()为主的循环调用过程。因为我们游戏的逻辑大部分都是运行在Update()里面。
    • 一个逻辑帧里面可能包含了多次FixedUpdate()的调用。
    • Unity中是可以使用多线程的,但需要注意在Unity里一些关键性的数据在其它线程是不能访问修改的。
    private void Start() {
        ThreadStart threadStart = new ThreadStart(ThreadMain);
        Thread thread = new Thread(threadStart);
        thread.Start();
        Debug.Log("UnityMain线程ID:" + Thread.CurrentThread.ManagedThreadId.ToString());
    }

    void ThreadMain() {
        Debug.Log("New线程ID:" + Thread.CurrentThread.ManagedThreadId.ToString());
        //运行会报错:get_transform can only be called from the main thread.
        Debug.Log(transform.gameObject.name);
    }

 

  • Unity限制使用多线程的原因:
    • 保证数据安全
    • 降低编程难度
  • 为何还能保持高效率的运行?
    • Unity在底层实现了线程池,引擎底层来实现一些可使用多线程处理的任务

注意:本内容来自:https://zhuanlan.zhihu.com/p/55287195 

你可能感兴趣的:(Unity基础)