Unity5 (5.0-5.2) Shader编译机制初探 - 小心,Shader在吞噬你的内存

2023-05-16

又被Unity坑了一把,简单说下吧,下面都是流水账,结论就写在最后了,就是Unity5 - 5.2的shader编译机制真是不咋地。

1.Why Always me?

问题是这样的,我照着Unity5 的Standard shader写了一个给我们工程用的简化版的标准Shader以及配合使用的ShadergGUI,里面融合了很多功能,包括支持法线啊、uv动画啊、半透镂空等等,通过shader_feature定义的宏将这些效果融合到一个shader里,这样既方便了美术,也方便了shader的管理,不用像原来一样工程里乱七八糟的一堆shader了。

不过后期在真机测试的时候遇到了一个问题,就是我通过EnableKeyword来动态修改材质表现在设备上不好使了。当时第一想法就是Shader中那么多条件宏在build的时候被Unity自动strip掉了,因为我们大部分的资源都打包成了Assetbundle包,工程实际只有一个空场景,Shader资源都放在了Resources目录下。如果说因为build的场景和资源里不包含shader的一些variant而被Unity自动去掉了这也是可以理解的。于是我就想GraphicsSettings里不是有个Always Included Shaders么,按照字面意思理解把shader放到那里去总是可以了吧,于是我就按下图设置了下。嘿!还真就好了!
这里写图片描述

2.100MB WTF?

既然这样好了,那看来真机调试时其他的一些问题比如角色表现增强效果应该也是这个原因喽,那索性把其他的shader也都加进来吧,省的后面再出问题。别说这招真是包治百病,单机界面里我们还用了不少Standar shader,也就添加进来吧。ok,一切问题解决。。。。。。了吗?
第二天测试就告诉我这个版本闪退频繁,一查都是内存爆了。拿Instrument一看我靠,一登录就快300MB了,看下Allocation,编译Shader居然就用了100多MB。难道说跟昨天把Standard Shader加进去导致的?虽然是很怀疑不过既然调试已经定位到这里还是试一下吧,于是乎把Standard shader从Always Included Shaders列表中移除再发布,嘿!还真就好了!

3.真相水落石出

现在的情况就是
1.真机运行时Shader.EnableKeyword不好使,应该是因为Unity在Build时自动把没有用到的variant删减掉了(不是结论)
2.通过Always Included Shaders设置解决了问题,不过导致内存大量增加,应该是因为Unity在启动时把该列表内的Shader的全部variant都展开编译了出来,所以一方面解决了上面的问题,一方面却增大了内存,而至于内存为什么会增加如此之多,那只能靠猜的了。
既然这样,那就要想办法解决Shader的内存占用了,既然全部variant占据的空间太大就部分加载呗,正好Unity5增加了个ShaderVariantCollection这么个东西,看看好不好用。结果。。。。。多天的各种实验全部以失败告终,这包括:
1.创建ShaderVariantCollection资源,包含目标shader的全部variant,并添加到GraphicsSettings的Preload Shaders列表中
2.通过代码创建ShaderVariantCollection,并调用WarmUp接口

=========================流水账分割线==================================

下面总结下我分析出来的Unity5.0 - 5.2的Shader编译加载策略
1. 发布工程时,Unity 会将全部multi_compile定义宏组合成的variant编译并加入包中
2. 发布工程时,Unity 会将全部关联材质引用到的variant编译并加入包中
3. 发布工程时,Unity会将Always Included Shaders列表中全部Shader的全部variant编译并加入包中
4. Build Assetbundle时,Unity会将关联的Shader的全部由multi_compile定义的variant以及使用到的variant编译并加入包中

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unity5 (5.0-5.2) Shader编译机制初探 - 小心,Shader在吞噬你的内存 的相关文章

随机推荐

  • pip版本过低无法更新 解决方案

    问题 xff1a 方案一 xff08 失败 xff09 xff1a python span class token operator span m pip install span class token operator span spa
  • MOOC数据结构(下)(自主模式)-平均气温(Temperature)

    平均气温 Temperature Description A weather station collects temperature data from observation stations all over the country
  • javascript的事件介绍

    你的点赞就是继续前行的动力 xff0c 嘻嘻 文章目录 事件概述二 事件绑定2 1HTML事件2 2 DOM0级事件2 3 DOM2级事件 三 鼠标事件四 焦点事件五 滚动事件六 键盘事件6 1 介绍6 2 属性 七 手机触摸事件7 1 手
  • 获取手机页面的元素位置坐标

    解决方案一 xff1a 在手机开发者选项中 xff0c 将指针位置打开 xff0c 可以在屏幕上方看到当前点击位置的坐标点 X Y 例如 xff1a P 1 1 X 545 Y 1846 Xv 0 0 Yv 0 0 Prs 1 0 Size
  • ubuntu 触摸屏横屏变竖屏解决 触摸功能仍然是横屏的问题

    在经过横屏转竖屏时 发现触摸屏仍然是横屏时候的触摸点 横屏时触摸屏正常使用 xff0c 竖屏时不正常 解决 xff1a 需要将 触摸屏进行旋转 通过 input 通过 xrandr o right 旋转后触摸屏不正常 旋转触摸的坐标轴 xf
  • 计算机组成原理三:总线

    第三章 总线 1 总线概念 计算机硬件系统有2种互联方式 一种是各部件之间单独连线 称为分散连接 另一种是将各部件连到一组公关信息 传输线上 称为总线连接 总线是一组线路 将计算机的各个硬件连接在一起 让它们可以通过这条公共线路进行数据的传
  • Matlab-数字图像处理-获取图片rgb颜色分量及截取子图

    Matlab 数字图像处理基础实验 获取图片rgb颜色分量及截取子图 Problem Statement 问题描述 1 Proficient in Matlab tools and complete two Matlab functions
  • ICRA2020论文整理(SLAM + Deep Learning)

    参考 https github com PaoPaoRobot ICRA2020 paper list 目录 1 SLAM 2 Deep Learning in Robotics and Automation 3 Localization
  • win10+ubuntu16.04双系统下完全删除并重装ubuntu16.04

    参考文章 xff1a 1 彻底删除Ubuntu EFI分区及启动项 xff1a https blog csdn net mtllyb article details 78635757 2 Create a bootable USB stic
  • Ubuntu18.04开机挂载硬盘

    Linux与Windows的文件资源管理在加载上有所区别 xff0c Windows自动加载主板上连接的所有磁盘 xff0c 而Linux默认只挂载系统所在的分区 xff0c 使用其他分区则需要使用mount命令手动挂载 若需系统启动时自动
  • [Docker] 删除所有httpd镜像创建的容器 - 详细解释

    故意 一不小心创建了很多httpd容器 或者包含 httpd 关键字 xff0c 有的在运行 xff0c 有的已经停止了 xff0c 有的已经退出 xff0c 如果我想强制一键删除 xff0c 该怎么办呢 xff1f 其实很简单 xff0c
  • 直流调速器(有刷电调)的工作原理

    以前测试过无刷电调 xff0c 它是把锂电池的直流电转化为三相交流波形 xff0c 最近买了有刷电调 xff0c 也研究一下它的调速原理 调速器如下 xff1a 飞马 30A单向有刷电调 固定翼飞机专用 带动力启动开关 测试平台 连接示波器
  • 百度开发测试工程师在线笔试

    时间 xff1a 2020 9 3 19 xff1a 00 21 xff1a 00 笔试内容 xff1a 选择题 编程题 1 选择题 xff08 30个 xff09 50分钟 xff0c 60分 xff0c 涵盖内容较广 xff0c 包含计
  • ROS1重温:自定义头文件、源文件

    ROS1重温 xff1a 自定义头文件 源文件 自定义头文件 源文件的意义自定义头文件创建自定义头文件使用头文件 xff0c 并在程序中直接实现函数功能修改 CMakeLists txt 文件 自定义头文件中实现函数功能的源文件创建自定义头
  • spring cloud bus 消息总线 原理总结

    1 spring cloud bus spring cloud bus整合java的事件处理机制和消息中间件的发送和接收 xff0c 主要是由发送端 接收端和事件组成 目前spring cloud bus只实现了RabbitMq和Kafka
  • NGUI扩展:为面板(Panel)添加自定义图片遮罩

    前一阵使用NGUI开发时遇到一个实现圆形小地图的需求 小地图上除了地图背景外还有一大堆的零零碎碎的角色提示信息啥的 xff0c 因此创建了一个panel进行绘制 xff0c 剩下的就是如何让这个panel只在一个圆形的区域内进行显示 NGU
  • Unity3D使用RenderCommand渲染外轮廓

    外轮廓渲染方式原来的做法使用CommandBuffer 外轮廓渲染方式 我这里所要介绍的外轮廓是使用模糊后处理实现的 xff0c 不涉及到边缘查找或是顶点扩展这些 xff0c 简单的说这种方式渲染外轮廓总共分三步 1 用单色渲染目标物体到R
  • Matlab-计算直方图+直方图均衡

    数字图像处理基础实验 计算直方图 43 直方图均衡 Problem Statement xff08 问题描述 xff09 1 Histograms are the basis for numerous spatial domain proc
  • Unity 5 全局光照GI与新的烘焙系统初探

    GI是啥 Realtime GI xff0c 实时全局光照 xff0c 听上去就是一个非常高大上的词 xff0c 但是越高大上就越令人心生敬畏 xff0c 因为世上没有免费的午餐 xff0c 越好的效果意味着越多的消耗 xff0c 对于移动
  • Unity5 (5.0-5.2) Shader编译机制初探 - 小心,Shader在吞噬你的内存

    又被Unity坑了一把 xff0c 简单说下吧 xff0c 下面都是流水账 xff0c 结论就写在最后了 xff0c 就是Unity5 5 2的shader编译机制真是不咋地 1 Why Always me 问题是这样的 xff0c 我照着