最近在优化内存的时候,发现了一个内存占用非常高的shader
太坑了、、、发布出来的web包 包体非常小,资源也非常少,却在进入场景的一瞬间内存暴涨到1个多G
通过Profiler观察,shaderlab占用273M,非常高(小项目,一共就用了几个shader)
看工程内使用最多的shader是standard
做了一个测试,把standard换掉
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
public class ExchangeMaterials : MonoBehaviour
{
[MenuItem("Tools/ExchangeMaterial")]
static void ExchangeMaterials()
{
var allMaterials = AssetDatabase.FindAssets("t: Material");
foreach (var guid in allMaterials)
{
var path = AssetDatabase.GUIDToAssetPath(guid);
Material m = AssetDatabase.LoadAssetAtPath(path, typeof(Material)) as Material;
if (m != null)
{
if (m.shader.name == "Standard")
{
m.shader = Shader.Find("AAA");
}
}
}
}
}
找出项目中所有的standard更换为测试shader,此时发现有些shader不能被取出来更换
又一阵挠头之后发现是FBX导入的设置相关
这样设置参数,会生成一个模型自带的material,就可以更换shader啦
重新打包,发现出包速度快了好多倍,心里预感这次一定是找到了方向,O(∩_∩)O哈哈~
运行之后内存减少了600M+,内存终于降下来了,也有点心有余悸,没想到一个没观察到的小小细节内存占用这么高!!!此时再看Profiler,shaderlab占用只有1.1M了、、、