Unity3D,在iOS中收益返回www阻止主线程

时间:2015-07-03 06:47:16

标签: ios web unity3d coroutine

在通过Unity3D创建iOS 64支持构建期间,我遇到了一个奇怪的情况, yield return www call阻止了设备上的主线程。

我尝试了Unity版本4.6.5,4.6.6和5.1.0,并遇到了与WWW类相同的问题。 我也尝试过xCode版本6.3.0,6.3.1,6.3.2。

以下是我正在使用的代码段

private IEnumerator StartDownload(string url, string path)
{
    WWW www = new WWW(url);
    yield return www; //blocking main thread
    if (string.IsNullOrEmpty(www.error))
    {
        Debug.Log("File Download Complete");
    }
    else
    {
        Debug.Log("Error in downloading file, Error: " + www.error);
    }
}

2 个答案:

答案 0 :(得分:0)

唯一方式我可以设想它阻止主线程,如果你没有正确地称它为Coroutine ......

正确的电话:

void Start()
{
    StartCoroutine(StartDownload("http://google.com", ""));
}

然后调用deferred(在主线程中),但不会阻塞线程。它将被轮询,直到完成。

错误的方式(将阻止主线程):

void Start()
{
    IEnumerator a = StartDownload ("http://google.com", "");
    while (a.MoveNext()) {}
}

答案 1 :(得分:0)

我从来没有看到yield return www;阻止整个下载,但我确实遇到了这个:

  • 如果您正在下载大型资产(超过几个meg)
  • 并且具有快速的互联网连接(超过2 MB / s)
  • 你会看到UI线程冻结

这种情况正在发生,因为即使下载发生在另一个线程上,当Unity将数据从下载缓冲区复制到最终位置时,复制也会完成UI线程,如果磁盘操作超过2 MB / s,那么线程被阻止。

该错误发生在iOS的Unity WWW实现中。 如果是这种情况,我可以为您提供修复此问题的更改。