U3DFrameWorkDemo:二、资源管理
代码参考
代码文件参考下述详解的类图,工程参考第零章工程说明
概述
在游戏项目中有很多资产如:预制体,图片,音频,Lua脚本,Shader等等。他们随打包放在用户的硬盘里。在游戏的运行过程中,需要对这些资产加载和卸载,资源管理模块负责做这些事情。
思路
- U3D会托管资产,也就是说资产一旦被加载就被U3D引擎的资源管理所引用,所以即使我们没有引用该资产它也不会被GC释放掉。这就要求开发者自行维护资产的引用计数,在合适的时机调用接口把资产从引擎托管中卸载掉。
- 如果效率要求不高的话,U3D提供了UnloadUnuseAssets来卸载没有被引用的资产,这个方法会遍历场景所有Mono中的资源引用,比较耗。
- 有些引擎如UE4能自行维护资产的引用和GC标记,没有上述问题。
- U3D在打包的时候,会把资产打入类似常用的压缩包的AB包中,U3D的资产加载和卸载首先是加载和卸载AB包,通过AB包来加载和卸载资源,所以在维护资产的引用计数的同时还需要考虑AB包的引用。
- 如果在打包的时候资产A引用了资产B,那么资产B要在在资产A之前加载,如果资产B和资产A不在一个AB,那么需要先加载资产B所在的AB包。这种情况下,U3D会把资产B所在的AB包添加到资产A的AB包的依赖包列表中,开发者在加载AB包时需先加载所有的依赖包并添加引用计数。
- 在开发环境和正式包加载资产的方式不同,开发环境中中通常不会使用AB包加载资产
- 资产使用的过程中,有一些场合资产会被反复的加载/卸载,例如点击来回点击页签时背景图反复切换,比较耗。需要延迟卸载资源,使用缓存策略。
- 有些资产资产比较大,加载比较耗,为了保持游戏的流畅运行,资产的加载需要异步加载,此时还需考虑异步加载状态
- 一些成熟的项目还需要资源、内存等分析
详解
资源管理系统

- AssetFacade:门面(外观)模式,隐藏资源管理的细节,对外提供必要的接口。
- BundleLocaMgr:资源寻址
- FindNode:搜索树
- AssetMgr:管理资产
- AssetInfo:用于管理资产的数据信息
- BundleMgr:AB包管理
- BundleInfo:用于AB包管理的数据
用户接口

- AssetOp:资源句柄,隐藏资源校验、异步、防泄漏等细节,通过句柄释放资源。
- AssetLoader:托管资源加载、卸载,加载时可以指定key自动卸载上一个资源。
资源加载


- 检查缓存和垃圾池,命中直接返回
- 检查运行环境,选择加载策略
- 检查异步状态
- 更新资源引用计数
AB包加载

- 检查缓存和垃圾池,命中直接返回
- 加载依赖包
- 更新引用计数
资源卸载

- 检查AssetOp句柄释放已被释放
- 更新引用计数,为零则进入垃圾池并检查垃圾池溢出的资源进行卸载
- 检查运行环境,选择卸载策略,注意正式环境下的卸载语义是减少AB包的引用计数,AB包卸载时才会真正卸载
AB包卸载

- 更新引用计数,计数为0进入垃圾池
- 检查垃圾池溢出,溢出的AB包卸载掉并更新依赖包的引用计数
备注
- 使用该模块的开发者需要手动在合适的时机卸载资源,但是为托底防止漏内存,句柄没有被释放而被GC时会去卸载资源。
- LuaLoder托管资源加载有相当的局限性,在很多时候还是需要开发者自己释放资源。特殊情况下,为特定的资源或模块定制Loder。如:UIImage设置图片时,可以以UIImage对象为key去记录资源,当UIImage设置其他图片释放记录的资源。
- 成熟的方案参考YooAsset
U3DFrameWorkDemo:二、资源管理的更多相关文章
- DTCMS插件的制作实例电子资源管理(二)Admin后台页面编写
总目录 插件目录结构(一) Admin后台页面编写(二) 前台模板页编写(三) URL重写(四) 本实例旨在以一个实际的项目中的例子来介绍如何在dtcms中制作插件,本系列文章非入门教程,部分逻辑实现 ...
- Solaris系统管理(二)资源管理与网络配置
上一篇主要总结了Solaris安装后需要进行的一些设置,如ssh,pkgutil管理依赖,vim安装. 这一篇将会对Solaris资源管理与网络配置进行总结. 四 Solaris 系统管理 1,查询总 ...
- Hadoop 学习之路(二)—— 集群资源管理器 YARN
一.hadoop yarn 简介 Apache YARN (Yet Another Resource Negotiator) 是hadoop 2.0 引入的集群资源管理系统.用户可以将各种服务框架部署 ...
- Hadoop 系列(二)—— 集群资源管理器 YARN
一.hadoop yarn 简介 Apache YARN (Yet Another Resource Negotiator) 是 hadoop 2.0 引入的集群资源管理系统.用户可以将各种服务框架部 ...
- 必须要注意的 C++ 动态内存资源管理(二)——指针对象简单实现
必须要注意的 C++动态内存资源管理(二)——指针对象简单实现 四.拷贝类型的资源 上节我们说过,对于图片类型的资源我们有时候往往采用拷贝(如果对于那种公共图片,可能采用唯一副本,提供 ...
- Unity接入多个SDK的通用接口开发与资源管理(二)
接着上篇,本篇对SDK接口进行封装.在开始之前,需要先了解下面知识. (1)unity与android之间的交互 unity通过下面方式调用android中的函数: 方法一: AndroidJavaC ...
- Oracle资源管理器(二)-- 创建和使用数据库资源计划
(参考 http://blog.csdn.net/mrluoe/article/details/7969436 -- 整理并实践通过) 第1步,创建3个用户 SQL> create user s ...
- 15.4-uC/OS-III资源管理(二值信号量)
互斥信号量是 uC/OS 操作系统的一个内核对象, 与多值信号量非常相似,但它是二值的,只能是 0 或 1,所以也叫二值信号量, 主要用于保护资源. 1.如果想要使用互斥信号量,就必须事先使能互斥信号 ...
- 【cocos2d-js官方文档】二、资源管理器Assets Manager
这篇文档将介绍Cocos2d-JS 3.0的一个重量级新特性:资源管理器(仅支持JSB).资源管理器是为游戏运行时的资源热更新而设计的,这里的资源可以是图片,音频甚至游戏脚本本身.使用资源管理器,你将 ...
- kubernetes实战(二十八):Kubernetes一键式资源管理平台Ratel安装及使用
1. Ratel是什么? Ratel是一个Kubernetes资源平台,基于管理Kubernetes的资源开发,可以管理Kubernetes的Deployment.DaemonSet.Stateful ...
随机推荐
- ElasticSearch 实现分词全文检索 - 聚合查询 cardinality
目录 ElasticSearch 实现分词全文检索 - 概述 ElasticSearch 实现分词全文检索 - ES.Kibana.IK安装 ElasticSearch 实现分词全文检索 - Rest ...
- Excel或数据库快速生成GUID
一般一些开发软件或者网站可以直接生成guid, 比如:https://www.iamwawa.cn/guid.html 但是在某些场景下,经常在一些excel或者数据库操作需要快速生成指定格式的gui ...
- vue:路由守卫
路由守卫 作用:对路由进行权限控制 配置路由守卫应在暴露前配置 分类:全局守卫.独享守卫.组件内守卫 首先先给需要鉴权的路由设置好meta配置项. meta配置项:是vue-router中的一个对象, ...
- 随机分布和随机数生成——R语言
在人们的生活中,很多场景都需要用到随机数,例如福利彩票,车牌摇号,公共用房分配等.在用数学模型, 包括概率统计模型处理实际应用中的问题时, 我们希望建立的模型能够尽可能地符合实际情况.但是,实际情况是 ...
- 对偶问题影子价格求解—R实现
table { margin: auto } 线性规划的对偶问题 线性规划对偶问题概述 例1:某厂生产A,B, C三种产品,每种产品的单位利润分别为12,18和15,资源消耗如下表,求总利润最大的生产 ...
- python之爬虫二
10正则表达式 正则表达式(regular expression)是一种字符串匹配模式或者规则,它可以用来检索.替换那些符合特定规则的文本.正则表达式几乎适用于所有编程语言,无论是前端语言 JavaS ...
- Go语言实现网盘系统(未完)
该项目将基于go-zero和xorm go-zero中文文档: https://legacy.go-zero.dev/cn/ Xorm中文文档: http://xorm.topgoer.com/ 功能 ...
- class(类)和构造函数(原型对象)
构造函数和class的关系,还有面向对象和原型对象,其实很多人都会很困惑这些概念,这是第二次总结这些概念了,之前一次,没有class类,其实了解了构造函数,class也就很容易理解了 一. 构造函数和 ...
- C# 获取所有桌面窗口信息
窗口标题.窗口类名.是否可见.是否最小化.窗口位置和大小.窗口所在进程信息 1 private static WindowInfo GetWindowDetail(IntPtr hWnd) 2 { 3 ...
- WPF Window设置ResizeMode="NoResize"
WPF窗口设置属性ResizeMode="NoResize"时,回到桌面后,点击任意应用,都会将此窗口激活. 我们来看下详细操作: 1. WPF窗口设置属性ResizeMode 2 ...