博客
关于我
[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 日期时间类型的选择
    查看>>
    Mysql 时间操作(当天,昨天,7天,30天,半年,全年,季度)
    查看>>
    MySQL 是如何加锁的?
    查看>>
    MySQL 是怎样运行的 - InnoDB数据页结构
    查看>>
    mysql 更新子表_mysql 在update中实现子查询的方式
    查看>>
    MySQL 有什么优点?
    查看>>
    mysql 权限整理记录
    查看>>
    mysql 权限登录问题:ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)
    查看>>
    MYSQL 查看最大连接数和修改最大连接数
    查看>>
    MySQL 查看有哪些表
    查看>>
    mysql 查看锁_阿里/美团/字节面试官必问的Mysql锁机制,你真的明白吗
    查看>>
    MySql 查询以逗号分隔的字符串的方法(正则)
    查看>>
    MySQL 查询优化:提速查询效率的13大秘籍(避免使用SELECT 、分页查询的优化、合理使用连接、子查询的优化)(上)
    查看>>
    mysql 查询数据库所有表的字段信息
    查看>>
    【Java基础】什么是面向对象?
    查看>>
    mysql 查询,正数降序排序,负数升序排序
    查看>>
    MySQL 树形结构 根据指定节点 获取其下属的所有子节点(包含路径上的枝干节点和叶子节点)...
    查看>>
    mysql 死锁 Deadlock found when trying to get lock; try restarting transaction
    查看>>
    mysql 死锁(先delete 后insert)日志分析
    查看>>
    MySQL 死锁了,怎么办?
    查看>>