首页 > 系统相关 >使用Addressable更好的管理内存

使用Addressable更好的管理内存

时间:2023-04-28 15:06:32浏览次数:38  
标签:Prefab 更好 场景 Addressable 内存 测试 加载


你好,我是郑洪智,你可以叫我大智。我正在带小新学Unity。

洪流学堂公众号回复addr,可以下载Addressable中文手册,更有视频教程哦~


小新:“智哥,Assetbundle我只是大概学了一下,但是没咋用过。你说不用它就会有内存问题?”

大智:“咱们来一起做个测试吧。对于工程里的资源,一般有三种方式加载实例化:”

  • 场景中的脚本直接在Inspector上引用Prefab
  • 资源放在Resources目录下,通过Resource.Load加载
  • 使用Assetbundle动态加载

直接引用测试

测试1

首先咱们新建一个工程,先整个空场景,使用Profiler先看一下现在的内存占用情况。由于在Editor里面干扰因素比较多,咱们发布出来测试这个空场景的内存,发布时选中这个:

使用Addressable更好的管理内存_贴图

在Unity中打开Profiler(Window > Analysis > Profiler, 快捷键Ctrl+7),然后打开打包好的程序,程序就会自动连上:

使用Addressable更好的管理内存_加载_02

可以看到现在的总内存占用是:267M,其中贴图占了75.3M。

测试2

然后给场景里面添加一个简单的脚本,使用public GameObject Prefab;定义一个成员变量。

using UnityEngine;

public class DirectReference : MonoBehaviour
{
    public GameObject ObjPrefab;
}

然后将一个Cube的Prefab拖到这个成员变量上面。Cube上面的材质球带了一张5.3M文件大小的贴图。

使用Addressable更好的管理内存_加载_03

发布测试:

使用Addressable更好的管理内存_加载_04

以上测试如果在编辑器中测试,会有不准确的地方,但也能看出大概的趋势。如果想要准确的数值可以打包发布以后链接Proflier测试。

可以看到现在的总内存占用是:297M,其中贴图占了80.6M。

对比就会发现即使Prefab没有在场景中实例化,依然占用了内存,这些内存是无法释放掉的。这还仅仅是一个Prefab,很多时候会用到Prefab数组,内存问题就会更严重。

Resources目录测试

测试3

把场景中的脚本去掉,这样就没有直接引用了。把Prefab放到Resources文件夹下,打包测试。

使用Addressable更好的管理内存_贴图_05

这种情况下你会发现和空场景是一致的,没有内存问题。但是仅仅是这样就完了么?

但是Unity官方是不建议使用Resources目录的,引用一段原话就是:

使用Addressable更好的管理内存_加载_06

Assetbundle/Addressable

Addressable是基于Assetbundle的一个资产管理系统。使用Addressable可以通过弱引用的方式来加载资源,不加载之前是没有内存消耗的,加载后也可以完全卸载掉,对内存管理十分友好。

总结

使用Addressable已经很简单了,所以大胆尝试去使用这个系统吧,会给你带来很多益处~

洪流学堂公众号回复addr,可以下载《Addressable中文手册》,更有视频教程哦~


标签:Prefab,更好,场景,Addressable,内存,测试,加载
From: https://blog.51cto.com/u_5746184/6234174

相关文章

  • 【GPU基础问题】GPU内存占用率很高利用率很低
    前言 问题描述查看nvidia-smi,发现显存占比很高,但是GPU-Util(GPU利用率)很低,在3%、7%、11%等几个参数之间反复跳动。watch-n0.5nvidia-smi也就是显卡并没有完全利用起来,导致训练很慢。原因分析GPU内存占用率(memoryusage) GPU内存利用率(volatileGPU-Util)  ......
  • java方法的内存及练习
    方法的内存一、方法调用的基本内存原理:Java内存分配栈:方法运行时使用的内存方法进栈运行,运行完毕就出栈堆:newl出来的,都在堆内存中开辟了一个小空间方法区:存储可以运行的class文件本地方法栈:JVM在使用操作系统功能的时候使用和我们开发无关寄存器:给CPU使用和......
  • 10 如何表示虚拟内存
    x86CPU的虚拟地址空间划分:一个应用往往拥有很大的连续地址空间,并且每个应用都是一样的,只有在运行时才能分配到真正的物理内存,在操作系统中被称为虚拟内存;x86CPU支持虚拟地址时要么开启保护模式要么开启长模式;保护模式下是32位,没有进行任何划分;长模式下64位,但是CPU只是实现了4......
  • Linux 内存管理 pt.1
    哈喽大家好,我是咸鱼 今天我们来学习一下Linux操作系统核心之一:内存 跟CPU一样,内存也是操作系统最核心的功能之一,内存主要用来存储系统和程序的指令、数据、缓存等 关于内存的学习,我会尽量以通俗易懂的方式且分成多篇文章去讲解 那么今天在pt.1文章中,我们来学习......
  • Jenkins java程序占用内存大 优化
       Linux系统下使用top命令,再输入M按钮,按照内存排序每个进程,发现jenkins占据内存过大,如下:   解决方式输入命令vim/etc/sysconfig/jenkins编辑jenkins文件,修改JENKINS_JAVA_OPTIONS属性:原来的属性如下: JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true"  ......
  • 内存分页
    publicstatic<T>PageResult<T>newPage(List<T>content,IntegerpageNum,Integerpages){inttotal=content.size();intoffset=(pageNum-1)*pages;if(offset>total){returnnewPageResult<T>(null,pag......
  • c语言和python语言写爬虫哪个更好 ?
    c语言和python语言写脚本那个更好?这取决于具体的应用场景和需求。C语言是一种高效、灵活的编程语言,适合于底层系统开发、操作系统、嵌入式开发等领域。C语言可以直接操作内存,因此可以更好地控制程序的性能和资源利用。Python语言则是一种高级编程语言,具有简洁、易读、易写等特点......
  • SpringBoot SpringSecurity 介绍(基于内存的验证)
    SpringBoot集成SpringSecurity+MySQL+JWT附源码,废话不多直接盘SpringBoot已经为用户采用默认配置,只需要引入pom依赖就能快速启动SpringSecurity。目的:验证请求用户的身份,提供安全访问优势:基于Spring,配置方便,减少大量代码内置访问控制方法permitAll()表示所匹配的......
  • 音视频八股文(6)-- ffmpeg大体介绍和内存模型
    播放器框架常用音视频术语•容器/文件(Conainer/File):即特定格式的多媒体文件,比如mp4、flv、mkv等。•媒体流(Stream):表示时间轴上的一段连续数据,如一段声音数据、一段视频数据或一段字幕数据,可以是压缩的,也可以是非压缩的,压缩的数据需要关联特定的编解码器(有些码流音频他是纯PCM)......
  • 09 管理内存对象
    建立内存页面管理器:既可以分配单个页面,也可以分配多个连续的页面,还能指定在特殊内存地址区域中分配页面;但是这种分配至少是一个页面4KB大小,无法分配一个小于单页大小的内存;malloc函数启发:内存对象:设计:页基础上进行细分,分成32字节、64、128、256、512、1024、2048、4096字节......