博客
关于我
[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/

    你可能感兴趣的文章
    mySQL 多个表求多个count
    查看>>
    mysql 多字段删除重复数据,保留最小id数据
    查看>>
    MySQL 多表联合查询:UNION 和 JOIN 分析
    查看>>
    MySQL 大数据量快速插入方法和语句优化
    查看>>
    mysql 如何给SQL添加索引
    查看>>
    mysql 字段区分大小写
    查看>>
    mysql 字段合并问题(group_concat)
    查看>>
    mysql 字段类型类型
    查看>>
    MySQL 字符串截取函数,字段截取,字符串截取
    查看>>
    MySQL 存储引擎
    查看>>
    mysql 存储过程 注入_mysql 视图 事务 存储过程 SQL注入
    查看>>
    MySQL 存储过程参数:in、out、inout
    查看>>
    mysql 存储过程每隔一段时间执行一次
    查看>>
    mysql 存在update不存在insert
    查看>>
    Mysql 学习总结(86)—— Mysql 的 JSON 数据类型正确使用姿势
    查看>>
    Mysql 学习总结(87)—— Mysql 执行计划(Explain)再总结
    查看>>
    Mysql 学习总结(88)—— Mysql 官方为什么不推荐用雪花 id 和 uuid 做 MySQL 主键
    查看>>
    Mysql 学习总结(89)—— Mysql 库表容量统计
    查看>>
    mysql 实现主从复制/主从同步
    查看>>
    mysql 审核_审核MySQL数据库上的登录
    查看>>