2017-07-17 69 views
0

我整天都在搜索大量问题,但似乎找不到解决我的问题的答案,所以我希望有人能帮助我。为什么多个Unity协同程序加速www图像加载?

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

  • GameObject1与脚本Loader.cs(调用启动协程)

  • GameObject2与脚本Loader.cs(调用启动协程)

  • GameObject3与脚本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();,但它没有帮助,我也不知道如何在加载新图像时取得一个固定的速度,独立同时有多少流/协同程序? 我希望我很明白我的意思,并感谢任何帮助!

+1

你的问题是不完整的......多重协同程序在哪里?你的意思是你在一帧中多次调用'Load'? – Programmer

+0

@程序员对不起,我编辑了我的问题来澄清。同一个脚本在场景中多次出现,每次调用一次协程(在协程中它会循环加载/流式传输) – user3647967

+0

这是一个疯狂的事情,特别是当每个协程函数有'while'循环时,这意味着他们3个协程正在尽快更新映像。也许有更好的方法来做到这一点。流的来源是什么?这是什么类型的流? – Programmer

回答

0

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

使用协同API和WWW API可以在访问输出(图像)之前等待该请求完成。基本上,您有3个永久运行的协程。当每个人下载图像时,另一个可能会上传已下载的图像到Texture2D

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

你有两个选择:

。使用新的统一的UnityWebRequestDownloadHandlerScript扩展。

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

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

。使连接到URL

.Read从该流

.Search用于随后字节0xFF通过0xD8

。当你找到字节0xFF,然后是0xD8,开始读取流并保持s把它们转换成一个字节数组/列表。

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

。当您找到字节0xFF后跟0xD9时,停止读取。现在

。您的JPEG图像是字节数组从0xFF构造,0xD8随后整个byte阵列从步骤#4然后0xFF0xD9

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

.Jump回到步骤#3和不断重复的是,由于除非服务器已关闭流没有结束。

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