为什么多个Unity协程可以加速www图片加载?
Why do multiple Unity coroutines speed up www image loading?
我一整天都在谷歌上搜索了很多问题,但我似乎没有找到适合我问题的答案,所以我希望有人能帮助我。
我想在一个Unity场景中显示多个图像流。我有几个带有加载脚本的游戏对象,例如
GameObject1 with script Loader.cs(在 Start 中调用协程)
GameObject2 with script Loader.cs(在 Start 中调用协程)
GameObject3 with script Loader.cs(在 Start 中调用协程)
并在此脚本中通过协程加载我的图像:
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流的同时,继续搜索字节0xFF
和0xD9
。
6。当您发现字节 0xFF
后跟 0xD9
时,停止读取。
7。您的 jpeg 图像现在是从 0xFF
、0xD8
构造的字节数组,后跟来自步骤的整个 byte
数组#4 然后 0xFF
, 0xD9
.
8.Finally,使用Texture2D.LoadImage
将字节数组加载到Texture2D中并显示到屏幕上。
9。跳回到步骤 #3 并继续重复,因为除非服务器关闭,否则流不会结束.
如果您 运行 遇到问题,您可以随时使用根据此答案制作的代码创建一个新的 post。 Here 是一个 post 也应该让你陈述。
我一整天都在谷歌上搜索了很多问题,但我似乎没有找到适合我问题的答案,所以我希望有人能帮助我。
我想在一个Unity场景中显示多个图像流。我有几个带有加载脚本的游戏对象,例如
GameObject1 with script Loader.cs(在 Start 中调用协程)
GameObject2 with script Loader.cs(在 Start 中调用协程)
GameObject3 with script Loader.cs(在 Start 中调用协程)
并在此脚本中通过协程加载我的图像:
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流的同时,继续搜索字节0xFF
和0xD9
。
6。当您发现字节 0xFF
后跟 0xD9
时,停止读取。
7。您的 jpeg 图像现在是从 0xFF
、0xD8
构造的字节数组,后跟来自步骤的整个 byte
数组#4 然后 0xFF
, 0xD9
.
8.Finally,使用Texture2D.LoadImage
将字节数组加载到Texture2D中并显示到屏幕上。
9。跳回到步骤 #3 并继续重复,因为除非服务器关闭,否则流不会结束.
如果您 运行 遇到问题,您可以随时使用根据此答案制作的代码创建一个新的 post。 Here 是一个 post 也应该让你陈述。