持续更新中。。
贴图
格式
ASTC 透明5x5 不透6x6
统一格式:如srgb,filltemode
大图(超过512)不打图集,必须为4的系数,
没用到的图扫描出来
内存
memoryUsed += (int) InvokeInternalAPI("UnityEditor.TextureUtil", "GetStorageMemorySize", texture);
private static object InvokeInternalAPI(string type, string method, params object[] parameters)
{
var assembly = typeof(AssetDatabase).Assembly;
var custom = assembly.GetType(type);
var methodInfo = custom.GetMethod(method, BindingFlags.Public | BindingFlags.Static);
return methodInfo != null ? methodInfo.Invoke(null, parameters) : 0;
}
贴图全透像素覆盖率
防止无效Overdraw
模型
删除冗余uv2,uv3,color等
导入模型删除默认材质
特效
拖尾
发射Mesh与以Mesh作为形状
ParticleSystem组件数量
发射粒子数量
贴图数量,大小,内存
foreach (var renderer in renderers)
{
if (renderer.sharedMaterials == null)
continue;
foreach (var mat in renderer.sharedMaterials)
{
if (mat == null) continue;
Shader shader = mat.shader;
for (int i = 0; i < ShaderUtil.GetPropertyCount(shader); ++i) {
if (ShaderUtil.GetPropertyType(shader, i) != ShaderUtil.ShaderPropertyType.TexEnv) continue;
var textureName = shader.GetPropertyName(i);
var texture = mat.GetTexture(textureName);
if (texture == null) continue;
textureCount++;
usedTextureMemory += (int)InvokeInternalAPI("UnityEditor.TextureUtil", "GetStorageMemorySize", texture);
}
}
}
m_CalculateEffectUIDataMethod = typeof(ParticleSystem).GetMethod("CalculateEffectUIData", BindingFlags.Instance | BindingFlags.NonPublic);
void CalculateEmissionParticlesCount()
{
if (!foldRegulation)
return;
m_ParticleCount = 0;
foreach (var ps in m_pps)
{
int count = 0;
object[] invokeArgs = new object[] { count, 0.0f, Mathf.Infinity };
m_CalculateEffectUIDataMethod.Invoke(ps, invokeArgs);
count = (int)invokeArgs[0];
m_ParticleCount += count;
}
maxParticleCount = Mathf.Max(maxParticleCount, m_ParticleCount);
}
场景
合并独有摆件,材质球等
控制点光源数量
Shader/材质
gpu instancing
用到的buildin shader引入项目打成ab
整理shader变体 (优化PPSV2中的Uber变体)
删除使用代码创建材质的情况(如new cube)
去掉ComputeShader(如果没用到)
去掉冗余材质
UI
优化合批 1.出图 2.层次关系 3.图集划分
AssetBundle
整理依赖关系,防止加载某个简单prefab所有ab都加载出来了.
渲染
UnityStats.drawCalls