Unity Texture优化和格式统一设置

这篇具有很好参考价值的文章主要介绍了Unity Texture优化和格式统一设置。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

using System;
using System.IO;
using UnityEditor;

namespace Assets.Optimize
{
    /// <summary>
    /// 图片格式优化和统一
    /// </summary>
    public class TextureOptimize
    {
        /// <summary>
        /// 
        /// </summary>
        /// <param name="dirPath">图片所在目录</param>
        public void FormatSetting(string dirPath)
        {
            if (string.IsNullOrEmpty(dirPath))
                return;
            if (Directory.Exists(dirPath))
            {
                //1. 遍历文件夹
                DirectoryInfo direction = new DirectoryInfo(dirPath);
                FileInfo[] files = direction.GetFiles("*.*", SearchOption.TopDirectoryOnly);
                //2. 收集所有的图片
                var doCount = 0;
                for (int i = 0; i < files.Length; ++i)
                {
                    var path = files[i].FullName;
                    if (path.EndsWith(".png", StringComparison.CurrentCultureIgnoreCase) || path.EndsWith(".jpg", StringComparison.CurrentCultureIgnoreCase))
                    {
                        path = path.Replace('\\', '/');
                        var name = files[i].Name;
                        //3. 设置图片的格式 
                        if (SetTextureFormat(path))
                        {
                            ++doCount;
                        }
                    }
                }
                UnityEngine.Debug.LogErrorFormat("优化完成,共优化{0}张图片", doCount);
            }
        }

        /// <summary>
        /// 改变Texture的格式属性
        /// Unity官方关于图片属性的说明:
        /// https://docs.unity3d.com/Manual/class-TextureImporter.html
        /// </summary>
        /// <param name="texPath">图片路径</param>
        private bool SetTextureFormat(string texPath)
        {
            //TODO  可以配置个不做格式更改和压缩的白名单目录(_whiteNames)进行过滤
            texPath = texPath.Replace('\\', '/');
            AssetImporter importer = AssetImporter.GetAtPath(texPath);
            bool isChanged = false;
            if (importer != null && importer is UnityEditor.TextureImporter)
            {
                //TODO if (!_whiteNames.Contains(fileName))
                TextureImporter textureImporter = (TextureImporter)importer;
                //禁用读写,在内部,Unity 使用纹理数据的副本进行脚本访问,这使纹理所需的内存量增加了一倍。
                if (textureImporter.isReadable != false)
                {
                    isChanged = true;
                    textureImporter.isReadable = false;
                }
                //如果是UI上用的Texture就可以设置成GUI模式
                if (textureImporter.textureType != TextureImporterType.GUI)
                {
                    isChanged = true;
                    textureImporter.textureType = TextureImporterType.GUI;
                }
                //关闭mipmap,耗内存
                if (textureImporter.mipmapEnabled != false)
                {
                    isChanged = true;
                    textureImporter.mipmapEnabled = false;
                }
                //指定如何生成纹理的Alpha,这里使用图片自带的Alpha通道
                if (textureImporter.alphaSource != TextureImporterAlphaSource.FromInput)
                {
                    isChanged = true;
                    textureImporter.alphaSource = TextureImporterAlphaSource.FromInput;
                }
                //启用此属性以扩大颜色并避免过滤边缘上的伪影。
                if (textureImporter.alphaIsTransparency != true)
                {
                    isChanged = true;
                    textureImporter.alphaIsTransparency = true;
                }
                //设置图片二次幂(NPOT)的缩放属性,在导入时将纹理缩放到最接近的二维大小。
                //比如:一个 257x511 像素的纹理被缩放到 256x512 像素
                if (textureImporter.npotScale != TextureImporterNPOTScale.ToNearest)
                {
                    isChanged = true;
                    textureImporter.npotScale = TextureImporterNPOTScale.ToNearest;
                }
                //设置最大导入纹理尺寸。这里数值自己定义,比如UI以1280为基准设计就设置成1024,以1920为基准设计就设置成2048
                if (textureImporter.maxTextureSize != 1024)
                {
                    isChanged = true;
                    textureImporter.maxTextureSize = 1024;
                }
                //设置图片压缩模式,就使用正常压缩模式
                if (textureImporter.textureCompression != TextureImporterCompression.Compressed)
                {
                    isChanged = true;
                    textureImporter.textureCompression = TextureImporterCompression.Compressed;
                }
                //设置压缩格式,这个就各自选择了
                if (textureImporter.textureFormat != TextureImporterFormat.ASTC_RGBA_4x4)
                {
                    isChanged = true;
                    textureImporter.textureFormat = TextureImporterFormat.ASTC_RGBA_4x4;
                }
                if (isChanged)
                {
                    //刷新图片
                    AssetDatabase.ImportAsset(texPath, ImportAssetOptions.ForceUpdate);
                }
            }
            return isChanged;
        }
    }
}

主要逻辑,按照项目所需,统一Texture格式和压缩方式,可以举一反三。

Unity - Manual: Texture Import Settings

《Unity性能优化》系列课程笔记——第叁节 - 哔哩哔哩

上门两篇文章可以多看看,了解下原理,了解下怎么降内存和适配移动平台。文章来源地址https://www.toymoban.com/news/detail-613864.html

到了这里,关于Unity Texture优化和格式统一设置的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【300.Unity内存优化】ID-315-001:图片压缩格式详解及优化(1)原理篇之不同平台的压缩格式

    unity图片压缩格式和内存计算 例子1:使用RGBA 32bit真彩(Truecolor),占用内存 = 4Bytes*512*512 = 1MB; 例子2:使用RGB ETC 4bit压缩,占用内存 = 0.5Bytes*512*512 = 128KB 一、2的N次方大小的图片会得到引擎更大的支持,包括压缩比率,内存消耗,打包压缩大小,而且支持的力度非常大。 二

    2023年04月17日
    浏览(50)
  • Unity - 搬砖日志 - Texture.mipmapBias 无效的解决方法

    Unity : 2020.3.37f1 Pipeline : BRP 因为美术发现有些贴图太糊,但是经过研究发现,mipmap0就是完全够精度的 但是不可能还要提升贴图的尺寸,因为经过多方咨询(咨询TA大佬) 发现是 unity 纹理一个 mipmapBias 的 import 属性,但结果设置了一样木有效果 最后TA大佬说,试试 shader 修改

    2023年04月22日
    浏览(42)
  • unity emgucv Texture2D转Mat / Mat转Texture2D / Texture 转 Texture2D

    Mat是emgucv的类,需要导入dll 首先需要导入emgucv要用的dll 免积分下载 这些不需要emgucv的dll,什么都不需要额外导入

    2024年02月15日
    浏览(41)
  • Unity WebCamTexture转Texture2D转byte[]

    一: WebCamTexture=Texture2D : GetNativeTexturePtr CreateExternalTexture 只是要显示在屏幕上,这段代码没有问题 如果想要转成 byte[]  使用 EncodeToJPG 则会有一个报错(暂时不知道什么原因) Unable to retrieve image reference 使用  GetRawTextureData    则会得到一个长度为0的数组 也可以直接把

    2024年02月07日
    浏览(49)
  • Unity性能优化篇(八) 导入的模型网格优化设置

    模型导入Unity后,可以选中这个模型,在Inspector窗口设置它的属性。下面说的都是可自定义选择优化的地方 Model选择卡: 1.在Model选项卡,启用Mesh Compression可以压缩模型,压缩程度越高,模型精度越低,但是模型也会节省一些空间。 2.如果该模型不需要用代码来读写,则可以取

    2024年03月20日
    浏览(47)
  • 【unity shader】水体渲染基础-基于texture distortion的流体流动材质

    当液体静止时,它在视觉上与固体没有太大区别。 但大多数时候,我们的性能不一定支持去实现特别复杂的水物理模拟, 需要的只是在常规的静态材料的表面上让其运动起来。我们可以对网格的 UV 坐标实现动态变化,从而让表面的纹理效果实现变形的动态变化。 1.1. uv实时

    2024年02月03日
    浏览(57)
  • 【学习笔记】Unity基础(七)【uGUI基础、利用render Texture实现小地图功能】

    转载请注明出处:🔗https://blog.csdn.net/weixin_44013533/article/details/130808689 本篇基本是大纲性质,参考价值不大,只有最后一小节“利用render Texture实现小地图功能”花了点时间,可以看看,不过也用到了上面的canvas、UI image等知识、以及input等脚本功能,也算一个小练手吧 倒是

    2024年02月08日
    浏览(47)
  • Unity Texture2D的裁剪、镜像、翻转、缩放、合并、分辨率

    本人最近做了一个拍照并打印的程序,使用到了多种图片编辑功能,现在罗列一下,希望对大家有所帮助。 裁剪,将贴图上的某个区域裁剪   缩放,缩放和放大原有贴图  水平镜像  垂直镜像  逆时针旋转90度 顺时针旋转90度  两张贴图合并,可以实现水印等功能,该代码

    2024年02月16日
    浏览(39)
  • Unity3D C#获取Texture2D像素数据IntPtr指针

    Unity3D调用C++库执行图像处理时,需要快速传递Texture2D纹理像素数据块,获取数据块C++指针(C#中用IntPtr表示) 代码如下 案例

    2024年02月15日
    浏览(57)
  • Unity发布后运行报错:Releasing render texture that is set as Camera.targetTexture!

    在IL 2CPP的编译模式下发布Window程序(支持热更新) A预制体被打到AB包里,A预制体依赖B预制体,而B预制体并未打到AB包里,而B预制体内有个Camera的GameObject对象,Camera的TargetTexture也是从本地拖拽上去的。 主要执行的流程是,运行程序,加载AB包,从AB包中加载资源A,然后通过

    2024年02月16日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包