Unity3D,在iOS中生成返回www阻塞主线程

Unity3D,在iOS中生成返回www阻塞主线程,ios,web,unity3d,coroutine,Ios,Web,Unity3d,Coroutine,在通过Unity3D创建iOS 64支持构建时,我遇到了一个奇怪的情况, 屈服返回www调用正在阻塞设备上的主线程 我尝试了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 ret

在通过Unity3D创建iOS 64支持构建时,我遇到了一个奇怪的情况, 屈服返回www调用正在阻塞设备上的主线程

我尝试了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);
    }
}
我能想到的阻止主线程的唯一方法是,如果您没有正确地将其称为协程

正确呼叫:

void Start()
{
    StartCoroutine(StartDownload("http://google.com", ""));
}
然后,调用将延迟运行(在主线程中),但不会阻塞线程。它将被轮询,直到完成为止

不正确的方式(将阻塞主线程):

我能想到的阻止主线程的唯一方法是,如果您没有正确地将其称为协程

正确呼叫:

void Start()
{
    StartCoroutine(StartDownload("http://google.com", ""));
}
然后,调用将延迟运行(在主线程中),但不会阻塞线程。它将被轮询,直到完成为止

不正确的方式(将阻塞主线程):


我从来没有见过一个
收益率阻止整个下载,但我确实遇到了以下问题:

  • 如果您正在下载大型资产(超过两个兆欧)
  • 并且具有快速的internet连接(超过2 MB/s)
  • 您将看到UI线程冻结
发生这种情况的原因是,当Unity将数据从下载缓冲区复制到最终位置时,即使下载发生在不同的线程上,复制也是通过UI线程完成的,如果磁盘操作超过2 MB/s,则线程被阻塞

该漏洞存在于iOS的Unity
WWW
实现中。
如果这是你的情况,我可以向你提供我为解决这个问题所做的更改

我从未见过
收益率阻止整个下载,但我确实遇到了以下问题:

  • 如果您正在下载大型资产(超过两个兆欧)
  • 并且具有快速的internet连接(超过2 MB/s)
  • 您将看到UI线程冻结
发生这种情况的原因是,当Unity将数据从下载缓冲区复制到最终位置时,即使下载发生在不同的线程上,复制也是通过UI线程完成的,如果磁盘操作超过2 MB/s,则线程被阻塞

该漏洞存在于iOS的Unity
WWW
实现中。
如果这是你的情况,我可以向你提供我为解决这个问题所做的更改

您好@peterept我正在使用start例程(StartDownload(“,”);问题在于,在安卓系统中,只有iOS版的Unity Editor可以完美运行相同的代码。任何关于iOS的帮助。请检查我一直在iOS上构建的示例代码,并使用您提到的所有Unity版本。(虽然在Xcode上不是您提到的6.3版本)。但我建议,如果iOS上出现协同程序,将会有很多应用程序受到影响。你能澄清一下你所说的“阻止主线”是什么意思吗?阻塞意味着什么也不运行,您可以通过在调试器中按pause轻松地检查它。但也许你只是被时间设置“冻结”了。时间刻度=0?你好@peterept。我不知道我做错了什么,但是在Unity版本4.6.2之前,同样的代码一直在工作,在更新到版本4.6.5之后,我们遇到了这个问题。对于高达2MB的小文件没有问题,但如果我启动文件大约20MB。帧速率一直保持到缓存未完成。请看一下代码。我主要关心的是资产包缓存,当我调用yield return WWW.LoadFromCacheOrDownload(path,1)时,帧速率会冻结几秒钟,感谢链接。问题是,您有一个50MB的资产捆绑包,其中包含3235个资产,Unity在解析捆绑包时需要时间来保存该文件并处理索引。要保存如此大的文件,您可以将其分块编写,或者将包拆分为多个包;问题在于,在安卓系统中,只有iOS版的Unity Editor可以完美运行相同的代码。任何关于iOS的帮助。请检查我一直在iOS上构建的示例代码,并使用您提到的所有Unity版本。(虽然在Xcode上不是您提到的6.3版本)。但我建议,如果iOS上出现协同程序,将会有很多应用程序受到影响。你能澄清一下你所说的“阻止主线”是什么意思吗?阻塞意味着什么也不运行,您可以通过在调试器中按pause轻松地检查它。但也许你只是被时间设置“冻结”了。时间刻度=0?你好@peterept。我不知道我做错了什么,但是在Unity版本4.6.2之前,同样的代码一直在工作,在更新到版本4.6.5之后,我们遇到了这个问题。对于高达2MB的小文件没有问题,但如果我启动文件大约20MB。帧速率一直保持到缓存未完成。请看一下代码。我主要关心的是资产包缓存,当我调用yield return WWW.LoadFromCacheOrDownload(path,1)时,帧速率会冻结几秒钟,感谢链接。问题是,您有一个50MB的资产捆绑包,其中包含3235个资产,Unity在解析捆绑包时需要时间来保存该文件并处理索引。为了保存这么大的文件,你可以自己编写成块,或者将包拆分成多个包。我编写的代码在Android和Unity Editor中运行良好,只在iOS中产生问题。我主要关心的是资产包缓存,当我调用yield return WWW.LoadFromCacheOrDownload(path,1)时,帧速率冻结几秒钟,资产包大小分别为18和22 MB。查找示例代码是的,它只发生在iOS上,因为iOS上的实现不同。我已经反编译了android的WWW源代码,实现会解决这个问题,这就是为什么您没有problem@RaduDita你的解决办法是什么?要不要寄出去?那真的很有帮助!我可以挖掘我所做的修复,但它们与最新的Unity版本不兼容。负责复制数据的代码已从封闭源dll中的objective-c中移走