unity内存优化Texture2D优化

2024-03-30 12:36
文章标签 内存 优化 unity texture2d

本文主要是介绍unity内存优化Texture2D优化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

作为unity开发者,我们使用memory Profiler来查看内存,本期我们项目中Texture2D的内存占有比较高,为了对这块做优化我们先看下内存的占有情况。

step1 使用memory Profiler对手机应用程序截图

打开截取后的内存页面,选择顶部UnityObjects查看下面的数据,展开Texture2D,下面是截取后的数据。
在这里插入图片描述

step2对图片数据分析

我们可以看到从直观上看纹理数据可分为两种:
情况1
有正常名字的,这类数据一般是通过本地资源加载进来的,如 Resources.Load(“资源路径”)这种方式加载进来的。
情况2
名字为No Name这种,这种文件有两种可能一种是要被销毁的,另一种是网络下载下来的图片,比如网络下载下来的头像,或者其他要展示的2D图片等等。

step3对于情况1的内存释放

正常情况下我们会采取的操作是销毁物体认为这样会回收内存处理如下

 //这样Destroy(transform.gameObject);//或者这样Destroy(gameObject);

但是通过内存分析工具可以看到这样处理后的纹理图片依然驻留在内存中。
出现这样的原因是unity的资源有一层缓存机制,不管是否被调用,在启动资源清理功能前都会驻留在内存中了。
定位到这块问题所以我们修改处理如下

  Destroy(gameObject);//卸载未回收资源Resources.UnloadUnusedAssets();//System.GC.Collect();//回收内存

这样通过资源回收处理就可以释放掉这块的内存了(亲测有效),后面的GC调用可以更保险一些,但是因为GC会导致线程卡顿影响用户体验所以不到万不得已不可乱用。

step4对于情况2的内存释放

因为我们是用的图片资源不是从本地resource加载的所以不能通过Resources.UnloadUnusedAssets这个方法卸载掉图片内存所以我们理解只需要销毁物体即可以销毁掉内存的占用即:

 //这样Destroy(transform.gameObject);//或者这样Destroy(gameObject);

但是从memory Profiler我们看到图片产生的内存还是未销毁,截图如下
在这里插入图片描述
在这里插入图片描述
从help里面我们看到虽然调用了物体的销毁处理,但是托管内存依然存在,即该对象的外部引用一直存在导致这个物体一直无法销毁,看到这里我们思路就有了即将托管对象置为空即可。

//下载头像StartCoroutine(ImageLoadManager.LoadNetImage(IvAvatar,SysConfig.instance.unityAvatar));//延迟5秒后销毁物体并置空对象StartCoroutine(LateTest());IEnumerator LateTest(){yield return new WaitForSeconds(5);Destroy(IvAvatar.gameObject);IvAvatar = null;view["Avatar/IvAvatar"] = null;view.Remove("Avatar/IvAvatar");Resources.UnloadUnusedAssets();}

最终通过将物体对象设置为空处理内存被成功回收。

这篇关于unity内存优化Texture2D优化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/861501

相关文章

C++高效内存池实现减少动态分配开销的解决方案

《C++高效内存池实现减少动态分配开销的解决方案》C++动态内存分配存在系统调用开销、碎片化和锁竞争等性能问题,内存池通过预分配、分块管理和缓存复用解决这些问题,下面就来了解一下... 目录一、C++内存分配的性能挑战二、内存池技术的核心原理三、主流内存池实现:TCMalloc与Jemalloc1. TCM

Redis过期删除机制与内存淘汰策略的解析指南

《Redis过期删除机制与内存淘汰策略的解析指南》在使用Redis构建缓存系统时,很多开发者只设置了EXPIRE但却忽略了背后Redis的过期删除机制与内存淘汰策略,下面小编就来和大家详细介绍一下... 目录1、简述2、Redis http://www.chinasem.cn的过期删除策略(Key Expir

Java内存区域与内存溢出异常的详细探讨

《Java内存区域与内存溢出异常的详细探讨》:本文主要介绍Java内存区域与内存溢出异常的相关资料,分析异常原因并提供解决策略,如参数调整、代码优化等,帮助开发者排查内存问题,需要的朋友可以参考下... 目录一、引言二、Java 运行时数据区域(一)程序计数器(二)Java 虚拟机栈(三)本地方法栈(四)J

SpringBoot中HTTP连接池的配置与优化

《SpringBoot中HTTP连接池的配置与优化》这篇文章主要为大家详细介绍了SpringBoot中HTTP连接池的配置与优化的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录一、HTTP连接池的核心价值二、Spring Boot集成方案方案1:Apache HttpCl

PyTorch高级特性与性能优化方式

《PyTorch高级特性与性能优化方式》:本文主要介绍PyTorch高级特性与性能优化方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、自动化机制1.自动微分机制2.动态计算图二、性能优化1.内存管理2.GPU加速3.多GPU训练三、分布式训练1.分布式数据

java变量内存中存储的使用方式

《java变量内存中存储的使用方式》:本文主要介绍java变量内存中存储的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍2、变量的定义3、 变量的类型4、 变量的作用域5、 内存中的存储方式总结1、介绍在 Java 中,变量是用于存储程序中数据

MySQL中like模糊查询的优化方案

《MySQL中like模糊查询的优化方案》在MySQL中,like模糊查询是一种常用的查询方式,但在某些情况下可能会导致性能问题,本文将介绍八种优化MySQL中like模糊查询的方法,需要的朋友可以参... 目录1. 避免以通配符开头的查询2. 使用全文索引(Full-text Index)3. 使用前缀索

C#实现高性能Excel百万数据导出优化实战指南

《C#实现高性能Excel百万数据导出优化实战指南》在日常工作中,Excel数据导出是一个常见的需求,然而,当数据量较大时,性能和内存问题往往会成为限制导出效率的瓶颈,下面我们看看C#如何结合EPPl... 目录一、技术方案核心对比二、各方案选型建议三、性能对比数据四、核心代码实现1. MiniExcel

MySQL索引的优化之LIKE模糊查询功能实现

《MySQL索引的优化之LIKE模糊查询功能实现》:本文主要介绍MySQL索引的优化之LIKE模糊查询功能实现,本文通过示例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一、前缀匹配优化二、后缀匹配优化三、中间匹配优化四、覆盖索引优化五、减少查询范围六、避免通配符开头七、使用外部搜索引擎八、分

在Spring Boot中浅尝内存泄漏的实战记录

《在SpringBoot中浅尝内存泄漏的实战记录》本文给大家分享在SpringBoot中浅尝内存泄漏的实战记录,结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录使用静态集合持有对象引用,阻止GC回收关键点:可执行代码:验证:1,运行程序(启动时添加JVM参数限制堆大小):2,访问 htt