博客
关于我
[Unity 优化]Shader
阅读量:709 次
发布时间:2019-03-21

本文共 1582 字,大约阅读时间需要 5 分钟。

igneous

文档内容:

Shader 变种

multi_compile

通过代码控制关键字开关,一定会编译生成变种。

shader_feature

通常由材质控制是否启用,由材质和ShaderVariantCollection决定是否生成变种。如果在AB文件里将Shader与材质球一同打包,才能灵活获取所需的shader_feature。

skip_variants

可用于剪裁某些变种,避免压缩或优化资源。

Graphics 设置

如果设置了“Always Included Shaders”,游戏运行时会将所有变种打包到资源中,确保它们被加载和缓存。

过多变种会导致ShaderLab内存占用增大,影响Shader.Parse(编译)和Shader.CreateGpuProgram(创建CPU执行程序片段)的性能,且变种过多可能会导致性能问题。

ShaderVariantCollection 使用

将其用于WarmUp,是为了优化Shader.CreateGpuProgram的性能,但不要同时使用多个ShaderVariantCollection进行WarmUp,更应该考虑将多个WarmUp过程合并。

合理使用ClearCurrentShaderVariantCollection和SaveCurrentShaderVariantCollection,合并多个 ShaderVariantCollection 提交摊销,让其高效管理多个版本以提高渲染效率。

Shader 打包 AB

将所有所需的Shader文件和ShaderVariantCollection打包到一个 AB 文件中,这样游戏运行时会全部加载并缓存,之后只需调用 ShaderVariantCollection的WarmUp即可同时预热所有变种,避免后续的Shader.Parse和Shader.CreateGpuProgram操作。

注意事项

  • 如果仍然出现Shader.Parse错误,说明存在冗余资源,可能是未被清理的第三方插件或未加入Always Included Shaders的默认Shader。
  • 如果继续出现Shader.CreateGpuProgram错误,大会源于如下原因:
    • 某些Shader变种被不当添加到Always Included Shaders里,例如使用默认材质的Standard shader。
    • 某些Shader重复加载导致冗余。

依此类推,这些问题需要在预处理阶段就得深度分析和优化。

Shader 冗余

依托上述打AB的优化方式,如果仍然出现冗余,主要可能来自以下方面:

  • 第三方插件:如果项目中引入了第三方库或插件,可能会带来额外的Shader文件,但通过合理配置可以避免加载这些无关的资源。

  • 默认材质引用:未被适当移除的默认材质引用的Shader会在项目中存在,且未被加入Always Included Shaders的情况下,可能会导致冗余。

  • ShaderLab 内存占用

    如果发现ShaderLab内存占用异常大,第一反应应确认是否存在冗余Shader变种,特别是那些被不当地添加到了Always Included Shaders中的Standard材质相关Shader。

    此外,过多的变种使用不当会导致Renderer负担加重,尤其是那些大规模的)fbx文件导入的结构中使用的Standard材质,需要谨慎管理。

    通过定期清理冗余资源和调整不必要的变种生成设置,观察内存占用变化,确保ShaderLab能够高效运作。建议通过Profiler 工具查看 Assets/Shader 中重复出现的Shader文件数量,及时exclude 无用资源。

    希望这份优化后的文档能为您提供清晰的指导,帮助您高效使用和管理Shader资源。

    转载地址:http://wxyrz.baihongyu.com/

    你可能感兴趣的文章
    Oracle的存储结构
    查看>>
    Oracle的聚合函数group by结合CUBE和ROLLUP的使用
    查看>>
    Oracle监听配置、数据库实例配置等
    查看>>
    Oracle知识补充
    查看>>
    Oracle笔记(十三) 视图、同义词、索引
    查看>>
    Oracle笔记(十) 约束
    查看>>
    【BOOST C++字串专题07】 Boost.Format
    查看>>
    oracle系列(六)OEM与常见故障处理
    查看>>
    Oracle系列:安装Oracle RAC数据库(二)
    查看>>
    oracle系统 介绍,ORACLE数据库管理系统介绍
    查看>>
    Thymeleaf模板引擎的编写
    查看>>
    oracle获取数据库表、字段、注释、约束等
    查看>>
    ThreeJS入门(163):THREE.TextureLoader 知识详解,示例代码
    查看>>
    Oracle表的操作
    查看>>
    Oracle表空间、用户的创建及导入导出
    查看>>
    oracle表空间查询维护命令大全之三(暂时表空间)史上最全
    查看>>