【问题标题】:Thread safety in UnityUnity 中的线程安全
【发布时间】:2019-02-03 15:11:26
【问题描述】:

在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 编辑器上运行代码时,它确实会引发异常。但是,当我直接在Android手机上运行这段代码时,它并没有抛出任何异常,并且代码执行正确。

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 在这种情况下有效?

【问题讨论】:

  • "在 BeginReceive 等一些异步函数中" C# 中有很多异步函数。你试的是哪一款?你在做什么需要你使用另一个线程?
  • 我只是想知道BeginReceive应该是一个线程,但是我可以使用UnityEngine提供的方法,也不例外。
  • 从哪里开始接收?哪一堂课?其中有许多来自不同的 C# API/类。
  • 来自 System.Net.Scotets 的套接字
  • 你没有包含你的代码,所以我不知道发生了什么,但如果你没有看到异常,这只是意味着代码没有在另一个线程上运行。至于在另一个线程中调用/使用 Unity API,看看这个post

标签: multithreading unity3d


【解决方案1】:

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

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

如果调用 UnityEngine API 有效,那么您就在主线程上。

【讨论】:

  • 我尝试调用函数Debug.Log(Thread.CurrentThread.ManagedThreadId) 来检查两个函数中的线程ID,这是不同的。我给出了上面的演示代码,你能告诉我为什么吗?
  • 我只能在 Windows 上测试代码 - 它给出了不同线程 ID 和错误的预期结果。
  • 我在我的安卓手机上运行这个并附上上面的日志。
【解决方案2】:

不允许从与 UI 线程不同的线程调用 UI API。

这简化了 Unity 在幕后的工作方式,实际上提高了速度。

一些异步方法是使用事件循环而不是不同的线程来调度的。仅仅因为方法是异步的,并不意味着它可以在不同的线程上运行。

Unity 中最明显的例子是协程。它们确实运行异步,但在主线程上。这是可能的,因为 Unity 将所有内容添加到列表中并在每一帧执行它们。

【讨论】:

    【解决方案3】:

    您可以从其他线程调用 Unity API,但如果您是从 Unity 编辑器中运行游戏,则不能。发布版本不检查对 Unity API 的调用源自哪个线程。我认为他们不会费心避免性能下降。

    不过,我自己还没有测试过这么多。 Unity 文档非常清楚 API 不是线程安全的。因此,绝对不要进行任何从其他线程更改游戏状态的属性分配或调用。仅仅读取值可能没问题,但这取决于 UnityEngine 未知的内部缓存行为,即。哈希表/字典不适合多线程。

    【讨论】:

      猜你喜欢
      • 2010-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-30
      • 2016-05-05
      相关资源
      最近更新 更多