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


    Unity 如何获取Texture 的内存大小

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

    步骤

    1. 导入UnityEditor命名空间和System.Reflection命名空间:
    using UnityEditor;
    using System.Reflection;
    
    1. 创建一个函数来获取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;
    }
    
    1. 创建一个函数来获取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
    {
        [SerializeField]
        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
    {
        [SerializeField]
        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
    {
        [SerializeField]
        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类型。
  • 相关阅读:
    ArcGis研究区边界提取
    遥感技术让农业更“智慧”北斗在精准农业领域信息化农业化的特征
    小白学习-ElasticSearch教程(3) -文档查询之term精确查询
    十年数据库专家,耗尽3年心血整理的Mycat中间实战笔记,绝对干货
    【KD】2022 ECCV Factorizing Knowledge in Neural Networks
    时隔4个月我面试字节又挂了|总结与展望
    【FreeRTOS】【STM32】04.0 FreeRTOS的使用1(创建单任务—SRAM静态内存)
    APISpace接口推荐
    文本挖掘技术研究_笔记
    蓝桥杯嵌入式基础模块——定时器的基本作用(新板)STM32G431(HAL库开发)
  • 原文地址:https://www.cnblogs.com/alianblank/p/17639067.html