我们正在寻找一种方法,可以“在后台同时”下载我们的游戏即将需要的各种资源。我们的要求是:(1)最大可能的下载速度,(2)最小可能中断正在推动游戏的“前景”Runloop活动,(3)该解决方案在我们感兴趣的所有主要平台(Android / iOS)上运行得非常好/ PC / Mac),以及(4)没有使解决方案变得虚弱的错误。
如果我们不满足要求#1,那么游戏必须停止并让用户等到后台下载赶上并提供必要的资源。如果我们不符合要求#2,则后台下载会对游戏的播放方式产生负面影响,使其变得生涩或反应迟钝等。
我们已经尝试并研究了各种方法,包括资产包,WWW和本地C#HttpWebRequest,其中没有满足我们的所有要求。详情如下。
如果您已经想出如何解决这个问题,我们很乐意与您聊天,因为我们宁愿不重新发明轮子。
以下是我们迄今为止的经验详情:
我们在Unity中构建了一个Android应用程序 - 最终也可以通过iOS获得。除了正常的前台活动外,我们还有一个后台低优先级活动,即下载应用程序在前台使用的各种资源。
(在你问之前,资产套餐对我们不起作用 - 除非最近发生任何变化 - 它们不能在不同版本的Unity上运行 - 即Unity 3.4的资产包在Unity 3.5中不起作用。所以升级用户必须重新下载所有资产。)
不幸的是,我们发现了许多使用'WWW'组件的恼人错误。这些包括在网络丢失时不更新,并且没有来自Web请求的返回值(即“发布”)。因此,我们希望用本地C#HttpWebRequest替换我们对WWW的使用。不幸的是,我们发现在主要的Unity Runloop中使用这个组件通过一个协同例程导致runloop停止并且UI被冻结。
但是将相同的代码放在后台C#线程(不是协同例程)中,然后轮询该线程的活动似乎确实有效。
我们不喜欢这种方法,因为这确实允许我们将此活动安排在远离Unity调度程序的地方。我们希望网络(和相关的CPU)活动在Unity Run Loop中的适当间隙中运行。但据我们所知,我们只有三种方式可以指定优先级:
我们希望了解的内容: - WWW真的充满了问题,还是只是我们对组件的使用? - 有没有人成功使用过具有Unity应用程序的HttpWebRequest?他们是以线程方式完成的吗? - Unity中是否存在“中断”或“优先级”架构,以便后台任务可以很好地与Unity Runloop一起使用而不会引起故障或竞争?
答案 0 :(得分:0)