博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Unity FixedUpdate 与 Update 的线程关系实验
阅读量:5990 次
发布时间:2019-06-20

本文共 1281 字,大约阅读时间需要 4 分钟。

先上结论: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)并执行。

 

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

转载于:https://www.cnblogs.com/softcat/p/6136290.html

你可能感兴趣的文章
Hadoop2.6.0 HDFS HA+YARN 部署
查看>>
live555源码简介
查看>>
webpack入门指南
查看>>
Retrofit 源码解析
查看>>
打造数据科学作品集:用数据讲故事
查看>>
移动端触摸滑动纵向图片滚动小插件~
查看>>
在 Laravel 5 中使用 Laravel Excel 实现 Excel/CSV 文件导入导出功能
查看>>
php处理wsdl
查看>>
yii2中表单的几种写法
查看>>
MATLAB 笔记摘要
查看>>
【译】怎么样构建HTML表单
查看>>
Hello Python pickle
查看>>
“HTTPS”安全在哪里?
查看>>
多图预警丨SegmentFault D-Day 南京站回顾
查看>>
Orange - 基于OpenResty的API Gateway
查看>>
ionic2.0之typescript版的工程搭建
查看>>
PHP项目中CodeIgniter使用的一些建议
查看>>
Vim实战指南(三):高级技巧
查看>>
运维利器 RunDeck v3.0.15 发布, 服务器自动化操作
查看>>
wireshark 抓包使用
查看>>