网络播放器流处理

网络播放器流处理 (Web Player Streaming) 对于为终端用户提供 出色的游戏体验来说至关重要。网络游戏背后的理念是用户几乎可马上查看内容,尽快开始玩游戏,而不是长时间等进度条。这点很容易实现,说明如下。

门户优化

该部分将重点讲述向在线游戏门户发布游戏的内容。流对所有内容都有用,可轻松应用到许多其他情况。

在线游戏门户希望一些形式的游戏可以真正从下载完 1MB 数据后开始。如果无法做到,门户接受游戏内容的可能性会大大降低。从用户的角度看,游戏须尽快开始。否则就是在浪费他的时间,他还有可能关闭窗口。

在 128KB 的网线速率下,每秒可下载 16KB 或每分钟下载 1MB。这是在线门户的低端宽带目标。

游戏会优化设置为流,如:

  1. 50 KB 显示徽标和菜单(4 秒)
  2. 320 KB 供用户玩一个小教程关卡或进行菜单中的一些有趣互动(20 秒)
  3. 800 KB 让用户玩第一个小关卡(50 秒)
  4. 完成下载整个游戏的 1-5 MB(1-5 分钟)

要注意的关键点在于考虑网速较慢的用户的等待时间。永远不要让用户等。

如果目前的网络播放器为 10 MB,那么也不要惊慌。看起来优化的难度很大,实际上只要少许努力,通常很容易就可以让游戏具有这种结构。将以上每个步骤看作一个单独的场景。如果游戏制作完成,就已经做完了最难的部分。根据该加载理念,构建一些场景轻而易举!

如果打开控制台日志(打开编辑器日志 (Open Editor Log) 按钮位于控制台 (Console) 窗口(桌面平台 (Desktop Platforms)));构建后或构建期间点击帮助 (Help) -> 打开编辑器控制台日志 (Open Editor console log) 菜单 OSX),可看到每个单独场景文件的大小。控制台会显示类似下文的内容:

***Player size statistics***
Level 0 'Main Menu' uses 95.0 KB compressed.
Level 1 'Character Builder' uses 111.5 KB compressed.
Level 2 'Level 1' uses 592.0 KB compressed.
Level 3 'Level 2' uses 2.2 MB compressed.
Level 4 'Level 3' uses 2.3 MB compressed.
Total compressed size 5.3 MB. Total decompressed size 9.9 MB.

该游戏可以使用更多优化!如需更多信息,建议阅读降低文件大小页面

最重要的步骤

  1. 首先加载菜单。显示动画徽标是一种不错的办法,不知不觉时间就已过去,让下载过程继续进行。
  2. 第一个关卡尽量短,不使用过多的资源。这样,第一个关卡就可以快速加载,让玩家玩一到两分钟,确保所有剩余资源在后台下载完成。何不加一个迷你教程关卡,让用户学习游戏的玩法呢?此时不必放入高分辨率纹理或大量对象,或第一个关卡就出现所有敌人。使用最少的多边形数。这意味着设计游戏时必须考虑网络播放器体验。
  3. 游戏开始时没必要出现所有音乐。将音乐外部化并通过 WWW 类进行加载。Unity 使用高质量编解码器 Ogg Vorbis 来压缩音频。可是即使经过压缩,音频依然会占用很大空间。如果音乐有 5 分钟,要压缩到 3 MB 完全是不可能的。必须有所牺牲。加载一段非常短的音轨,循环播放,直至更多音乐下载下来。当玩家沉迷于第一个关卡时才能加载更多音乐。
  4. 使用导入设置 (Import Settings) 来优化纹理。将音乐外部化后,纹理将轻松占用游戏的 90%。典型的纹理对网络部署来说太大。在小浏览器窗口中,有时大纹理一点也不会提高视觉保真度。确保纹理和实际需要的一样大(此时要准备好作出更大牺牲)。将纹理分辨率减半,实际上使纹理只有原来的四分之一大。当然,所有纹理应经过 DXT 压缩。
  5. 通常会降低网络播放器的尺寸。有个手册页面专门列出了 Unity 提供 的优化文件大小的工具,此处。虽然 Unity 使用基于 LZMA 的前沿压缩工具,一般可将游戏数据压缩到未压缩数据的一半或三分之一不等,但是您需要尝试一切可能。
  6. 尽量避免使用 Resources.Load。虽然 Resources.Load 非常方便,但是使用 Resources.Load 时如果是第一次使用资源,Unity 无法对其进行排序,因为任何脚本都可能试图加载该资源。可通过第一个带资源的流关卡 (First Streamed Level With Resources) 属性,在编辑 (Edit)->工程设置 (Project Settings)->播放器 (Player) 中设置哪道关卡将包括可通过 Resources.Load 加载的所有资源。很明显,您希望尽量拖延将 Resources.Load 资源移到游戏中的时间,或根本不使用该功能。

发布流网络播放器

Unity 中的流基于关卡,由一个简单的工作流程来进行设置。Unity 在内部执行跟踪资源并在压缩数据文件中以最佳方式组织起来、根据在第一个场景中使用的顺序排列等所有辛苦工作。用户只需确保构建设置 (Build Settings) 中的第一个关卡使用尽可能少的资源。这自然是针对“菜单关卡 (menu level)”。为了获得较佳的网络体验,需要确保玩家要玩的第一个真正游戏关卡也很小。

为了在 Unity 中使用流,请在构建设置 (Build Settings) 中选择网络播放器流 (Web Player Streamed)。之后,第一个关卡使用的所有资源一旦加载完成,内容将自动开始。尝试将“菜单关卡 (menu level)” 的大小保持在 50-100 KB。流会继续快速加载,同时解压。构建期间/之后,查看控制台可看到大小。

可以按关卡查看流的进度,关卡激活时将进行加载。使用 GetStreamProgressForLevel 显示进度条,使用 CanStreamedLevelBeLoaded 检查是否所有数据可加载到特定关卡。

当然,流的形式是线形的,在大部分情况下与游戏的工作方式相匹配。有时,这样还不够。Unity 还提供 API,以便使用 WWW 类手动加载 .unity3d 文件。视频和音频也可以进行流式处理,几乎可立即开始播放,无需先要求下载影片。最后,就像游戏可能依赖的任何纹理或二进制数据一样,纹理可通过 WWW 类轻松下载。

Page last updated: 2013-07-01