为什么多个Unity协程可以加速www图片加载?

Why do multiple Unity coroutines speed up www image loading?

我一整天都在谷歌上搜索了很多问题,但我似乎没有找到适合我问题的答案,所以我希望有人能帮助我。

我想在一个Unity场景中显示多个图像流。我有几个带有加载脚本的游戏对象,例如

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

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 是我从中加载的 url。

这对于加载图像效果很好,但我注意到一旦启动更多协程,图像加载/流式传输速度更快。澄清一下,如果我有 1 个图像流,它会以一定的速度更新图像,但如果我有,例如3 个图像流(每个都有一个用于加载的协程)突然间所有 3 个流加载图像的速度都比 1 个流快。

我尝试在协同程序的末尾添加一个 yield return new WaitForFixedUpdate(); 但它没有帮助,我不知道如何在加载新图像时实现规律的速度,独立于多少 streams/coroutines 我有同时吗? 我希望我的意思很清楚,如有任何帮助,我们将不胜感激!

启动多个协同程序可以更快地更新图像,因为您所拥有的是在不同时间从不同线程下载图像。 WWW API 的本机端是用线程实现的。请注意协程与 Thread 不同。

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

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

您有两个选择:

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

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

无论您选择哪个选项,从 jpeg 读取的技术仍然相同。

1。连接到 url

2。从该流读取

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

4。当你找到字节 0xFF 后跟 0xD8 时,开始读取流并继续将它们存储到字节 array/List.

5。在读取jpeg流的同时,继续搜索字节0xFF0xD9

6。当您发现字节 0xFF 后跟 0xD9 时,停止读取。

7。您的 jpeg 图像现在是从 0xFF0xD8 构造的字节数组,后跟来自步骤的整个 byte 数组#4 然后 0xFF, 0xD9.

8.Finally,使用Texture2D.LoadImage将字节数组加载到Texture2D中并显示到屏幕上。

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

如果您 运行 遇到问题,您可以随时使用根据此答案制作的代码创建一个新的 post。 Here 是一个 post 也应该让你陈述。