Unity3d:后台网络活动和Unity Run Loop

时间:2012-08-24 18:15:48

标签: android ios networking background unity3d

我们正在寻找一种方法,可以“在后台同时”下载我们的游戏即将需要的各种资源。我们的要求是:(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.threadPriority - 我们不想使用WWW,所以这是静音。
  • Application.backgroundLoadingPriority - 由于我们没有使用Unity组件(如AssetBundles)进行下载,我假设这没有效果?
  • YieldInstructions,例如WaitForSeconds和WaitForFixedUpdate - 我的理解是这些都相当愚蠢。它们在计划运行时运行,并且不符合Unity Run Loop的需要吗?

我们希望了解的内容: - WWW真的充满了问题,还是只是我们对组件的使用? - 有没有人成功使用过具有Unity应用程序的HttpWebRequest?他们是以线程方式完成的吗? - Unity中是否存在“中断”或“优先级”架构,以便后台任务可以很好地与Unity Runloop一起使用而不会引起故障或竞争?

1 个答案:

答案 0 :(得分:0)

如果您不想使用WWW,快速谷歌搜索发现this女巫可能会工作。我之前使用过system.net中的webclient,但不是在统一内部,但我知道有异步下载,我用它here

webclient示例:

WebClient webClient = new WebClient();

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