现在做网站用什么工具,微网站建设及微信推广方案ppt模板,少部分网站ie打不开这些网站域名ping不通,centos6.3 网站开发一 、事故描述
我有一个需求#xff1a;在工程文件中找得到所有的图片#xff08;Texture 2D#xff09;#xff0c;然后把WebGL发布打包时的图片压缩规则进行修改。 项目中有图片2千多张#xff0c;其中2k分辨率的图片上百张#xff0c;当我右键进行批量处理的时候在工程文件中找得到所有的图片Texture 2D然后把WebGL发布打包时的图片压缩规则进行修改。 项目中有图片2千多张其中2k分辨率的图片上百张当我右键进行批量处理的时候内存蹭蹭蹭往上冒直接吃满然后显示Unity挂掉接着其他程序也会挂最后电脑卡住…
二、原因分析
当我全选整个项目中的图片然后右键菜单执行该脚本后它加载图片的代码如下 Object[] textures Selection.GetFiltered(typeof(Texture2D), SelectionMode.DeepAssets);这个数组会爆仓内存。
其次每张图单独处理的时候我new了两个东西如下
new的第一个组件
// 创建特定平台压缩实例
TextureImporterPlatformSettings platformSettings new TextureImporterPlatformSettings();
//设置属性new的第二个组件
//设置importSettings
TextureImporter importer AssetImporter.GetAtPath(AssetDatabase.GetAssetPath(texture)) as TextureImporter;
//设置属性这两个组件是在一个for循环里面用完之后没有设置为null。
三、换种思路
1、只抓取资源id
string[] guids AssetDatabase.FindAssets(t:texture2d);2、用id取获取图片对象
Texture2D texture AssetDatabase.LoadAssetAtPathTexture2D(path);3、new 出来的组件记得清空
Texture2D texture AssetDatabase.LoadAssetAtPathTexture2D(path) ;
TextureImporterPlatformSettings platformSettings new TextureImporterPlatformSettings();
TextureImporter importer AssetImporter.GetAtPath(AssetDatabase.GetAssetPath(texture)) as TextureImporter;//属性赋值
//.....//-----------------清空对象-----------------至于什么时候触发GC那就不知道了
platformSettings null;
importer null;
texture null;
3、图片上的组件用完及时清空 static void FindAllTexture2D(){//****************************************参数设置区**********begin//TODO 做成EditWindow类型TextureImporterFormat format TextureImporterFormat.ASTC_12x12; //图片压缩格式int compressionQuality 60; //压缩比例string platform WebGL; //发布的平台 //************************************************************end//查找工程文件中的所有精灵图片string[] guids AssetDatabase.FindAssets(t:texture2d);Debug.Log($Found {guids.Length} Texture2d assets.);foreach (string guid in guids){try{string path AssetDatabase.GUIDToAssetPath(guid);Debug.Log(${path});// 使用AssetDatabase加载Texture2DTexture2D texture AssetDatabase.LoadAssetAtPathTexture2D(path);//Debug.Log(${texture.name});if (texture null) continue;// 创建特定平台压缩实例TextureImporterPlatformSettings platformSettings new TextureImporterPlatformSettings();platformSettings.overridden true;platformSettings.name platform;// 设置为压缩platformSettings.textureCompression TextureImporterCompression.Compressed;// 设置压缩格式platformSettings.format format; //TextureImporterFormat.ASTC_12x12;platformSettings.compressionQuality compressionQuality; //40platformSettings.maxTextureSize GetMaxSize(texture as Texture2D); //32//设置importSettingsTextureImporter importer AssetImporter.GetAtPath(AssetDatabase.GetAssetPath(texture)) as TextureImporter;if (importer null) continue;importer.SetPlatformTextureSettings(platformSettings);//Apply 设置importer.SetPlatformTextureSettings(platformSettings);//保存资源importer.SaveAndReimport();//资源清空platformSettings null;importer null;texture null;}catch (Exception ex){Debug.Log( $ ~~~~~error~~~~~ 设置报错{ex.Message});}}}四、附录出错的脚本
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEditor;public class SetTextureCompression
{//****************************************参数设置区**********begin//TODO 做成EditWindow类型private static TextureImporterFormat format TextureImporterFormat.ASTC_12x12; //图片压缩格式private static int compressionQuality 60; //压缩比例private static string platform WebGL; //发布的平台 //************************************************************end/// summary/// 设置贴图在build时的压缩选项/// /summary[MenuItem(Assets/设置发布WebGL时贴图的压缩格式)]static void SetCompression(){int count 0;Object[] textures Selection.GetFiltered(typeof(Texture2D), SelectionMode.DeepAssets);if (textures.Length 0){foreach (Object texture in textures){// 创建特定平台压缩实例TextureImporterPlatformSettings platformSettings new TextureImporterPlatformSettings();platformSettings.overridden true;platformSettings.name platform;// 设置为压缩platformSettings.textureCompression TextureImporterCompression.Compressed;// 设置压缩格式platformSettings.format format; platformSettings.compressionQuality compressionQuality; platformSettings.maxTextureSize GetMaxSize(texture as Texture2D); //设置importSettingsTextureImporter importer AssetImporter.GetAtPath(AssetDatabase.GetAssetPath(texture)) as TextureImporter;importer.SetPlatformTextureSettings(platformSettings);//Apply 设置importer.SetPlatformTextureSettings(platformSettings);//保存资源importer.SaveAndReimport();count;}//Debug.Log(Texture Compression Set!);}else{Debug.LogWarning(没有选中图片!);}Debug.Log($一共处理了{count}张图片);}/// summary/// 获取图片的分辨率取分辨率中高宽的最大值然后返回图片的【MaxSize】/// MaxSize的定义assets-Image-【Texture2D ImportSettings】-【Override For WebGL】-【Max Size】 /// 区间16,32,64,128,256,512,1024,2048,4096,8192,16384////// 举例图片分辨率 12 * 24那么图片的MaxSize 32/// /summary/// param nametexture/param/// returns/returnsstatic int GetMaxSize(Texture2D texture){//分辨率区间的预备var start new Listint { 0, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384 };var end new Listint { 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 100000 };var zones start.Zip(end, (item1, item2) (startIdx: item1, endIdx: item2)).ToList();//取分辨率高宽的最大值var size new Listint { texture.width, texture.height }.Max(); //取【宽】【高】中的最大值//判断所属的区间var maxSize zones.First(x x.startIdx size size x.endIdx).endIdx;//Debug.Log($图的分辨率 {texture.width} * {texture.height} size {size}, MaxSize {maxSize});return maxSize;}
}