可寻址系统资源 -- 加载和资源释放 -- 进阶(二)
概述:本篇文章从资源加载的方式和具体示例演示,为大家介绍可寻址资源系统的资源加载和资源释放。
同步异步相关概念:
同步:是指一个进程在执行某个请求的时候,如果该请求需要一段时间才能返回信息,那么这个进程会一直等待下去,直到收到返回信息才继续执行下去。
异步:是指进程不需要一直等待下去,而是继续执行下面的操作,不管其他进程的状态,当有信息返回的时候会通知进程进行处理。
举个简单的例子帮助理解:你打游戏口渴了想喝水
实战中同步异步的对比
在一般加载中我们通常使用的:Instantiate 来实例化预制。
同步实例化问题:
使用AA系统时 使用InstantiateAsyns替换Instantiate :
异步实例化:
Addressables资源加载模式有三个。
如下图,默认情况下是Use Asset Database (fastest):

三种模式使用时机:
AssetReference的资源引用(Asset)会清空 但AsyncOperationHandle类的资源引用(Result)不为空在:Windos -> Asset Management --> Addressables --> Event Viewer 打开工具面板:

找到Addressable 的设置面板,开启Send Profiler Events ,即可在Event Viewer面板上看到资源使用情况了:

此工具可以直观的看到,程序运行时的资源引用。
可寻址资源组还是用的前面文章中创建的:此处用到一个Cube,一个Logo,若你没看过之前的问题,新建一下这两个即可到默认分组即可:

使用InstantiateAsync实例化物体:
搭建测试场景,创建三个按钮分别为:实例化资源,删除实例化,释放资源:

测试代码如下:
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.UI;
public class ReleaseManager : MonoBehaviour
{
public Button Btn_Load;
public Button Btn_Destory;
public Button Btn_UnLoad;
private GameObject Cube;
void Start()
{
Addressables.InitializeAsync();
Btn_Load.onClick.AddListener(LoadGameObject);
Btn_Destory.onClick.AddListener(OnClickDestroyObj);
Btn_UnLoad.onClick.AddListener(ReleaseGameObject);
}
/// <summary>
/// 加载物体
/// </summary>
void LoadGameObject()
{
Addressables.InstantiateAsync("Cube").Completed += (hal) =>
{
Cube = hal.Result;
};
}
/// <summary>
/// 释放
/// </summary>
void ReleaseGameObject()
{
Addressables.Release(Cube);
}
/// <summary>
/// 销毁
/// </summary>
void OnClickDestroyObj()
{
Destroy(Cube);
// 会自动调用Destroy,销毁物体
//Addressables.ReleaseInstance(Cube);
}
}
依次点击三个按钮资源引用情况如下:

为了做演示,我这里将资源释放和销毁分开写了,实战中若需要销毁实例化物体可以直接写:
// 释放资源,并销毁物体
Addressables.ReleaseInstance(Cube);
使用LoadAssetAsync加载图片资源:
创建一个Button用来触发加载,一个RawImage用来接收显示加载的图片,还有一个名Manager空物体用来挂载脚本:

测试示例代码如下:
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.UI;
public class ReleaseTextureManager : MonoBehaviour
{
public RawImage RawImg_Context;
public Button Btn_LoadTexture;
void Start()
{
Addressables.InitializeAsync();
Btn_LoadTexture.onClick.AddListener(LoadTexture);
}
void LoadTexture()
{
Addressables.LoadAssetAsync<Texture2D>("Logo").Completed += (hal) =>
{
// 赋值 还原大小
RawImg_Context.texture = hal.Result;
RawImg_Context.SetNativeSize();
// 释放资源
Addressables.Release(hal);
};
}
}
运行看下效果:

AA系统中的资源释放有两个方法一个是Release,另外一个ReleaseInstance。两个方法分别用于不同的情况。大致可以记忆为:Release释放不需要实例化资源,ReleaseInstance释放实例化资源。
一个错误使用示范:
使用LoadAssetAsync加载然后Instantiate实例化的,是不能通过ReleaseInstance来进行释放资源的,而通过Release来释放也只能传递handle来释放不能传递Cube这个游戏对象。
Addressables.LoadAssetAsync<GameObject>("Cube").Completed += (hal) =>
{
Cube = Instantiate(hal.Result);
handle = hal;
};
// 这么写释放不掉
//Addressables.ReleaseInstance(Cube);
// 这么写会报错
Addressables.Release(Cube);
// 正确释放方式
Addressables.Release(handle);
Destroy(Cube);
TODO:上一篇 --> Unity 之 Addressable可寻址系统 – 代码加载介绍 – 进阶(一)
TODO:下一篇 --> Unity 之 Addressable可寻址系统 – 资源远程加载 | 资源预下载 – 进阶(三)
鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub
我一直致力于让我们的Rails2.3.8应用程序在JRuby下正确运行。一切正常,直到我启用config.threadsafe!以实现JRuby提供的并发性。这导致lib/中的模块和类不再自动加载。使用config.threadsafe!启用:$rubyscript/runner-eproduction'pSim::Sim200Provisioner'/Users/amchale/.rvm/gems/jruby-1.5.1@web-services/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:105:in`co
我真的为这个而疯狂。我一直在搜索答案并尝试我找到的所有内容,包括相关问题和stackoverflow上的答案,但仍然无法正常工作。我正在使用嵌套资源,但无法使表单正常工作。我总是遇到错误,例如没有路线匹配[PUT]"/galleries/1/photos"表格在这里:/galleries/1/photos/1/edit路线.rbresources:galleriesdoresources:photosendresources:galleriesresources:photos照片Controller.rbdefnew@gallery=Gallery.find(params[:galle
电脑0x0000001A蓝屏错误怎么U盘重装系统教学分享。有用户电脑开机之后遇到了系统蓝屏的情况。系统蓝屏问题很多时候都是系统bug,只有通过重装系统来进行解决。那么蓝屏问题如何通过U盘重装新系统来解决呢?来看看以下的详细操作方法教学吧。 准备工作: 1、U盘一个(尽量使用8G以上的U盘)。 2、一台正常联网可使用的电脑。 3、ghost或ISO系统镜像文件(Win10系统下载_Win10专业版_windows10正式版下载-系统之家)。 4、在本页面下载U盘启动盘制作工具:系统之家U盘启动工具。 U盘启动盘制作步骤: 注意:制作期间,U盘会被格式化,因此U盘中的重要文件请注
在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList()Obt
?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------
本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01 客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02 数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit
目录1.AdmobSDK下载地址2.将下载好的unityPackagesdk导入到unity里编辑 3.解析依赖到项目中