先上结论: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();
} 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 ();
}

看看结果

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

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

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

Unity FixedUpdate 与 Update 的线程关系实验的更多相关文章

  1. unity中的update、Lateupdate和FixedUpdate。

    MonoBehaviour.Update 更新 当MonoBehaviour启用时,其Update在每一帧被调用. MonoBehaviour.FixedUpdate 固定更新 当MonoBehavi ...

  2. 关于unity中的update、Lateupdate和FixedUpdate

    MonoBehaviour.Update 更新 当MonoBehaviour启用时,其Update在每一帧被调用. MonoBehaviour.FixedUpdate 固定更新 当MonoBehavi ...

  3. Unity进阶----AssetBundle_02(加载依赖关系及网络资源)(2018/10/31)

    网络资源加载: string path ="file://"+ Application.streamingAssetsPath + "\\windows\\123&quo ...

  4. 线程让出实验【RT-Thread学习笔记 4】

    API: rt_thread_yield 线程函数中调用,本线程释放MCU.如果此时有别的相同优先级的任务整处于等待状态,将获得MCU使用权. 线程让出就是给OS增加一个任务调度的机会. 创建两个线程 ...

  5. Java Swing paint repaint update 方法的关系

    Java Swing paint repaint update 方法的关系: 参考:http://blog.csdn.net/xiaoliangmeiny/article/details/691665 ...

  6. Java多线程父子线程关系 多线程中篇(六)

    有的时候对于Java多线程,我们会听到“父线程.子线程”的概念. 严格的说,Java中不存在实质上的父子关系 没有方法可以获取一个线程的父线程,也没有方法可以获取一个线程所有的子线程 子线程的消亡与父 ...

  7. Unity中让Update中的方法执行一次

    Unity中让Update中的方法执行一次 Unity中,很多时候,代码需要放在Update中时刻监测状态,一旦状态符合,又只需要代码执行一次:其实可以通过设置控制量的方式,让代码只执行一次:方法:设 ...

  8. Unity 脚本中update,fixedupdate,lateupdate等函数的执行顺序

    结论 通过一个例子得出的结论是:从先到后被执行的函数是 Awake->Start->FixedUpdate->Update->LateUpdate->OnGUI. 示例 ...

  9. Unity主线程和子线程跳转调用(1)

    Unity除了一些基本的数据类型,几乎所有的API都不能在非unity线程中调用,如果项目中有一段很耗时操作,unity可能会出现“假死”.如果这段操作是和unity无关的,我们可以把这个耗时的操作放 ...

随机推荐

  1. ZOJ3761(并查集+树的遍历)

    Easy billiards Time Limit: 2 Seconds      Memory Limit: 65536 KB      Special Judge Edward think a g ...

  2. find命令笔记

    find 命令: 文件查找:locate:    非实时,模糊匹配,查找是根据全系统文件数据库进行的:# updatedb, 手动生成文件数据库速度快 find:    实时    精确    支持众 ...

  3. VS2015 MVC5项目部署

    刚看到一个年初的一个帖子说VS2015新建的MVC5项目部署后报错,自己捣鼓了一下,发现是Roslyn编译器的错误,简单处理后运行成功,分享如下: 新建一个MVC5的项目,保持不要动,执行以下几个步骤 ...

  4. PHP MySQL 连接数据库 之 Connect

    连接到一个 MySQL 数据库 在您能够访问并处理数据库中的数据之前,您必须创建到达数据库的连接. 在 PHP 中,这个任务通过 mysql_connect() 函数完成. 语法 mysql_conn ...

  5. 在web应用程序中使用MemcachedClient

    本文来自:http://www.cnblogs.com/yukaizhao/archive/2008/11/10/memcached_client_usage.html 一. 背景: 在大访问量的we ...

  6. Web Service中的XFire 传输List 自定义对象.

    我把这个创建的步骤和代码的贴出来,. 首先新建一个工程,取名就随便点啦..MyWebService,然后复制jar包到lib目录下, 创建包,建立接口..写一个javaBean的类, 以下是一个简单的 ...

  7. Effective C++:条款35:考虑virtual函数以外的其它选择

    游戏中的人物伤害值计算问题. (一)方法(1):一般来讲能够使用虚函数的方法: class GameCharacter { public: virtual int healthValue() cons ...

  8. Unity之极光推送

    Android应用中大多数应用使用了推送,游戏中当然也可以使用推送!下面在Unity3D做个测试!(下面是客套话,大家可以忽略) 1.1 什么是推送技术? 推送技术,又名反向AJAX,指的是一种基于I ...

  9. linux查看用户登录信息2-who命令

    who命令与w命令相似,但要比w命令显示更加详细的信息.[root@rusky opt]# man who WHO(1) User Commands WHO(1) NAME who - show wh ...

  10. 【巧妙预处理系列】【UVA1330】City game

    最大子矩阵(City Game, SEERC 2004, LA 3029) 给定一个m×n的矩阵,其中一些格子是空地(F),其他是障碍(R).找出一个全部由F组成的面积最大的子矩阵,输出其面积乘以3后 ...