虚拟形象优化技巧
本指南并非虚拟形象优化的终极方案! 正确优化虚拟形象需要对众多方面有相当广泛的了解。我们不期望每个人都了解一切。
然而,我们会尽最大努力保持本文档的更新,涵盖人们最常遗漏的问题以 及最重要的优化目标。
如果你对优化技巧有建议,请点击右上角的 Suggest Edits 按钮并添加你自己的建议!
想让你的虚拟形象高效运行,并因为大家节省了帧数而受到喜爱吗?遵循这些技巧,你应该就没问题了!
本文档中的任何建议数值或限制都可能随时更改。虽然下面提供的一些描述在技术上并不精确,但本文档旨在帮助新手用户学习如何优化虚拟形象。
社区创建的 Blender 插件,如 Cats 或 Tuxedo,允许用户非常轻松地优化模型,并帮助解决常见的 VRChat 虚拟形象问题。我们强烈推荐使用这样的工具!它可以让你的工作更轻松,并提高所有人的性能。
附带说明,SDK 的构建控制面板提供了虚拟形象上组件数量的信息,以帮助进行优化。
为 Android/Quest 优化内容
在为 Android 开发内容时,请记住内容限制!例如,虚拟形象无法使用所有着色器和虚拟形象组件。
此外,你应该为 Android 优化内容。这可以提高虚拟形象的性能评级,并允许更多玩家看到你的虚拟形象。
不 要使用 Dynamic Bones!
Dynamic Bones 是一个你可以购买的 Unity 资源,它允许你在虚拟形象的骨骼上定义骨骼,使其像悬挂着一样移动。你还可以定义静态力,如重力,这可以使头发更逼真地落下。
Dynamic Bones 已弃用,最终将被移除。请改用 PhysBones。
VRChat 会在运行时自动将 Dynamic Bones 转换为 PhysBones。
不要使用 Unity Constraints!
Unity Constraints 是引擎提供的组件,允许你根据一个或多个其他变换来更改虚拟形象上变换的位置、旋转和缩放。
引擎的约束每帧都根据它们之间的依赖关系进行排序,这意味着当存在足够多的约束时,它们可能导致严重的性能问题。请改用 VRChat Constraints,因为它们专为在 VRChat 虚拟形象的上下文中提供更好的性能而设计。
VRChat 会在运行时自动将 Unity Constraints 转换为 VRChat Constraints。
限制 Cloth 的使用
Cloth 是一个默认的 Unity 组件,其开销与 Dynamic Bones 相似,且设置更困难。请严格限制 Cloth 的使用,不要将其应用于顶点数超过 200 左右的网格。
减少虚拟形象上的网格数量
你的虚拟形象可能包含两种类型的网格渲染器——静态网格渲染器(Static Mesh Renderer)和蒙皮网格渲染器(Skinned Mesh Renderer)。静态网格不会变形。而蒙皮网格通常具有骨骼,告诉引擎如何根据骨骼位置移动和变形网格。这些蒙皮网格的代价要高得多,你的虚拟形象上应该只保留一个蒙皮网格渲染器。很少有必要拥有多个——大多数情况下,额外的物品可以构建到原始模型中。
除此之外,虚拟形象上的每个额外网格都会导致一个或多个额外的"Draw Call"(绘制调用)——本质上是处理器花在告诉显卡在屏幕上绘制某样东西上的时间。
因此,VRChat 建议你最多拥有 1 个蒙皮网格渲染器,以及最多 3 个静态网格渲染器。 在 Blender 中合并网格非常简单,如下面的视频所示。
最后,确保你没有使用过多的三角面。如果你尝试上传的模型在 PC 上超过 70,000 个三角面或在 Quest 上超过 20,000 个三角面,SDK 将发出警告。你很少需要这么多多边形来表现细节——考虑烘焙法线贴图并通过抽稀或重拓扑来简化网格。
由于限制更严格,为 Quest 创建虚拟形象可能更具挑战性。最有效的优化往往发生在初始设计和虚拟形象创建阶段。换句话说,如果你试图将一个 120,000 多边形的渲染模型压缩到 20,000 个多边形,你肯定会遇到问题。不要把事情搞得太复杂 ——找一个起点低的模型!20k 已经有相当大的余量了。
值得注意的是,如果你使用 Cats Blender 插件,当你"Fix Model"时,它会自动合并网格。如果你使用 Cats 按材质或按松散部件分离网格以辅助抽稀或编辑,请不要忘记再次合并网格。
减少使用的材质槽数量
每个额外的材质槽也是一个 draw call,会消耗更多的处理器时间!如果你有大量材质(超过 10 个),可以考虑使用纹理图集(Texture Atlasing)。使用社区创建的工具,创建图集非常容易。请查看下面的材质视频了解更多详情。
顺便说一下,重要的是你的虚拟形象中渲染器组件上的材质槽数量。如果你在 20 个槽位中使用相同的材质,从技术上讲你仍然有 20 个"材质"。
这是由于 Unity 将网格分割为子网格的方式。对性能真正重要的是创建的子网格数量,Unity 根据材质槽创建子网格。
注意 VRAM 使用量!
即使你使用纹理图集,最终也可能比之前使用更多的 VRAM!
纹理消耗 VRAM。每个纹理的分辨率越高,消耗的 VRAM 就越多。避免使用多个高分辨率纹理,或者通过减少 Unity 导入设置中的 "Max Size" 参数来减小它们的大小。
例如:一个 30 MB 的虚拟形象可能使用 3 GB 的 VRAM,如果它使用了效率低下的高分辨率纹理。不要被虚拟形象的下载大小所迷惑。
查看 Poiyomi 的纹理优化指南。这是一份关于如何优化虚拟形象纹理的优秀且全面的指南。
使用优化过的着色器
一些着色器可能导致 GPU 渲染时间过长。尽量使用 Unity 标准着色器,或者你知道性能良好的着色器。如果你不知道如何判断一个着色器是否经过良好优化,没关系!以下是一些示例——这些当然不是所有可用的着色器,但它们都制作精良、优化良好且功能丰富。
- VRChat 的 SDK 包含多种针对移动设备优化的着色器,例如 'Standard Lite'。
- Xiexe 的 "XSToon" Unity 着色器 (MIT) - 一组 Unity 的 PBR 'Toon' 着色器集合。
- Silent 的着色器 (MIT) - 用于 Unity 的 cel shading 着色器,最初基于已停产的 CubedParadox 的 Flat Lit Toon,具有许多便捷功能。
- Poiyomi 的 Toon 着色器 (MIT) - 一个非常强大、功能丰富的着色器,具有大量选项。
尽量减少多余的着色器 Pass
从更技术的角度来说,你应该避免使用具有多余着色器 pass 的着色器。这会导致额外的 draw call。对于大多数用户来说,这可能不需要过于担心,因此只要你使用常用且经过验证的社区着色器,就应该没问题。
避免曲面细分(Tessellation)
你应该始终避免在虚拟形象上使用带有曲面细分的着色器。 这在"毛发"着色器中非常常见。曲面细分 是一种让你的显卡对网格进行细分以实现各种效果的方 法。然而,这种效果极其昂贵,即使是最强大的显卡也会变慢。不要使用带有曲面细分效果的着色器。 如果你想要毛发效果,可以考虑使用无需曲面细分即可重现该效果的着色器,例如 XSFur 和 Warren 的 Fast Fur 着色器。
关键字(Keywords)
你还应避免使用过多着色器关键字的着色器。这可能导致 VRChat 中渲染视图时出现严重且不可预测的问题,并会在输出日志中填充大量冗余错误消息。没有必要在你的着色器中包含过多的着色器关键字,因此请只使用实现目标功能所需的关键字。
清除关键字
当你更改或升级着色器时,请确保从材质中删除旧的、未使用的关键字。使用过多关键字对性能和优化非常不利。这不仅会导致你自己的虚拟形象出现问题,还可能阻止其他人正确看到所有着色器。
VRChat SDK 包含一个工具,可以从虚拟形象的材质中移除关键字。这个工具也可能移除你需要的关键字,所以要小心!
通常,最好的做法是使用此工具检查关键字——如果你的关键字太多,你可能需要找另一个着色器。 先切换到 Standard 着色器,清除关键字,然后再切换到你 的新着色器。
对着色器作者的说明
你可能需要考虑使用 Standard 着色器保留的关键字作为你自己的关键字。这些基本上可以保证已经被保留,因此如果你必须使用关键字,请使用 Standard 和 Post Processing v2 已定义的关键字。这是一个推荐使用的关键字列表。
Alpha 透明度
Alpha 透明度也是着色器中另一个昂贵的部分——通常你应该对着色器使用 Cutout 或 Opaque 模式。透明度可能相当昂贵,所以只有在你知道自己在做什么的情况下才使用它!
测量 Draw Call
Unity Profiler 在判断你产生了多少 draw call 时非常有用——只需确保关闭方向光上的阴影,以获得一个公平的基准。
减少骨骼数量
即使你的围巾、裙子或头发中有大量未使用的骨骼,它们也可能在蒙皮调用期间产生额外开销,增加 GPU 的负担。如果你不打算使用某根骨骼,考虑删 除它并将其合并到父骨骼中。如果你想了解如何将骨骼的权重合并到其父级,请查看上面关于 Dynamic Bones 的视频,其中包含骨骼合并的部分。
减少粒子系统的发射量/数量
虽然粒子系统可以产生很多酷炫的效果,但数量过多可能会导致某些 PC 出现问题。限制你使用的粒子系统数量,并限制在任何给定时刻发射的最大粒子数量。
有一些方法可以在拥有大量粒子的同时保持性能。如果你对此感兴趣,可以研究精灵粒子的动态批处理,不要使用碰撞,并确保粒子的运动是简单的。
如果你更偏向技术,可以尝试查看 Unity 的 Profiler 视图,来判断你的粒子模拟占用了多少 CPU 时间。一般来说,大的透明粒子比许多小的不透明粒子更糟糕。Unity 的粒子系统实际上经过了很好的优化,如果使用得当,运行速度很快。
限制虚拟形象使用的光源数量
虚拟形象上的光源是实时的,因此极其昂贵。向虚拟形象添加一个光源意味着你的光源照射到的所有内容都将以双倍的 draw call 进行渲染。额外的光源会成倍增加这种影响。这显然对性能非常不利。 不要使用始终开启的光源。尝试使用动画覆盖来开关手电筒,或者干脆完全不使用光源。
如果你确实使用了光源,请关闭阴影。实时光源上的阴影非常昂贵,而且在移动的物体上通常看起来也不太好。
粒子系统可以配置为让一定数量的粒子带有光源。绝对不要这样做! 每个带有光源的粒子都算作一个实时光源,这(再次强调)极其昂贵。
总的来说,VRChat 建议你完全不要在虚拟形象上使用任何类型的光源。 它们不仅会对你自己虚拟形象的性能产生不利影响,还会成倍增加光源照射到的其他虚拟形象的性能开销。
推荐软件/插件
有大量软件可以帮助你优化虚拟形象,使构建虚拟形象变得更加容易。
例如,查看 Unity 编辑器的 Pumkin's Avatar Tools (MIT)。除其他功能外,此编辑器脚本允许你快速查看虚拟形象的统计数据。该工具处于测试阶段,可能存在错误——请在 Pumkin 的 GitHub 上报告任何问题。
以下软件并非由 VRChat 编写。请阅读并尊重每个产品提供的许可。