gpt4 book ai didi

multithreading - Unity 中的线程安全

转载 作者:行者123 更新时间:2023-12-03 13:17:05 35 4
gpt4 key购买 nike

在Unity中,线程无法操作UnityEngine提供的对象,如transform.position等,导致get_transform只能从主线程调用的异常。但是,这些方法可以在一些异步函数中使用,比如 BeginReceive,所以有谁能告诉我为什么吗?异步函数不是线程还是其他?

我试试下面的代码:

void Start(){
AsyncCallback callback = new AsyncCallback (demo);
callback.BeginInvoke (null, null, null);
}

void demo(IAsyncResult result){
Debug.Log(Thread.CurrentThread.ManagedThreadId);
Debug.Log(gb.transform.position.ToString());
}

当我在 Unity Editor 上运行代码时,确实会抛出异常。然而,当我直接在安卓手机上运行这段代码时,它并没有抛出任何异常,代码执行正确。

applogcat 中的日志显示:

Line 13497: 02-20 14:37:49.973 31027 31697 I Unity   : 3
Line 13501: 02-20 14:37:49.975 31027 31697 I Unity : (0.0, 0.0, 0.0)

所以看起来该函数在另一个线程而不是主线程上运行,所以谁能告诉我为什么 transform 在这种情况下起作用?

最佳答案

Unity 不允许从主线程以外的线程调用大多数 API 函数。所有的事件/消息处理实际上都是在主线程上完成的。

基于 IEnumerator 的协程系统有点 hack,实际上不允许多线程(请记住,即使是 .NET 4.5 async/await 功能也不一定暗示多线程执行)。

如果调用 UnityEngine API 有效,则说明您在主线程上。

关于multithreading - Unity 中的线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42266890/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com