Unity资源占用检查Resourceschecker
Posted 带酒书生
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity资源占用检查Resourceschecker相关的知识,希望对你有一定的参考价值。
应该不少人都知道ResourcesChecker这个编辑器扩展,当我们一个工程到了中后期,如果没有严格的做资源的管理总是会存在很多无用的UI、贴图、材质球或者FBX,但是这个时候我们往往也不想或者不敢乱删,生怕一不小心删掉了使用的资源。于是,我们就需要知道哪些资源是在使用的,哪些资源是无用的,国外一个大佬写了这个编辑器扩展,(原大佬的贴找不到了,找到了雨松MOMO的,大家可以看看)
雨松大佬帖子传送门,老早就收藏了,但一直没怎么用,懒嘛,不丢人。最近闲暇了就掏出来整理一下工程,突然发现贴图UI有全部选中功能,但是材质没有,那可不行啊,我材质也挺多的啊,于是就仿照着贴图的全选自己添了一个上去,有需要的小伙伴自取吧。
using System;
using System.Linq;
using UnityEngine;
using UnityEngine.UI;
using UnityEditor;
using System.Collections.Generic;
using System.Reflection;
using Object = UnityEngine.Object;
public class TextureDetails : IEquatable<TextureDetails>
{
public bool isCubeMap;
public int memSizeKB;
public Texture texture;
public TextureFormat format;
public int mipMapCount;
public List<Object> FoundInMaterials=new List<Object>();
public List<Object> FoundInRenderers=new List<Object>();
public List<Object> FoundInAnimators = new List<Object>();
public List<Object> FoundInScripts = new List<Object>();
public List<Object> FoundInGraphics = new List<Object>();
public List<Object> FoundInButtons = new List<Object>();
public bool isSky;
public bool instance;
public bool isgui;
public TextureDetails()
{
}
public bool Equals(TextureDetails other)
{
return texture != null && other.texture != null &&
texture.GetNativeTexturePtr() == other.texture.GetNativeTexturePtr();
}
public override int GetHashCode()
{
return (int)texture.GetNativeTexturePtr();
}
public override bool Equals(object obj)
{
return Equals(obj as TextureDetails);
}
};
public class MaterialDetails
{
public Material material;
public List<Renderer> FoundInRenderers=new List<Renderer>();
public List<Graphic> FoundInGraphics=new List<Graphic>();
public bool instance;
public bool isgui;
public bool isSky;
public MaterialDetails()
{
instance = false;
isgui = false;
isSky = false;
}
};
public class MeshDetails
{
public Mesh mesh;
public List<MeshFilter> FoundInMeshFilters=new List<MeshFilter>();
public List<SkinnedMeshRenderer> FoundInSkinnedMeshRenderer=new List<SkinnedMeshRenderer>();
public bool instance;
public MeshDetails()
{
instance = false;
}
};
public class MissingGraphic{
public Transform Object;
public string type;
public string name;
}
public class ResourceChecker : EditorWindow {
string[] inspectToolbarStrings = {"Textures", "Materials","Meshes"};
string[] inspectToolbarStrings2 = {"Textures", "Materials","Meshes", "Missing"};
enum InspectType
{
Textures,Materials,Meshes,Missing
};
bool IncludeDisabledObjects=true;
bool IncludeSpriteAnimations=true;
bool IncludeScriptReferences=true;
bool IncludeGuiElements=true;
bool thingsMissing = false;
InspectType ActiveInspectType=InspectType.Textures;
float ThumbnailWidth=40;
float ThumbnailHeight=40;
List<TextureDetails> ActiveTextures=new List<TextureDetails>();
List<MaterialDetails> ActiveMaterials=new List<MaterialDetails>();
List<MeshDetails> ActiveMeshDetails=new List<MeshDetails>();
List<MissingGraphic> MissingObjects = new List<MissingGraphic> ();
Vector2 textureListScrollPos=new Vector2(0,0);
Vector2 materialListScrollPos=new Vector2(0,0);
Vector2 meshListScrollPos=new Vector2(0,0);
Vector2 missingListScrollPos = new Vector2 (0,0);
int TotalTextureMemory=0;
int TotalMeshVertices=0;
bool ctrlPressed=false;
static int MinWidth=475;
Color defColor;
bool collectedInPlayingMode;
[MenuItem ("Window/Resource Checker")]
static void Init ()
{
ResourceChecker window = (ResourceChecker) EditorWindow.GetWindow (typeof (ResourceChecker));
window.CheckResources();
window.minSize=new Vector2(MinWidth,475);
}
void OnGUI ()
{
defColor = GUI.color;
IncludeDisabledObjects = GUILayout.Toggle(IncludeDisabledObjects, "Include disabled objects", GUILayout.Width(300));
IncludeSpriteAnimations = GUILayout.Toggle(IncludeSpriteAnimations, "Look in sprite animations", GUILayout.Width(300));
GUI.color = new Color (0.8f, 0.8f, 1.0f, 1.0f);
IncludeScriptReferences = GUILayout.Toggle(IncludeScriptReferences, "Look in behavior fields", GUILayout.Width(300));
GUI.color = new Color (1.0f, 0.95f, 0.8f, 1.0f);
IncludeGuiElements = GUILayout.Toggle(IncludeGuiElements, "Look in GUI elements", GUILayout.Width(300));
GUI.color = defColor;
GUILayout.BeginArea(new Rect(position.width-85,5,100,65));
if (GUILayout.Button("Calculate",GUILayout.Width(80), GUILayout.Height(40)))
CheckResources();
if (GUILayout.Button("CleanUp",GUILayout.Width(80), GUILayout.Height(20)))
Resources.UnloadUnusedAssets();
GUILayout.EndArea();
RemoveDestroyedResources();
GUILayout.Space(30);
if (thingsMissing == true) {
EditorGUI.HelpBox (new Rect(8,75,300,25),"Some GameObjects are missing graphical elements.", MessageType.Error);
}
GUILayout.BeginHorizontal();
GUILayout.Label("Textures "+ActiveTextures.Count+" - "+FormatSizeString(TotalTextureMemory));
GUILayout.Label("Materials "+ActiveMaterials.Count);
GUILayout.Label("Meshes "+ActiveMeshDetails.Count+" - "+TotalMeshVertices+" verts");
GUILayout.EndHorizontal();
if (thingsMissing == true) {
ActiveInspectType = (InspectType)GUILayout.Toolbar ((int)ActiveInspectType, inspectToolbarStrings2);
} else {
ActiveInspectType = (InspectType)GUILayout.Toolbar ((int)ActiveInspectType, inspectToolbarStrings);
}
ctrlPressed=Event.current.control || Event.current.command;
switch (ActiveInspectType)
{
case InspectType.Textures:
ListTextures();
break;
case InspectType.Materials:
ListMaterials();
break;
case InspectType.Meshes:
ListMeshes();
break;
case InspectType.Missing:
ListMissing();
break;
}
}
private void RemoveDestroyedResources()
{
if (collectedInPlayingMode != Application.isPlaying)
{
ActiveTextures.Clear();
ActiveMaterials.Clear();
ActiveMeshDetails.Clear();
MissingObjects.Clear ();
thingsMissing = false;
collectedInPlayingMode = Application.isPlaying;
}
ActiveTextures.RemoveAll(x => !x.texture);
ActiveTextures.ForEach(delegate(TextureDetails obj) {
obj.FoundInAnimators.RemoveAll(x => !x);
obj.FoundInMaterials.RemoveAll(x => !x);
obj.FoundInRenderers.RemoveAll(x => !x);
obj.FoundInScripts.RemoveAll(x => !x);
obj.FoundInGraphics.RemoveAll(x => !x);
});
ActiveMaterials.RemoveAll(x => !x.material);
ActiveMaterials.ForEach(delegate(MaterialDetails obj) {
obj.FoundInRenderers.RemoveAll(x => !x);
obj.FoundInGraphics.RemoveAll(x => !x);
});
ActiveMeshDetails.RemoveAll(x => !x.mesh);
ActiveMeshDetails.ForEach(delegate(MeshDetails obj) {
obj.FoundInMeshFilters.RemoveAll(x => !x);
obj.FoundInSkinnedMeshRenderer.RemoveAll(x => !x);
});
TotalTextureMemory = 0;
foreach (TextureDetails tTextureDetails in ActiveTextures) TotalTextureMemory += tTextureDetails.memSizeKB;
TotalMeshVertices = 0;
foreach (MeshDetails tMeshDetails in ActiveMeshDetails) TotalMeshVertices += tMeshDetails.mesh.vertexCount;
}
int GetBitsPerPixel(TextureFormat format)
{
switch (format)
{
case TextureFormat.Alpha8: // Alpha-only texture format.
return 8;
case TextureFormat.ARGB4444: // A 16 bits/pixel texture format. Texture stores color with an alpha channel.
return 16;
case TextureFormat.RGBA4444: // A 16 bits/pixel texture format.
return 16;
case TextureFormat.RGB24: // A color texture format.
return 24;
case TextureFormat.RGBA32: //Color with an alpha channel texture format.
return 32;
case TextureFormat.ARGB32: //Color with an alpha channel texture format.
return 32;
case TextureFormat.RGB565: // A 16 bit color texture format.
return 16;
case TextureFormat.DXT1: // Compressed color texture format.
return 4;
case TextureFormat.DXT5: // Compressed color with alpha channel texture format.
return 8;
/*
case TextureFormat.WiiI4: // Wii texture format.
case TextureFormat.WiiI8: // Wii texture format. Intensity 8 bit.
case TextureFormat.WiiIA4: // Wii texture format. Intensity + Alpha 8 bit (4 + 4).
case TextureFormat.WiiIA8: // Wii texture format. Intensity + Alpha 16 bit (8 + 8).
case TextureFormat.WiiRGB565: // Wii texture format. RGB 16 bit (565).
case TextureFormat.WiiRGB5A3: // Wii texture format. RGBA 16 bit (4443).
case TextureFormat.WiiRGBA8: // Wii texture format. RGBA 32 bit (8888).
case TextureFormat.WiiCMPR: // Compressed Wii texture format. 4 bits/texel, ~RGB8A1 (Outline alpha is not currently supported).
return 0; //Not supported yet
*/
case TextureFormat.PVRTC_RGB2:// PowerVR (ios) 2 bits/pixel compressed color texture format.
return 2;
case TextureFormat.PVRTC_RGBA2:// PowerVR (iOS) 2 bits/pixel compressed with alpha channel texture format
return 2;
case TextureFormat.PVRTC_RGB4:// PowerVR (iOS) 4 bits/pixel compressed color texture format.
return 4;
case TextureFormat.PVRTC_RGBA4:// PowerVR (iOS) 4 bits/pixel compressed with alpha channel texture format
return 4;
case TextureFormat.ETC_RGB4:// ETC (GLES2.0) 4 bits/pixel compressed RGB texture format.
return 4;
case TextureFormat.BGRA32:// Format returned by iPhone camera
return 32;
}
return 0;
}
int CalculateTextureSizeBytes(Texture tTexture)
{
int tWidth=tTexture.width;
int tHeight=tTexture.height;
if (tTexture is Texture2D)
{
Texture2D tTex2D=tTexture as Texture2D;
int bitsPerPixel=GetBitsPerPixel(tTex2D.format);
int mipMapCount=tTex2D.mipmapCount;
int mipLevel=1;
int tSize=0;
while (mipLevel<=mipMapCount)
{
tSize+=tWidth*tHeight*bitsPerPixel/8;
tWidth=tWidth/2;
tHeight=tHeight/2;
mipLevel++;
}
return tSize;
}
if (tTexture is Texture2DArray)
{
Texture2DArray tTex2D=tTexture as Texture2DArray;
int bitsPerPixel=GetBitsPerPixel(tTex2D.format);
int mipMapCount=10;
int mipLevel=1;
int tSize=0;
while (mipLevel<=mipMapCount)
{
tSize+=tWidth*tHeight*bitsPerPixel/8;
tWidth=tWidth/2;
tHeight=tHeight/2;
mipLevel++;
}
return tSize*((Texture2DArray)tTex2D).depth;
}
if (tTexture is Cubemap) {
Cubemap tCubemap = tTexture as Cubemap;
int bitsPerPixel = GetBitsPerPixel (tCubemap.format);<以上是关于Unity资源占用检查Resourceschecker的主要内容,如果未能解决你的问题,请参考以下文章
Unity3D插件Build Report Tool插件,Build报告,优化包体,查看资源占用