首页 文章

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

提问于
浏览
4

我们正在寻找一种方法来“在后台同时”下载我们的游戏将很快需要的各种资源 . 我们的要求是(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

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

    webclient示例:

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

相关问题