【Unity】性能优化 - 资源分析

本文探讨了Unity3D中资源优化的多个方面,包括纹理格式规范化、内存管理、模型优化、特效粒子系统内存占用计算、UI合批优化以及AssetBundle依赖关系整理。通过这些方法,可以有效地减少Overdraw,提高运行效率,降低内存使用,实现更好的游戏性能。
摘要由CSDN通过智能技术生成

持续更新中。。

贴图

格式
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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值