道通天地 发表于 2023-8-18 02:35:02

# Unity 如何获取Texture 的内存大小

Unity 如何获取Texture 的内存大小

在Unity中,要获取Texture的内存文件大小,可以使用UnityEditor.TextureUtil类中的一些函数。这些函数提供了获取存储内存大小和运行时内存大小的方法。由于UnityEditor.TextureUtil是一个内部类,我们需要使用反射来访问它。
步骤


[*]导入UnityEditor命名空间和System.Reflection命名空间:
using UnityEditor;
using System.Reflection;
[*]创建一个函数来获取Texture的内存文件大小:
public static long GetTextureFileSize(Texture2D texture)
{
    long fileSize = 0;

    // 使用反射获取UnityEditor.TextureUtil类的Type
    Type textureUtilType = typeof(TextureImporter).Assembly.GetType("UnityEditor.TextureUtil");

    // 使用反射获取UnityEditor.TextureUtil类的GetStorageMemorySizeLong方法
    MethodInfo getStorageMemorySizeLongMethod = textureUtilType.GetMethod("GetStorageMemorySizeLong", BindingFlags.Static | BindingFlags.Public);

    // 调用GetStorageMemorySizeLong方法获取存储内存大小
    fileSize = (long)getStorageMemorySizeLongMethod.Invoke(null, new object[] { texture });

    return fileSize;
}
[*]创建一个函数来获取Texture的运行时内存大小:
public static long GetTextureRuntimeMemorySize(Texture2D texture)
{
    long memorySize = 0;

    // 使用反射获取UnityEditor.TextureUtil类的Type
    Type textureUtilType = typeof(TextureImporter).Assembly.GetType("UnityEditor.TextureUtil");

    // 使用反射获取UnityEditor.TextureUtil类的GetRuntimeMemorySizeLong方法
    MethodInfo getRuntimeMemorySizeLongMethod = textureUtilType.GetMethod("GetRuntimeMemorySizeLong", BindingFlags.Static | BindingFlags.Public);

    // 调用GetRuntimeMemorySizeLong方法获取运行时内存大小
    memorySize = (long)getRuntimeMemorySizeLongMethod.Invoke(null, new object[] { texture });

    return memorySize;
}示例代码

示例 1:获取Texture的存储内存大小

using UnityEngine;using UnityEditor;
using System.Reflection;public class TextureSizeExample : MonoBehaviour{        private Texture2D texture;    private void Start()    {      long fileSize = GetTextureFileSize(texture);      Debug.Log("Texture File Size: " + fileSize + " bytes");    }    private static long GetTextureFileSize(Texture2D texture)    {      long fileSize = 0;      Type textureUtilType = typeof(TextureImporter).Assembly.GetType("UnityEditor.TextureUtil");      MethodInfo getStorageMemorySizeLongMethod = textureUtilType.GetMethod("GetStorageMemorySizeLong", BindingFlags.Static | BindingFlags.Public);      fileSize = (long)getStorageMemorySizeLongMethod.Invoke(null, new object[] { texture });      return fileSize;    }}示例 2:获取Texture的运行时内存大小

using UnityEngine;using UnityEditor;
using System.Reflection;public class TextureSizeExample : MonoBehaviour{        private Texture2D texture;    private void Start()    {      long memorySize = GetTextureRuntimeMemorySize(texture);      Debug.Log("Texture Runtime Memory Size: " + memorySize + " bytes");    }    private static long GetTextureRuntimeMemorySize(Texture2D texture)    {      long memorySize = 0;      Type textureUtilType = typeof(TextureImporter).Assembly.GetType("UnityEditor.TextureUtil");      MethodInfo getRuntimeMemorySizeLongMethod = textureUtilType.GetMethod("GetRuntimeMemorySizeLong", BindingFlags.Static | BindingFlags.Public);      memorySize = (long)getRuntimeMemorySizeLongMethod.Invoke(null, new object[] { texture });      return memorySize;    }}示例 3:同时获取Texture的存储内存大小和运行时内存大小

using UnityEngine;using UnityEditor;
using System.Reflection;public class TextureSizeExample : MonoBehaviour{        private Texture2D texture;    private void Start()    {      long fileSize = GetTextureFileSize(texture);      long memorySize = GetTextureRuntimeMemorySize(texture);      Debug.Log("Texture File Size: " + fileSize + " bytes");      Debug.Log("Texture Runtime Memory Size: " + memorySize + " bytes");    }    private static long GetTextureFileSize(Texture2D texture)    {      long fileSize = 0;      Type textureUtilType = typeof(TextureImporter).Assembly.GetType("UnityEditor.TextureUtil");      MethodInfo getStorageMemorySizeLongMethod = textureUtilType.GetMethod("GetStorageMemorySizeLong", BindingFlags.Static | BindingFlags.Public);      fileSize = (long)getStorageMemorySizeLongMethod.Invoke(null, new object[] { texture });      return fileSize;    }    private static long GetTextureRuntimeMemorySize(Texture2D texture)    {      long memorySize = 0;      Type textureUtilType = typeof(TextureImporter).Assembly.GetType("UnityEditor.TextureUtil");      MethodInfo getRuntimeMemorySizeLongMethod = textureUtilType.GetMethod("GetRuntimeMemorySizeLong", BindingFlags.Static | BindingFlags.Public);      memorySize = (long)getRuntimeMemorySizeLongMethod.Invoke(null, new object[] { texture });      return memorySize;    }}注意事项


[*]确保在使用反射访问UnityEditor.TextureUtil类之前,已经导入了UnityEditor命名空间和System.Reflection命名空间。
[*]使用反射时,需要使用BindingFlags.Static | BindingFlags.Public来获取静态公共方法。
[*]在示例代码中,我们使用了Texture2D类型的变量来表示Texture,你可以根据实际情况修改代码以适应不同的Texture类型。
            本文作者:                            Blank                        
      本文链接:      
      版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
      声援博主:如果您觉得文章对您有帮助,可以点击文章右下角            【                推荐】                  一下。您的鼓励是博主的最大动力!

来源:https://www.cnblogs.com/alianblank/archive/2023/08/17/17639067.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: # Unity 如何获取Texture 的内存大小