zoukankan      html  css  js  c++  java
  • Unity FixedUpdate 与 Update 的线程关系实验

    先上结论:FixedUpdate 与 Update 在同一个线程上。

    实验过程:

    1、打印 FixedUpdate 和 Update 的线程编号

        void FixedUpdate ()
        {
            Debug.Log ("FixedUpdate => " + Thread.CurrentThread.ManagedThreadId);
        }
    
        void Update ()
        {
            Debug.Log ("Update => " + Thread.CurrentThread.ManagedThreadId);
        }

    得到结果如下:

    由此可见,FixedUpdate 和 Update 是运行在同一个线程上的。这样我们在处理 FixedUpdate 的时候,就不需要考虑和 Update 之间线程同步的问题了。

    2、再来,我们把 FixedUpdate 帧率调低到 1 秒

    结果同样是在一个线程上

    3、我们再做个坏事,先把 FixedUpdate 的帧率调回到 0.02,然后在 FixedUpdate 的时候执行 Thread.Sleep(1000)

        void FixedUpdate ()
        {
            Debug.Log ("FixedUpdate => " + Thread.CurrentThread.ManagedThreadId);
            Thread.Sleep(1000);
        }
    
        void Update ()
        {
            Debug.Log ("Update => " + Thread.CurrentThread.ManagedThreadId);
        }

    再执行的时候发现——Update 也同时被 FixedUpdate 阻塞了,整个 Unity 软件的 UI 都一卡一卡的……

    4、再来,我们不睡 FixedUpdate 了,换成睡 Update

        void FixedUpdate ()
        {
            Debug.Log ("FixedUpdate => " + Thread.CurrentThread.ManagedThreadId);
        }
    
        void Update ()
        {
            Debug.Log ("Update => " + Thread.CurrentThread.ManagedThreadId);
            Thread.Sleep (1000);
        }

    看看结果

    线程唤醒后,Unity拼命的执行 FixedUpdate,然后再执行一次 Update。

    由此可以猜想:Unity 在整个生命周期中可能建了一个托管代码执行队列,通过生命周期管理器往这个队列中添加执行方法的 delegate,然后启动一个托管线程循环的取队列中的方法(delegate)并执行。

    希望这个实验对您有帮助。

  • 相关阅读:
    POJ1201 Intervals & TYVJ 1589 西瓜种植 差分约束
    洛谷 P3385 【模板】负环 SPFA
    Test 2018-07-19 二中集训
    《一出好戏》一中高三学子誓师大会后记
    [NOI2012] 迷失游乐园 概率 期望 基环树DP
    codeforces CF983E NN country 树上倍增
    「Luogu P3521 [POI2011]ROT-Tree Rotations」
    「高等数学学习笔记 DAY18」
    「高等数学学习笔记 DAY17」
    「高等数学学习笔记 DAY16」
  • 原文地址:https://www.cnblogs.com/softcat/p/6136290.html
Copyright © 2011-2022 走看看