为什么多个Unity协程会加速www图像加载?

时间:2017-07-17 20:28:53

标签: c# image unity3d coroutine image-loading

我整天搜索了很多问题,但我似乎没有找到适合我的问题的答案,所以我希望有人可以帮助我。

我想在Unity场景中显示多个图像流。我有几个附加了加载脚本的GameObjects,例如

  • 带有脚本Loader.cs的GameObject1(在开始时调用coroutine)

  • 带有脚本Loader.cs的GameObject2(在开始时调用coroutine)

  • 带有脚本Loader.cs的GameObject3(在开始时调用coroutine)

并在此脚本中通过协程加载我的图像:

IEnumerator Load()
{
   Texture2D tex = new Texture2D(4, 4, TextureFormat.DXT1, false);
   while (true)
   {
      WWW www = new WWW(url);
      yield return www;                
      www.LoadImageIntoTexture(tex);
      img.texture = tex;
   }
}

(其中img.texture是我在场景中的图像,url是我从中加载的网址)。

这适用于加载图像,但我注意到一旦启动更多协程,图像加载/流速就会更快。为了澄清,如果我有1个图像流,它会以一定的速度更新图像但是如果我有,例如3个图像流(每个都有一个用于加载的协程)突然所有3个流加载图像的速度比1个流加快。

我尝试在协程的末尾添加yield return new WaitForFixedUpdate();,但它没有帮助,我不知道如何在加载新图像时实现常规速度,独立多少流/协同程序我有同一时间吗? 我希望它清楚我的意思和任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:0)

启动多个协同程序会更快地更新映像,因为您所拥有的是从不同的线程在不同时间下载映像。 WWW API的原生端是使用Threads实现的。请注意,协程与Thread不同。

WWW API中使用协同程序是为了能够在访问输出(图像)之前等待WWW请求完成。基本上,你有3个协同程序永远运行。当每个人都在下载图片时,另一个人可能会将已下载的图片上传到Texture2D

无论如何,这是正确的流式传输方式。 WWW API 无法用于此目的。它可能看起来不错,但它是一个糟糕的黑客。

您有两种选择:

1 。使用新的Unity UnityWebRequest及其DownloadHandlerScript扩展名。

2 。使用带有HttpWebRequest的C#标准Thread API,然后使用this技术将结果发送到主线程。

无论您选择哪个选项,从jpeg读取的技术仍然保持不变。

1 。建立与网址的连接

2 。从该流中读取

3 。搜索字节0xFF后跟0xD8

4 。当您找到后跟0xFF的字节0xD8时,请开始读取流并将其存储到字节数组/列表中。

5 。在阅读jpeg流时,请继续搜索字节0xFF0xD9

6 。当您找到后跟0xFF的字节0xD9时,请停止阅读。

7 。您的jpeg图片现在是从0xFF构建的字节数组,0xD8后跟步骤#4中的整个byte数组然后0xFF0xD9

8.最后,使用Texture2D.LoadImage将字节数组加载到Texture2D并将其显示在屏幕上。

9 。回到步骤#3 并继续重复,因为除非服务器关闭,否则流没有结束。

如果您遇到问题,可以随时使用此答案创建的代码创建新帖子。 Here是一个帖子,也应该让你说明。