2012-08-24 21 views
4

我们正在寻找一种方式来“下载并发”,我们的游戏将很快需要的各种资源。我们的要求是:(1)最大可能的下载速度;(2)尽量减少驱动游戏的“前台”Runloop活动;(3)该解决方案在我们感兴趣的所有主要平台(Android/iOS/PC/Mac)以及(4)没有使解决方案衰弱的缺陷。Unity3d:后台网络活动和Unity运行循环

如果我们不符合要求#1,那么游戏必须停止并让用户等待,直到后台下载赶上并提供必要的资源。如果我们不符合要求2,那么后台下载会对游戏的运行方式产生负面影响,使其变得不稳定或响应速度缓慢等。

我们已经尝试并调查了各种方法,包括资产捆绑, WWW和本地C#HttpWebRequest,而且它们都不符合我们的所有要求。下面的细节。

如果您已经知道如何解决这个问题,我们很乐意与您聊天,因为我们宁愿不重新发明轮子。

这里是我们的经验细节至今:

我们已经建立了统一的Android应用程序 - 最终也可通过iOS版。除了正常的前台活动外,我们还有一个背景低优先级的活动,用于下载应用程序在前台使用的各种资源。 (在你问之前,Asset Bundles对我们不起作用 - 除非最近有什么变化),它们不适用于不同版本的Unity - 也就是说Unity 3.4的资产包在Unity 3.5中不起作用。升级用户将不得不重新下载他们所有的资产。)

不幸的是,我们发现了一些使用'WWW'组件的恼人的错误。这些包括在网络丢失时不更新,并且没有来自web请求的返回值(即'post')。因此,我们正在寻求用本地C#HttpWebRequest替换我们对WWW的使用。不幸的是,我们发现在主要的Unity Runloop中通过一个协同例程使用这个组件会导致runloop失速并且UI冻结。

但是将相同的代码放在后台C#线程(而不是一个协程序),然后轮询该线程的活动似乎工作。

我们不喜欢这种方法,因为这确实使我们能够安排与Unity调度程序一致的此活动。我们希望网络(和​​关联的CPU)活动在Unity Run Loop的适当间隙中运行。但据我们所知,只有三种方式可以指定优先级:

  • WWW.threadPriority - 我们不想使用WWW,所以这是静音。
  • Application.backgroundLoadingPriority - 因为我们没有使用Unity组件(比如AssetBundles)来下载,所以我认为这没有效果?
  • YieldInstructions例如WaitForSeconds和WaitForFixedUpdate - 我的理解是这些都很愚蠢。它们在计划运行时运行并且不遵循Unity Run Loop的需求?

我们正在寻找了解: - 是WWW真的问题充满或者这只是我们所使用的组件? - 有没有人使用HttpWebRequest w/Unity应用程序成功?他们是以线程的方式完成的吗? - Unity中是否有任何“中断”或“优先级”架构,以便后台任务可以在Unity Runloop中良好运行,而不会导致故障或竞争?

+0

你有没有发现一个好的解决方案如果是这样,你能分享吗? – ch3rryc0ke

+0

Unity Player作为单线程运行(只有一个主循环),如果你需要在后台下载线程,你可以使用[Unity插件方法](http://docs.unity3d.com/Documentation/Manual/Plugins.html )。例如,在Android上,您可以创建一个下载活动来配合主要的Unity Player活动。 – Maadiah

回答

0

快速谷歌搜索找到this女巫可能工作,如果你不想使用WWW。还有,我以前而不是内部统一使用的system.net WebClient的,但我知道有一个异步下载,我用它here

WebClient的例子:

WebClient webClient = new WebClient(); 

webClient.DownloadProgressChanged += OnChange; 
webClient.DownloadFileCompleted += OnCompleted; 
webClient.DownloadFileAsync(new Uri(download), fileAndPath);