我整天搜索了很多问题,但我似乎没有找到适合我的问题的答案,所以我希望有人可以帮助我。
我想在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();
,但它没有帮助,我不知道如何在加载新图像时实现常规速度,独立多少流/协同程序我有同一时间吗?
我希望它清楚我的意思和任何帮助表示赞赏!
答案 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流时,请继续搜索字节0xFF
和0xD9
。
6 。当您找到后跟0xFF
的字节0xD9
时,请停止阅读。
7 。您的jpeg图片现在是从0xFF
构建的字节数组,0xD8
后跟步骤#4中的整个byte
数组然后0xFF
,0xD9
。
8.最后,使用Texture2D.LoadImage
将字节数组加载到Texture2D并将其显示在屏幕上。
9 。回到步骤#3 并继续重复,因为除非服务器关闭,否则流没有结束。
如果您遇到问题,可以随时使用此答案创建的代码创建新帖子。 Here是一个帖子,也应该让你说明。