美文网首页unity3D技术分享Unity游戏开发经验分享
Unity - 性能优化实战04 - Texture优化

Unity - 性能优化实战04 - Texture优化

作者: 能不写代码么 | 来源:发表于2023-08-09 17:52 被阅读0次

    UPR优化建议

    • 纹理资源大小2的幂次:大小非2的幂次的纹理资源将无法使用ETC1和PVRTC压缩格式。在导入时自动伸缩为2的幂次也可能会导致内存占用或者贴图质量问题。和美术协商按照2的幂次出图
    • 纹理的原始大小不是2的幂次;导入时自动扩大成2的幂次会导致内存占用上升。和美术协商按照2的幂次出图
    • 纹理的原始大小不是2的幂次;导入时自动缩小成2的幂次可能会影响贴图质量。和美术协商按照2的幂次出图
    • 纹理资源的读/写标志应被禁用:应禁用不需要读写标志的纹理资源
    • 未压缩的纹理应该禁用mipmap:检查Inspector -> Advanced -> Generate Mip Maps选项
    • Android平台纹理压缩格式

      带有OpenGLES3或更高版本的Android的纹理格式应该是ASTC
      对安卓平台使用默认值,但格式不是Automatic
    • 检查纹理资源的过滤模式

      纹理的过滤模式一般不建议使用Trilinear,会占用较高的计算资源
    • 检查纹理资源alpha通道

      如果纹理的alpha通道全部为0,或者全部为255,可以认为其中不包含有效信息,此时应禁用'Alpha源'标志,否则会浪费这部分的内存
    • 检查纯色纹理

      纯色纹理的使用可能可以由一些设置来代替。由于某些情况下纯色纹理是必不可少的,此警告仅会在所使用的纹理较大(大于设定值, 默认为16x16)时才会触发
    • 检查重复纹理
    • 检查纹理是否过大

      过大的纹理资源会更多的消耗内存
    • 检查纹理重复环绕模式

      Repeat Wrap模式可能会导致纹理上出现意外的边缘
    • 检查精灵图纹理填充率

      填充率是精灵图分割后的有效面积与总面积的比率,较低的精灵图纹理填充率会导致显存的浪费。Custom Parameters: fillRateThreshold : 0.5onlyCheckSprite : True

    自定义导入设置

    可以看到上文有很多要优化的内容,一个一个找到修改真的费时费力,所以写了一个工具保证了资源的规范性。当然还是有很多不完善的后续一点点补充进来

    using System.IO;
    using UnityEditor;
    using UnityEngine;
    
    namespace Game.Editor
    {
        public class CustomAssetImporter : AssetPostprocessor
        {
            private void OnPreprocessTexture()
            {
                var importer = assetImporter as TextureImporter;
    
                //设置Read/Write Enabled开关,不勾选
                importer.isReadable = false;
    
                // Assets/Artworks下是美术库的全部贴图,分门别类的设置不同最大尺寸
                if (assetPath.StartsWith("Assets/Suntail Village/Textures"))
                {
                    string fileName = Path.GetFileNameWithoutExtension(assetPath);
                    if (fileName.EndsWith("_1024"))
                        importer.maxTextureSize = 1024;
                    else if (fileName.EndsWith("_2048"))
                        importer.maxTextureSize = 2048;
                    else
                        importer.maxTextureSize = 512;
    
                    var androidSetting = importer.GetPlatformTextureSettings(BuildTargetGroup.Android.ToString());
                    androidSetting.maxTextureSize = importer.maxTextureSize;
                    if (!IsAllowTextureFormat(androidSetting.format))
                    {
                        androidSetting.format = TextureImporterFormat.ASTC_8x8;
                    }
                    androidSetting.overridden = true;
                    importer.SetPlatformTextureSettings(androidSetting);
                }
                // UI大图资源,设置好指定的安卓格式
                if (assetPath.StartsWith("Assets/Main/SpriteBig"))
                {
                    var androidSetting = importer.GetPlatformTextureSettings(BuildTargetGroup.Android.ToString());
                    androidSetting.maxTextureSize = importer.maxTextureSize;
                    if (!IsAllowTextureFormat(androidSetting.format))
                    {
                        androidSetting.format = TextureImporterFormat.ASTC_8x8;
                    }
                    androidSetting.overridden = true;
                    importer.SetPlatformTextureSettings(androidSetting);
                }
                if (importer.assetPath.StartsWith("Assets/Main/Sprites"))
                {
                    //设置UI纹理Generate Mipmaps
                    importer.mipmapEnabled = false;
                    //设置UI纹理WrapMode
                    importer.wrapMode = TextureWrapMode.Clamp;
                }
            }
    
            bool IsAllowTextureFormat(TextureImporterFormat format)
            {
                return format == TextureImporterFormat.ASTC_4x4 || format == TextureImporterFormat.ASTC_8x8 || format == TextureImporterFormat.ETC2_RGBA8;
            }
        }
    }
    

    优化对比

    • Memory视图中,Texture2D内存优化了将近300M,如果大家觉得压缩太狠,可以调整合适自己的分辨率
    • Profiler中整体内存峰值200M,纹理也是显示将近300M的优化

    相关文章

      网友评论

        本文标题:Unity - 性能优化实战04 - Texture优化

        本文链接:https://www.haomeiwen.com/subject/mhugpdtx.html