Skip to main content

Android 内容优化

在 Android 上为 VRChat 创建内容是一项挑战——您需要创建有吸引力且引人入胜的内容,同时保持内容针对移动设备进行优化。这与游戏开发者在构建移动端内容时必须面对的挑战相同。

在此,我们将为您提供一些在 Android 上为 VRChat 构建内容时需要注意的通用指南。

除非另有说明,以下内容将同时适用于 Avatar 和世界。

Unity 有一个优化 VR/AR 体验的指南,其中包含了很多好的建议。

还有这个由 Lucas Rizzotto 制作的优化 VR 内容的优秀视频!它做得非常好,涵盖了我们在此讨论的许多内容。该视频并非由 VRChat 制作,也并非专门针对 VRChat,且包含一些粗俗语言,特此提醒。 本文中的许多项目在该视频中都有涉及。

最后需要注意,此列表中的所有项目都可能发生变更。换句话说,我们尚未完全确定限制和建议,请牢记这一点。

限制执行​

Android 版 VRChat 对 Avatar 内容有若干硬性(和软性)限制。请查看Android 内容限制了解更多信息,以及我们的Avatar 性能排名系统页面了解屏蔽机制的更多细节。

如果您上架了 Avatar 或包含严重超出我们建议的 Avatar 的 Avatar 世界,该世界或 Avatar 可能会被从公开访问中移除。

Unity Profiler​

我们强烈、强烈建议您使用 Unity Profiler。使用性能分析器,您可以量化世界或 Avatar 的各种性能指标的具体数值。特别值得关注的是场景中的绘制调用数量,或某个组件使用的帧时间比例。

当然,在您强大的 PC 上运行性能分析器的结果并不代表在 Android 上的表现,但您仍然可以看出某个组件相对于渲染等消耗了大量帧时间。这些都是相对而言的!

关于如何使用 Unity Profiler 有很多教程,包括 Unity 官方的两个:初学者 Profiler 概述和中级 Profiler 介绍。这些教程是为较旧版本的 Unity 制作的,但仍然很好地涵盖了基本概念。

文件大小​

移动平台的内存是有限的,牢记这一点非常重要。您可以在构建内容后查看资源的大小(在 SDK 中点击"Build & Publish"),并在编辑器日志中搜索"statistics"。您需要关注的是压缩前的大小。

一般来说,避免使用大型(>1k)纹理。它们是内存使用过高的主要元凶。使用顶点颜色和纯色可以极大地帮助减少纹理大小。

请注意,Crunch 压缩对内存占用大小没有帮助!Crunch 压缩仅有助于减小下载大小。您的内容包应在不使用 Crunch 的情况下满足大小限制。

世界

在 Android 版 VRChat 中,构建时压缩后大小超过 100MB 的世界无法上架或访问。

Avatar

您应尽量控制 Avatar 大小在 5-8 MB 以内。在 Android 版 VRChat 中,构建时压缩后大小超过 10MB 的 Avatar 无法上架、穿戴或查看。

三角面数​

在移动平台上保持低三角面数非常重要。即使是性能相当强大的 Quest 移动头显,也存在硬件限制。关注三角面数对保持高性能至关重要。

这些建议通过我们的Avatar 性能排名系统进行技术性强制执行。

世界

在构建世界时,您应尽量保持低三角面数。还需要为用户自己的 Avatar 留出空间。我们建议您为世界总共分配约 250,000 个三角面。

Avatar

适用于世界的通用规则同样适用于 Avatar。请记住,同一个房间内可能有 10 个或更多用户,因此您需要合理分配三角面使用量。我们建议您的 Avatar 控制在 10,000 个三角面以下。

这对于偏好从各种来源导入角色而非自己创建 Avatar 的创作者来说是一个挑战。将模型减面到这一级别可能会造成破坏性影响,您可能需要研究重新拓扑几何体等技术来保持低多边形数量。

网格数量​

这同时适用于世界和 Avatar。

无论使用什么工具,您都应限制内容中使用的网格数量。对于世界中的静态物体,这并不那么重要(由于遮挡剔除的需要),但对于 Avatar,这极为重要。

您的 Avatar 上应该只有一个 Skinned Mesh Renderer。任何配饰或附加物应在 Blender 等 3D 编辑软件中完成,并合并到原始网格中。所有动画或运动应通过形态键或骨骼来处理。

近期将为 VRChat Quest Avatar 设定一个硬性的网格数量限制。

对于世界,您应该从世界中的"对象"角度来思考。地面上的一组罐子可以是一个单独的对象,但您可能不希望将罐子组合合并到地面网格中。否则,您可能会遇到各种优化问题以及后续编辑世界的困难。

材质​

减少材质数量对 Avatar 和世界都很重要。额外的材质会产生额外的子网格,从而增加绘制调用。减少渲染视口所需的绘制调用数量非常重要。

世界

您应尽量使世界的材质数量最小化。也就是说,与世界相比,您对 Avatar 的材质数量需要更加谨慎。最好将世界视为对象的集合,并相应地合并材质。

例如,如果有一个海滩场景,椅子/遮阳伞/毯子组合可能应该使用单个材质和单个纹理图集。海滩稍远处的一组岩石则使用另一种材质和纹理。这样,您就可以为了遮挡剔除的目的而分离对象。

在世界中过度合并材质和制作图集会导致 Unity 在进行批处理和运行时优化时出现一些非最佳行为。

Avatar

您的 Avatar 应尽量只使用 1 种材质,尽管在需要不同着色器变体的情况下使用 2 种材质也是允许的。纹理图集化至关重要。

近期将为 VRChat Quest Avatar 设定一个硬性的材质数量限制。

Avatar 和世界

您应该在所有材质上启用 GPU Instancing。尽管其实际使用场景更为复杂和技术性,但最好直接打开它。

纹理​

纹理大小的问题同样适用于 Avatar 和世界,但请记住 Avatar 纹理大小应该减小,因为单个实例中会有多个 Avatar(但只有一个世界)。

保持纹理尺寸小很重要。您应尽量使用最高 1k(1024x1024)分辨率的纹理。还应创建高效打包的图集,以便在相同大小下获得更多纹理分辨率。

压缩后 Avatar 不能超过 10MB,世界不能超过 100MB。由于这通常大部分是纹理数据,您应保持纹理小巧并进行压缩。

考虑使用 Crunch 压缩,但请注意,如果新版本 Unity 使用了不兼容的 Crunch 版本,这可能会在以后破坏您的 Avatar。

光照​

本节仅适用于世界。

为世界烘焙光照是必要的。完全放弃实时光照也不无道理,因为它们非常耗费性能。广泛使用烘焙光照和光照探针。保持低光照贴图分辨率。即使使用低光照贴图分辨率,光照效果也可以非常好。

遮挡剔除​

本节仅适用于世界。

烘焙遮挡剔除极其重要。这样做可以让硬件只渲染需要的内容,而忽略看不到的部分。设置遮挡剔除并不费时。

这也是为什么您不希望在世界中过度合并网格的原因——如果您有一些物体,比如地面上的建筑,您可能不希望将建筑网格合并到地面网格中,以便可以剔除建筑。

骨骼数量​

保持低骨骼数量对于降低蒙皮调用的开销很重要。如果某个骨骼没有通过动画或绑定进行动画化,您应该将其权重合并到父级并删除原始骨骼。像 Cat's Blender Plugin 这样的工具使这变得非常容易。

匹配绑定

确保绑定的基本骨骼布局和层级结构完全相同,包括缩放、旋转和位置。这尤其适用于您的根骨骼(通常是髋部)。不匹配可能会导致跨平台查看内容时出现异常行为。

着色器​

Avatar

在 Android 版 VRChat 中,Avatar 的着色器受到限制,您只能使用 VRChat SDK 中包含的 VRChat Mobile 着色器。

您可以在我们的Android 内容限制页面上了解这些变体。

如果您的 Avatar 没有法线贴图,请不要使用 Bumped 变体。这不会给您带来任何好处,反而会带来一点性能开销。Specular 也是如此。

世界

在 Android 版 VRChat 中,世界的着色器不受限制。但是,在编写和使用自定义着色器时应极其小心。性能高于一切。如果您正在寻找一个高度优化的基本世界着色器,请使用 Mobile/VRChat/Lightmapped 并烘焙您的光照。

您应尽量避免使用透明度。Alpha 填充率是移动 GPU 的重要性能消耗点,因此在设计时尽可能避免使用透明度。

其他组件​

Cloth​

Cloth 组件在 Android 版 VRChat 中完全禁用。

Cameras​

Camera 组件在 Android 版 VRChat 中的 Avatar 上禁用。

在世界中允许使用,但应注意不要过度使用。

Lights​

Lights 在 Android 版 VRChat 中的 Avatar 上完全禁用。

Post Processing(v1 和 v2)​

后处理系统在 Android 版 VRChat 中完全禁用。

Audio Sources​

Audio Sources 在 Android 版 VRChat 中的 Avatar 上完全禁用。

在世界中 Audio Sources 受到限制。

Rigidbodies、Colliders 和 Joints​

Rigidbodies、colliders 和 joints 在 Android 版 VRChat 中的 Avatar 上完全禁用。

在世界中允许使用,但应注意不要过度使用。

Particles​

Particles 在 Android 版 VRChat 中的 Avatar 上受到严格限制。