版本:Unity 6 (6000.0)
语言:English
剔除着色器变体
控制着色器使用的内存量

解决 AssetBundle 中着色器重复的问题

如果您使用AssetBundle,如果在两个或多个对象中引用一个着色器在 GPU 上运行的程序。 更多信息
参见 术语表
,Unity 可能会编译重复的着色器。例如

  • AssetBundle 中的材质和构建的场景场景包含游戏环境和菜单。可以将每个唯一的场景文件视为一个唯一的关卡。在每个场景中,放置环境、障碍物和装饰,从本质上讲,将游戏分块进行设计和构建。 更多信息
    参见 术语表
    中引用的材质引用相同的着色器。
  • 多个 AssetBundle 包含引用 AssetBundle 外部相同着色器的材质。

这会增加着色器使用的内存和存储空间,并破坏绘制调用批处理

为避免这种情况,您可以使用以下方法

  • 首先加载包含所有着色器的 AssetBundle,然后加载并实例化引用这些着色器的 AssetBundle 资源。有关更多信息,请参阅AssetBundle 依赖项
  • 构建 AssetBundle 以最大程度地减少重复。有关更多信息,请参阅资源重复

您可以将材质和着色器变体集合添加到 AssetBundle 以指定要包含的着色器变体。

如果您创建单个 AssetBundle,则某些着色器可能会保留在内存中,即使它们不再需要,因为无法部分卸载 AssetBundle。您可以通过为一起使用的每组着色器创建单独的 AssetBundle 来避免这种情况,例如“森林”AssetBundle 和“沙漠”AssetBundle。请参阅管理已加载的 AssetBundle,或者如果您使用 Addressables,请参阅Addressables 系统中的内存管理

剔除着色器变体
控制着色器使用的内存量