Unity关于纹理图片格式带来的内存问题和对预制体批量格式和大小减半处理

Unity 纹理设置 Read/Write Enable:如果你不需要运行时读取图片的像素信息的话,禁用,否则启用后纹理的内存消耗会增加一倍。 Generate Mip Maps:如果不是3D模型贴图,则禁用,否则会多出约33%的内存开销。Mipmaps主要为远处的物件生成较为清晰的小贴图,减少渲染导致的画质损失。像UI贴图,则完全用不到。 Override for iOS/Android:启用,为特定平台做差异化配置。 Max Size:视情况而定,默认最大贴图尺寸限制为2048,如果是特效贴图限制为512。 Fo.. 阅读详情

我们经常会遇到内存问题,这次就是遇到很多图片的默认格式被改成了RGB32,导致Android打包后运行内存明显增加。

发生了什么

打包Android后,发现经常崩溃,明显内存可能除了问题,看了内存后发现了问题。
见下图:
在这里插入图片描述
实际被改成了RGBA 32,如下图
在这里插入图片描述
因为安卓端是没覆写的,所以导致格式就是rgb32
在这里插入图片描述

如何处理

那么如何处理能,最好一键处理。我是这样做的,我对我的需要打包的预设,例如场景,角色等等资源批量检测他们中间引用了哪些图片,然后对这些图片进行处理,因为很多图片是过度文件不打包,进行处理也没必要,白白浪费时间。

代码片段,这里的cfg.path是需要打包prefab的路径,这里只有代码片段是因为我的打包逻辑是自己写的,篇幅问题只能放上核心代码。
代码如下:

string[] file = AssetDatabase.GetDependencies(cfg.path, true);

foreach (var dep in file)
{
    string strExt = System.IO.Path.GetExtension(dep).ToLower();
    if (!exps.Contains(strExt))
        continue;
    TextureImporter textureImporter = AssetImporter.GetAtPath(dep) as TextureImporter;
    TextureImporterPlatformSettings set = textureImporter.GetDefaultPlatformTextureSettings();// .GetPlatformTextureSettings(path);
    if (set.format != TextureImporterFormat.Automatic)
    {
        if (changeFormatAuto)
        {
            set.format = TextureImporterFormat.Automatic;
            textureImporter.SetPlatformTextureSettings(set);
            //EditorUtility.SetDirty(textureImporter);

            // 重新导入资源,否则更改并未生效。
            // 如资源未执行重新导入,则会在项目保存时自动导入、生效
            AssetDatabase.ImportAsset(dep);

            Debug.Log("修改预设" + cfg.prefabname + "中的图片资源格式存在的隐患:" + dep, textureImporter);
            checkok = false;
            allcount++;
        }
        else
        {
            Debug.LogError("预设" + cfg.prefabname + "中的图片资源格式存在隐患:" + dep, textureImporter);
            allcount++;
            checkok = false;
        }
        continue;
    }
}

cfg.path就是perfab所在的位置。传入就可以了
脚本会自动改为Automatic格式。

最后再观察内存,图片找不到了,我放了其他的同尺寸图和一张4k的图,ASTC格式的2k大概是4.8M,4k只有19m内存。
在这里插入图片描述

在这里插入图片描述
最后希望大家有一个干净的资源包。

缩小纹理

可能PC转Android的时候,还希望能缩小纹理尺寸,可以利用这个对图片这样来处理。

//把图片的质量对半砍掉,0表示不砍掉,1:砍一半,2:1/4
public static bool CutHalfPicture(int sizeLevel = 1)
{
    List<string> exps = new List<string>()
    { ".bmp",".jpg",".jpeg",".png",".tif",".psd",".tga"};
    bool checkok = true;

    int[] textureSizes = new int[] {
    32,
    64,
    128,
    256,
    512,
    1024,
    2048,
    4096,
    8192,
    16384,
    };
    int allcount = 0;

    if (ResJsonObjectList == null || ResJsonObjectList.Count == 0)
        JResAssetJson.ReadResJson();


    for (int i = 0; i < ResJsonObjectList.Count; i++)
    {
        ResJson cfg = ResJsonObjectList[i];
        if (cfg.isab != 1)
            continue;
        
        string[] file = AssetDatabase.GetDependencies(cfg.path, true);

        foreach (var dep in file)
        {
            string strExt = System.IO.Path.GetExtension(dep).ToLower();
            if (!exps.Contains(strExt))
                continue;
            TextureImporter textureImporter = AssetImporter.GetAtPath(dep) as TextureImporter;
            TextureImporterPlatformSettings set = textureImporter.GetDefaultPlatformTextureSettings();// .GetPlatformTextureSettings(path);
                                                                                                      //Debug.Log(set.maxTextureSize+",");


            int width, height, max;
            //Texture2D tex = AssetDatabase.LoadAssetAtPath(dep, typeof(Texture2D)) as Texture2D;

            //width = tex.width; height = tex.height;
			//这里更正
			object[] args = new object[2] { 0, 0 };
			MethodInfo mi = typeof(TextureImporter).GetMethod("GetWidthAndHeight", BindingFlags.NonPublic | BindingFlags.Instance);
			mi.Invoke(textureImporter, args);
			
			width = (int)args[0];
			height = (int)args[1];

            max = Mathf.Max(width, height);
            int size = 32; //Default size
            for (int j = 0; j < textureSizes.Length; j++)
            {
                if (textureSizes[j] >= max)
                {
                    size = textureSizes[j];
                    break;
                }
            }
            //set.maxTextureSize = 16384;
            //Debug.Log(size);
            size = (int)(size / Mathf.Pow(2, sizeLevel));
            if (size < 32)
                size = 32;
            if (set.maxTextureSize != size)
            {
                set.maxTextureSize = size;

                textureImporter.SetPlatformTextureSettings(set);

               
                AssetDatabase.ImportAsset(dep);

                Debug.Log("修改预设" + cfg.prefabname + "中的图片:" + dep + " ,大小:" + set.maxTextureSize, textureImporter);
                checkok = false;
                allcount++;
            }
            continue;

        }
    }
    Debug.Log("累计共修改" + allcount + "处图片。");
    return checkok;
}

代码中的ResJsonObjectList和JResAssetJson.ReadResJson()是预设列表和获取预设列表的方法,还是篇幅问题,这里无法放出。可以搜一下如何获取所有预设(prefab)的文章。

补充2024/1/23,后来发现这里的获取图片大小是当前的Unity的大小,所以有点问题,改为

object[] args = new object[2] { 0, 0 };
MethodInfo mi = typeof(TextureImporter).GetMethod("GetWidthAndHeight", BindingFlags.NonPublic | BindingFlags.Instance);
mi.Invoke(textureImporter, args);

width = (int)args[0];
height = (int)args[1];

如果对你有用,请点赞。

Unity性能优化 - 内存篇 本篇文章主要内容摘自UWA的《性能优化,进无止境-内存篇》。地址如下: 性能优化,进无止境-内存篇(上) 性能优化,进无止境---内存篇(下) 本篇主旨是总结两篇内容的重点,细节还请在作者文章查看。 内存优化主要关注点: 1.资源内存占用;2.引擎模块自身内存占用;3.托管堆内存占用。4.内存泄露。5.无效的Mono堆内存开销。6.资源冗余。 一、资源内存占用: 资源的内存占用往往占据了总体内存的70%以上。 因此,资源使用是否恰当直接决定了项目的内存占用情况。 资源主要可分为如下几种: 阅读详情

相关推荐

Unity 计算图片真实存储大小(Preview视图)

一张图片导入Unity,真实大小是怎么计算的,记录一下。图片中有分辨率,压缩格式,和大小,这里分别解释一下。 分辨率 这个应该都知道怎么回事,水平和垂直方向各有多少个像素。这里说一点,看到上方的Max Size 这个设置,指的是这个图片最大的分辨率是多少, 例如2048:2048x2048,这个值会影响图片大小,如果图片原始大小为4096x2048,那么这张图片分辨率就会被压缩到2048*1024,使用最大分辨率等比例缩放。 当然如果原始图小于设置的值,例如1000x1000,那么这张图片就不会

Sevol_Y 8584

U3D资源管理之图片资源设置

本篇文章实现了两个功能:①批量设置合适的Max Size②批量启用CrunchCompression using UnityEngine; using UnityEditor; using System.IO; using System; using System.Collections.Generic; using System.Reflection; using System.Drawing; public class ImportTextureSetting { public clas

Victor_Li_的博客 1620

TC264摄像头循迹进阶:八邻域与逐行遍历在复杂赛道边界提取中的实战对比

本文对比分析了TC264摄像头循迹中八邻域法与逐行遍历法在复杂赛道边界提取中的实战表现。八邻域法在边界连续性方面表现优异,适合处理环岛等复杂元素;逐行遍历法则在计算效率和岔路口识别上更具优势。文章提供了详细的代码实现和优化策略,帮助智能车竞赛选手根据赛道特点选择最佳算法方案。

rainy的博客 939

[Unity优化]图片纹理压缩方案

本文转自:陈小霖的蛮牛在线;简书 请点击链接查看原文,尊重楼主大神版权。Unity图片纹理压缩方案Unity对纹理的处理是智能的:不论你放入的是PNG,PSD还是TGA,它们都会被自动转换成Unity自己的Texture2D格式。 在Texture2D的设置选项中,你可以针对不同的平台,设置不同的压缩格式,如IOS设置成PVRTC4,平台设置成RGBA16等。嗯,非常的智能。但是,在一些进阶的使

鳄鱼泪的博客 8202

UFS电源管理实战:如何优化手机存储的功耗与性能(附实测数据)

本文深入探讨了UFS电源管理的实战优化策略,旨在平衡手机存储的功耗与性能。通过解析UFS核心电压域与工作状态,重点介绍了通过动态调整bActiveICCLevel(活动电流等级)来实现精细控制,并结合实测数据与场景驱动的智能策略,为Android系统与硬件工程师提供了降低功耗、提升流畅度的有效方法。

weixin_29214559的博客 504

Mixly/Arduino实战:WS2812点阵动态显示自定义图案与汉字

本文手把手教你使用Mixly和Arduino驱动WS2812点阵屏,实现自定义图案与汉字的动态显示。内容涵盖硬件连接、取模软件设置、高效数据处理技巧(巧用Excel)、Mixly图形化编程及Arduino代码解析,并深入探讨动态显示与滚动汉字原理,最后提供常见问题排查与性能优化心得,助你从零开始轻松玩转智能硬件。

weixin_29185199的博客 455

Unity Texture2D分平台压缩设置

记录一下怎么设置的代码片码,unity2017上测的可以 var importer = AssetImporter.GetAtPath(a2) as TextureImporter; // 安卓设置 TextureImporterPlatformSettings androidSetting = new TextureImporterPlatformSettings(); androidSet...

啊循的专栏 3326

如何利用PREEvision和MATLAB开发AUTOSAR软件组件

在业界,比较著名的电子电气架构开发工具要属德国Vector公司开发的PREEvision工具了,而MATLAB/Simulink软件是非常高效且实用的基于模型的应用软件开发工具。利用PREEvision与Simulink联合开发AUTOSAR应用软件组件的开发流程有三种,分别是:“自上而下”开发流程(从PREEvision开始),“自下而上”开发流程(从Simulink开始),以及“双向”开发流程。如下图所示,无论哪一种开发流程,PREEvision与Simulink工具都是通过arxml文件进行信息交互的

怿星科技的博客 5397

Unity图片优化 - Dither算法

在Unity移动平台的游戏开发过程中,贴图资源是往往是占资源量最大的资源。如何在保证视觉效果的同时,尽可能地减少贴图资源,是开发团队会经常遇到的问题。通常来说,对于3D物体的纹理,是可以采用ETC/PVRTC等压缩比很大的算法处理,但是对于细节要求很高的UI纹理,这样处理造成的失真往往达不到质量要求。对于这类的贴图,我们可以考虑使用失真较小的16位贴图格式存储。 但是对于颜色数较高的纹理,Unity提供的默认转换方法会呈现明显的色阶。针对该问题,keijiro实现了一种Dither4444的改进算法。从下

蛰伏--当你不够强大时,就不要放弃努力 1674

网工最容易搞混的三个概念:防火墙、网闸、堡垒机,一文让你轻松搞明白。

网闸的作用可以简单概括为:在两个或多个不同安全级别的网络(如内网和外网、普通网与高安全网、受限网与互联网)之间建立一个严格隔离、信息流转的安全桥梁。它的核心任务是实现数据安全传输与隔离,避免网络之间的直接连接带来的安全隐患。数据传输安全:网闸保证数据从一个网络到另一个网络时,能够进行审查、过滤和转换,防止恶意数据或非法信息被传入内部网络或外部泄露。高安全性隔离:网闸常常用于企业的内外网隔离、军事网络、政府机关等对数据隔离要求极高的环境。

HWP18612324139的博客 3639

【保姆级教程】基于UNet++&MobileNetv2的语义分割模型从训练到RK3588部署:让边缘AI落地效率提升300%

通过SMP库一键构建encoder_name="mobilenet_v2", # 选择MobileNetv2作为骨干encoder_weights="imagenet", # 加载预训练权重加速收敛in_channels=3, # 输入图像通道数(RGB)classes=29, # Cityscapes数据集类别数activation=None # 输出无激活,便于后续损失计算本教程从“模型设计-训练-转换-边缘部署”全链路拆解了。

FJN110的博客 213

Unity优化篇 - 图片资源优化

主要针对Unity当中的纹理压缩格式进行了解,还有在各平台所支持的压缩格式及建议。后期会继续不断积累一些知识分享,有什么描述不对的地方欢迎各位大佬指出。

nanyupeng的博客 5647

华为OD机试双机位C卷:流量波峰 (C/C++/Py/Java/Js/Go)

华为OD机试双机位C卷 流量波峰,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。华为OD机试 - 流量波峰。

qq_45776114的博客 2447

Unity图片纹理的压缩格式详解

unity图片纹理的压缩格式

weixin_44165354的博客 4049

基于STM32L4XX、HAL库的YT8531C-CA以太网收发器(PHY)驱动程序设计

是一款由裕太微推出的高性价比、低功耗的单端口 10/100M 以太网物理层收发器(PHY)。它通过标准的 MII(介质独立接口)或 RMII(精简介质独立接口)与微控制器的 MAC 层连接,实现将数字信号与网络模拟信号之间的转换。支持自动协商(Auto-Negotiation),自动选择最高速率和双工模式。支持 HP Auto-MDIX(自动交叉直连),无需区分直通线或交叉线。低功耗设计,特别适合电池供电或对功耗敏感的 STM32L4 应用。支持 MII 和 RMII 接口,节省引脚(RMII模式)。

zhusl6688的博客 628

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Unity图片资源批量优化代码

using UnityEngine; using UnityEditor; using System.IO; using System; using System.Collections; using System.Collections.Generic; using System.Reflection; using System.Drawing; public class CompressTextureEditor { const string TextureSize = "Assets/Com .

nmg10的博客 933

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Unity 图片计算

通过这个公式,我们可以大致估算出图片资源在Unity中占用的内存大小,从而进行合理的资源优化和管理。在Unity开发中,图片资源是非常重要的一部分,它们可以提高游戏的视觉效果和用户体验,但是也会占用大量的内存空间,影响游戏的性能和稳定性。因此,我们需要了解图片资源在Unity中占用的内存大小是如何计算的,以便优化我们的资源管理和加载策略。例如,我们有一张1024x1024的PNG图片,每像素占用4个字节,我们想要在Android平台上使用ETC2压缩格式,并且生成mipmap。

qq_21820591的专栏 1092

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Unity3D 关于TextureImporterFormat

Unity3D 关于TextureImporterFormatUnity3D并不支持gif格式动画,所以如果想制作一个Unity3D动画需要自己手动写一个控件一帧一帧绘制,并产生动画效果。当一副图片导入Unity3D中时,引擎会使用默认参数设置导入,这样可能会出现图片失真效果。导

xtqqksszml的专栏 1017

UI优化方案(2)——RGBA,压缩格式,纹理大小计算

1:图片的颜色通道 印刷当中的三原色是红绿蓝,自然界的三原色是红黄蓝。 还有一个是Alpha通道;控制图片的透明度。 RGBA32,32代表RGBA4个通道总共32位,每一个通道是8位, RGBA16,每个通道占4位,位数越多代表显示的越清晰,颜色越丰富。 2:图片的压缩格式 通常图片的格式有jpg和png,jpg代表的是有损压缩无透明;png无损压缩有透明。显示同一张图的png要比jpg大; jpg和png是两种压缩方式。 无论你导入什么格式的图片,unity都会转化成纹理格式的图片;

qq_35647121的博客 3162

Unity Texture2D内存无法释放,一直占用问题

在排查性能过程中,发现Texture2D一直在占用内存,即使覆盖也还是存在,引用计数一直为1,手动GC也无法释放,然后百度搜罗一下解决方案,发现Texture2D似乎unity无法自动托管,也无法检测当前的Texture2D是不是仍在使用(引用计数都不用了,也还存在)。题外话:在排查中发现一个神奇的东西,在任务管理器中看到内存一直涨后,我用360加速球清了一下,任务管理器的unity内存是被成功的释放了,肉眼可见内存占用少了,但跳回到unity,发现占用还是存在。可能仅仅是把那块内存休眠了吧?

u011021975的博客 2988

Unity3d 批量修改纹理格式

决定纹理资源大小的因素主要有三种:分辨率、格式和Mipmap是否开启。 对于纹理资源的加载建议如下:1、严格控制RGBA32和ARGB32纹理的使用,在保证视觉效果的前提下,尽可能采用“够用就好”的原则,降低纹理资源的分辨率,以及使用硬件支持的纹理格式。 2、在硬件格式(ETC、PVRTC)无法满足视觉效果时,RGBA16格式是一种较为理想的折中选择,既可以增加视觉效果,又可以保持较低的加载耗时

GOON 4053

Unity中加载资源的方法

Resources 资源路径为Resources文件夹下的相对路径 文件不能加后缀名 Resources下的所有资源在发布的时候会被压缩

晓龙想飞 的专栏 943

告别纹理压缩难题:UnityCsReference中TextureImporter的平台适配指南

你是否还在为不同设备上的纹理显示效果差异而烦恼?是否因纹理文件过大导致游戏加载缓慢?本文将通过分析UnityCsReference项目中的TextureImporter实现,带你掌握跨平台纹理压缩的核心技巧,让你的游戏在保持视觉效果的同时实现性能最大化。读完本文后,你将能够: - 理解Unity纹理导入流程的底层机制 - 掌握针对不同平台的纹理压缩策略 - 优化纹理设置以平衡画质与性能 - 解决...

gitblog_00350的博客 842

OnPostprocessTexture unity导入资源设置

unity导入资源的编辑器设置: 防止策划资源乱导入,资源导入需要的格式 AssetPostprocessor 预处理:OnPreprocessTexture TextureImporter imp = (TextureImporter)assetImporter; 获得图片的原始大小 TextureImporter importer = AssetImporter.GetAtPath(path) as TextureImporter; if(importer == n..

qq_40314347的博客 2528

IIS安全

下面是一位高手整理的问题精华,大家好好看看吧,收获肯定很大的!   1.如何让asp脚本以system权限运行?   修改你asp脚本所对应的虚拟目录,把"应用程序保护"修改为"低"....   2.如何防止asp木马?   基于FileSystemObject组件的asp木马   cacls %systemroot%system32scrrun.dll /e /d guests //禁止gues

Happy for Nothing 1479

Unity3d AssetDatabase.LoadAssetAtPath 找不到图片

1

WGYHAPPY的博客 513
上一篇: Unity URP切换品质和Feature开关的性能问题
下一篇: DOSBox模拟器
Thinbug
博客等级 码龄22年 2万+粉丝 187原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Thinbug

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值