android - Unity3d:后台网络 Activity 和 Unity Run Loop

标签 android ios networking background unity3d

我们正在寻找一种方法来“在后台同时”下载我们的游戏“很快”需要的各种资源。我们的要求是 (1) 最大可能的下载速度,(2) 对驱动游戏的“前台”Runloop Activity 的最小可能干扰,(3) 该解决方案在我们感兴趣的所有主要平台(Android/iOS)上运行得非常好/PC/Mac),以及 (4) 没有削弱解决方案的错误。

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

我们尝试并研究了各种方法,包括 Asset Bundles、WWW 和 native C# HttpWebRequest,但没有一种方法满足我们的所有要求。详情如下。

如果您已经想出如何解决这个问题,我们很乐意与您交谈,因为我们不想重新发明轮子。

以下是我们迄今为止的详细体验:

我们有一个在 Unity 中构建的 Android 应用程序 - 最终也可以通过 iOS 使用。除了正常的前台 Activity 外,我们还有一个后台低优先级 Activity ,用于下载前台应用程序使用的各种资源。

(在你问之前,Asset Bundles 对我们不起作用,因为 - 除非最近发生任何变化 - 它们不适用于不同版本的 Unity - 即 Unity 3.4 的 Assets 包在 Unity 3.5 中不起作用。所以升级用户将不得不重新下载所有 Assets 。)

不幸的是,我们在使用“WWW”组件时发现了一些烦人的错误。这些包括在网络丢失时不更新,以及网络请求(即“发布”)没有返回值。因此,我们希望用 native C# HttpWebRequest 替换我们对 WWW 的使用。不幸的是,我们发现通过协程在主 Unity Runloop 中使用此组件会导致 runloop 停滞和 UI 卡住。

但是将相同的代码放在后台 C# 线程(不是协同例程)中然后轮询该线程的 Activity 似乎确实有效。

我们不喜欢这种方法,因为它确实允许我们安排与 Unity 调度程序协调的 Activity 。我们希望网络(和​​关联的 CPU) Activity 在 Unity 运行循环中的适当间隙运行。但据我们所知,只有三种方法可以指定优先级:

  • WWW.threadPriority - 我们不想使用 WWW,所以这是静音。
  • Application.backgroundLoadingPriority - 由于我们没有使用 Unity 组件(如 AssetBundles)进行下载,我假设这没有效果?
  • YieldInstructions 例如WaitForSeconds 和 WaitForFixedUpdate - 我的理解是它们相当愚蠢。它们在计划运行时运行并且不遵从 Unity Run Loop 的需要?

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

最佳答案

Google 快速搜索发现 this如果您不想使用 WWW,女巫可能会起作用。 system.net 中还有我以前使用过但不在 unity 内部的 webclient,但我知道它有一个异步下载,我用过它 here

网络客户端示例:

WebClient webClient = new WebClient();

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

关于android - Unity3d:后台网络 Activity 和 Unity Run Loop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12114642/

相关文章:

android - 如何在 ListView 周围放置边框?

android - 更改密码屏幕。我们是否应该始终要求使用旧密码?

android - 在Google Play中降级应用程序? (Android市场)

ios - UIImagePickerController 在 iOS 设备上工作但不在 iOS 模拟器上工作?

ios - 为什么我的 UIButton segue 的行为不像 UITableViewCell segue?

ios - 在 Swift 中使用 for-in 创建字符串数组

python - 如何防止VLAN标记从套接字接收的数据包中剥离?

android - 从 Android 将联系人插入 SIM

python - 为什么 raw_input 提示不正确?

android - 逆转 Android Market 应用程序网络流量