在Unity线程安全

问题描述 投票:1回答:3

在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());
}

它,当我运行在统一编辑代码抛出异常。然而,当我直接在Android手机上运行此代码,它没有抛出任何异常,并正确地执行代码。

登录应用程序的logcat表明:

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)

如此看来,在功能上的另一线程,而不是主线程运行,因此任何人都可以告诉我为什么在这种情况下,变换的作品?

multithreading unity3d
3个回答
2
投票

团结不允许从非主线程,期间其他线程调用大多数API函数。所有事件/消息处理的其实就是主线程上完成。

基于IEnumerator协程系统是一个黑客位,并不能真正允许多线程(记住,即便是.NET 4.5异步/等待功能并不一定意味着要么多线程执行)。

如果调用API UnityEngine作品,你在主线程上。


1
投票

UI API是不允许从不同的线程比UI一个叫。

这简化了统一的工作方式在幕后,实际上使得它更快。

一些异步方法是使用一个事件循环,而不是在不同的线程调度。仅仅因为一个方法是异步,这并不意味着它得到在不同的线程中运行。

这在Unity最明显的例子是协同程序。他们异步运行,但在主线程上。这是可能的,因为统一将所有的到列表并执行每帧。


0
投票

您可以从其他线程调用API团结,但如果你从Unity编辑器中运行该游戏。发布版本不检查哪个线程调用API统一源于。我想他们也懒得去避免性能受到影响。

我没有太多自己虽然测试这一点。统一的文档是很清楚,API是不是线程安全的。因此,绝对不要做任何财产分配或调用,游戏状态从其他线程改变。仅仅读值可能是好的,但它取决于UnityEngine的未知的内部缓存行为,即。哈希表/字典是坏的多线程。

© www.soinside.com 2019 - 2024. All rights reserved.