本节主要叙述下,资源的释放问题。
1、我们准备了下两个资源,并且要做打包处理。

代码的代码,很简陋,只是为了说明问题。代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using System.IO;public class AssetBundleCreator
{[MenuItem("AssetBundle/Build")]private static void BuildBundle(){string outDir = "Bundles";if (!Directory.Exists(outDir)){Directory.CreateDirectory(outDir);}AssetBundleBuild[] buildList = new AssetBundleBuild[1];buildList[0].assetBundleName = "bundleDemo";string[] bundleAssets = new string[2];bundleAssets[0] = @"Assets\Prefabs\Cube.prefab";bundleAssets[1] = @"Assets\Prefabs\bg.png";buildList[0].assetNames = bundleAssets;BuildPipeline.BuildAssetBundles(outDir, buildList, BuildAssetBundleOptions.None, EditorUserBuildSettings.activeB`````````````
ildTarget);}
}

打包的结果:

2、测试过程
2.1 测试界面如下:

2.2 执行函数LoadBundle

private void LoadBundle(GameObject go){StartCoroutine(LoadAssetBundle());}private IEnumerator LoadAssetBundle(){string assetBundlePath = Application.dataPath + @"\..\Bundles\bundleDemo";WWW www = new WWW(assetBundlePath);while (!www.isDone){yield return null;}m_bundle = www.assetBundle;Debug.LogError("LoadAssetBundle over!");}

此时内存里面只有一个镜像文件,我们可以通过profile观测到:

2.3 执行一次UnloadBundleFalse,观察这个镜像文件是否被卸载掉了。

private void UnloadBundleFalse(GameObject go){m_bundle.Unload(false);Debug.LogError("UnloadBundleFalse over!");}

此时AssetBundle镜像不存在了。

2.4 执行一次LoadBundle和LoadAsset,观察内存变换。
重新运行游戏,执行一次LoadBundle,上面已经叙述。然后执行一次LoadAsset。

private void LoadAsset(GameObject go){m_textureAsset = (Texture)m_bundle.LoadAsset("bg", typeof(Texture));m_texture.mainTexture = m_textureAsset;Debug.LogError("LoadAsset over!");}

此时,我们load一张图片赋值给了UITexture组件。观察Profile的内存状态:

再看镜像文件也在:

2.5 执行一次LoadBundle、LoadAsset和UnloadAsset,观察镜像文件是否在Asset是否在?

    private void UnloadAsset(GameObject go){if (m_textureAsset != null){Resources.UnloadAsset(m_textureAsset);}Debug.LogError("UnloadAsset over!");}

镜像文件在:

Asset不在了:

2.6 执行一次LoadBundle、LoadAsset和UnloadBundleTrue

   private void UnloadBundleTrue(GameObject go){m_bundle.Unload(true);Debug.LogError("UnloadBundleTrue over!");}

镜像文件不在了:

Asset也不在了:

2.7 删除物体(绑定这个脚本的物体),然后执行一次 Resources.UnloadUnusedAssets();
测试代码:

 private void DestroyComponent(GameObject go){StartCoroutine(DestroyComp());}private IEnumerator DestroyComp(){Destroy(m_destroyComp.gameObject);yield return null;Resources.UnloadUnusedAssets();}

镜像文件在:

Asset不在:

叙述完毕。

总结:
1、镜像文件(bundle)用Unload(true),Unload(false)都可卸载掉。
2、Asset的卸载有两种方法,一种是指定类型资源强制卸载,函数为:
Resources.UnloadAsset(m_textureAsset); //这里的指定类型的资源不能是GameObject、Component,指定是Material、Texture、Mesh、AudioClip资源。
第二种卸载方式:Resources.UnloadUnusedAssets(); 这个要求必须是Asset在毫无其他引用的情况下,才能被卸载。所谓的毫无其他引用,比如你的texture被一个UI元素使用,或者被一个脚本的变量使用,没有赋值为null,这些都算作是有引用,那么即使你使用这个函数,也不能卸载Asset资源。另外补充说明一点就是:
Resources.UnloadUnusedAssets();和Resources.UnloadAsset(m_textureAsset);
前者效率很低,因为是遍历场景中的所有无引用的资源然后卸载;后者是指定卸载某一个资源,所以效率高。前者在场景切换的时候会被Unity自动调用一次,后者不会。
3、关于镜像文件和Asset以及GameObject的关系,我想画一个图来解释:

over!关于资源管理的代码,尚未完成,待叙。
最后给出,项目的完整代码:https://pan.baidu.com/s/1rvgPoTgMPNkpMOjrqSnP6g

unity资源释放(AssetBundle和Asset)相关推荐

  1. Unity资源处理机制(Assets/WWW/AssetBundle/...)读取和加载资源方式详解

    Unity资源机制 1.概述 本文意在阐述Unity资源机制相关的信息,以及一些关于个人的理解与试验结果.另外还会提及一些因机制问题可能会出现的异常以及处理建议.大部分机制信息来源于官方文档,另外为自 ...

  2. Unity资源打包之Assetbundle

    本文原创版权归 csdn janeky 所有,转载请详细注明原创作者及出处,以示尊重! 作者:janeky 原文:http://blog.csdn.net/janeky/article/details ...

  3. Unity资源打包之Asset Bundle(学习笔记)

    Asset Bundle的作用: 1.AssetBundle是一个压缩包包含模型.贴图.预制体.声音.甚至整个场景,可以在游戏运行的时候被加载: 2.AssetBundle自身保存着互相的依赖关系: ...

  4. 关于unity 中使用AssetBundle加载资源,shader偶尔会丢失的问题解决办法

    问题描述: 因为项目中要进行热更新设计,所以用unity官方推荐的打包方式assetbundle进行打包,打包好了以后再电脑上运行正常,但是当发布到android上后发现偶尔场景背景会出现空白,多方查 ...

  5. ​Unity资源Assetmport New Asset对话框

    ​Unity资源Assetmport New Asset对话框 1.2.2  资源 开发游戏一定会使用很多东西,如网格.纹理.电影.动画.声音.音乐.文本等等.这些文件都被Unity称为资源(Asse ...

  6. Unity资源加载入门

    写在前面 本文转载自:https://gameinstitute.qq.com/community/detail/123460,供自己学习用,如有疑问,请移步原创. 引言 Unity的资源加载及管理, ...

  7. Unity资源加载管理

    转载链接: https://bbs.gameres.com/thread_800362_1_1.html 我理解的资源管理 举一个不恰当的例子来描述我所理解的资源管理(因为我实在想不出更合适的例子了) ...

  8. unity 内存释放分析

    本文分析unity,资源加载释放方式 首先材质.贴图在内存中时非常消耗内存的,unity对这些资源采用的是引用计数方式即,两个Asset用同一张贴图时,贴图在内存中并不会有两份,而是共用一份.然后对贴 ...

  9. 资源打包Assetbundle .

    在手游的运营过程中,更新资源是比不可少的.资源管理第一步是资源打包.传统的打包可以将所有物件制成预设Prefab,打包成场景.今天我们来一起学习官方推荐的Assetbundle,它是Unity(Pro ...

  10. Unity文档——AssetBundle使用模式

    AssetBundle使用模式 版本检查:2017.3 - 难度:高级 这是关于Unity 5中资产,资源和资源管理的系列文章的第五章. 本系列的前一章介绍了AssetBundles的基础知识,其中包 ...

最新文章

  1. 【C++】C++11 STL算法(一):非修改序列操作(Non-modifying sequence operations)
  2. 效率思维模式与Zombie Scrum
  3. linux查看是否有用户在使用分区,在Linux服务器中有几种查看分区表的方法
  4. 7-10 逆波兰表达式求值 (20 分)(c语言)(数据结构)
  5. 21秋期末考试建筑力学与结构10126k2
  6. WCF trace、log
  7. 安卓开发语言php,go语言支持安卓开发吗
  8. 设置163的Centos6更新源
  9. 喵喵的QQ小程序登录
  10. MySQL-bin.index no found (errcode:13-perssion)
  11. 使用 golang-plugins 时要避免的事情
  12. Illustrator 教程,如何在 Illustrator 中沿路径添加文本?
  13. VIm中Python自动补全插件Pydiction
  14. Key Reinstallation Attacks: Forcing Nonce Reuse in WPA2
  15. 普中自动下载软件1.86下载程序失败
  16. 奥西tds300服务器维修,奥西Océ TDS300 驱动
  17. 【星海出品】Horizon安装
  18. 语言处理方法-Word2Vec详解
  19. C++的time_t 和 struct tm 类型【s
  20. 服务器之间文件同步 go,基于golang文件实时监控并同步远端服务器工具

热门文章

  1. 微型计算机结构五大,微型计算机的体系结构
  2. 超震惊!!微软产品经理每天的工作内容竟然是这个...
  3. 误差状态方程与雅可比矩阵
  4. Eclipse注释模板与规范
  5. IndentationError: expected an indented block解决方案
  6. 关于redis (error) CLUSTERDOWN Hash slot not served
  7. 禁止用户修改计算机的桌面背景,win10系统禁止用户修改桌面壁纸的设置方法
  8. 使用poi解析word转html,并处理word中图片
  9. 在线作图|在线做完整的Lefse分析
  10. python sorted方法