代码参考

代码文件参考下述详解的类图,工程参考第零章工程说明

概述

在游戏项目中有很多资产如:预制体,图片,音频,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:二、资源管理的更多相关文章

  1. DTCMS插件的制作实例电子资源管理(二)Admin后台页面编写

    总目录 插件目录结构(一) Admin后台页面编写(二) 前台模板页编写(三) URL重写(四) 本实例旨在以一个实际的项目中的例子来介绍如何在dtcms中制作插件,本系列文章非入门教程,部分逻辑实现 ...

  2. Solaris系统管理(二)资源管理与网络配置

    上一篇主要总结了Solaris安装后需要进行的一些设置,如ssh,pkgutil管理依赖,vim安装. 这一篇将会对Solaris资源管理与网络配置进行总结. 四 Solaris 系统管理 1,查询总 ...

  3. Hadoop 学习之路(二)—— 集群资源管理器 YARN

    一.hadoop yarn 简介 Apache YARN (Yet Another Resource Negotiator) 是hadoop 2.0 引入的集群资源管理系统.用户可以将各种服务框架部署 ...

  4. Hadoop 系列(二)—— 集群资源管理器 YARN

    一.hadoop yarn 简介 Apache YARN (Yet Another Resource Negotiator) 是 hadoop 2.0 引入的集群资源管理系统.用户可以将各种服务框架部 ...

  5. 必须要注意的 C++ 动态内存资源管理(二)——指针对象简单实现

    必须要注意的 C++动态内存资源管理(二)——指针对象简单实现 四.拷贝类型的资源         上节我们说过,对于图片类型的资源我们有时候往往采用拷贝(如果对于那种公共图片,可能采用唯一副本,提供 ...

  6. Unity接入多个SDK的通用接口开发与资源管理(二)

    接着上篇,本篇对SDK接口进行封装.在开始之前,需要先了解下面知识. (1)unity与android之间的交互 unity通过下面方式调用android中的函数: 方法一: AndroidJavaC ...

  7. Oracle资源管理器(二)-- 创建和使用数据库资源计划

    (参考 http://blog.csdn.net/mrluoe/article/details/7969436 -- 整理并实践通过) 第1步,创建3个用户 SQL> create user s ...

  8. 15.4-uC/OS-III资源管理(二值信号量)

    互斥信号量是 uC/OS 操作系统的一个内核对象, 与多值信号量非常相似,但它是二值的,只能是 0 或 1,所以也叫二值信号量, 主要用于保护资源. 1.如果想要使用互斥信号量,就必须事先使能互斥信号 ...

  9. 【cocos2d-js官方文档】二、资源管理器Assets Manager

    这篇文档将介绍Cocos2d-JS 3.0的一个重量级新特性:资源管理器(仅支持JSB).资源管理器是为游戏运行时的资源热更新而设计的,这里的资源可以是图片,音频甚至游戏脚本本身.使用资源管理器,你将 ...

  10. kubernetes实战(二十八):Kubernetes一键式资源管理平台Ratel安装及使用

    1. Ratel是什么? Ratel是一个Kubernetes资源平台,基于管理Kubernetes的资源开发,可以管理Kubernetes的Deployment.DaemonSet.Stateful ...

随机推荐

  1. 我们为什么要阅读webpack源码

    相信很多人都有这个疑问,为什么要阅读源码,仅仅只是一个打包工具,会用不就行了,一些配置项在官网,或者谷歌查一查不就好了吗,诚然在大部分的时候是这样的,但这样在深入时也会遇到以下几种问题. webpac ...

  2. Oracle 服务器概念梳理

    Oracle 公司是世界上最大的信息管理软件及服务提供商,因其复杂的关系数据库产品而闻名.Oracle 的关系数据库是世界上第一个支持 SQL 语言的数据库.支持服务器/客户机等部署.Oracle 数 ...

  3. 30张图说清楚 TCP 协议

    大家好,我是风筝 前两天分享了 20张图说清楚 IP 协议 今天,继续来网管的自我修养之TCP协议,这可是除 IP 协议外另一个核心协议了. TCP 协议是网络传输中至关重要的一个协议,它位于传输层. ...

  4. webpack踩坑日记

    webpack 4.x 详细入门这是一个大佬的总结,但是我用webpack5重写该demo时,发现了几个有问题的地方1:CleanWebpackPlugin 应该这样: const { CleanWe ...

  5. cephadm 安装部署 ceph 集群

    介绍 手册: https://access.redhat.com/documentation/zh-cn/red_hat_ceph_storage/5/html/architecture_guide/ ...

  6. 有关Spring的ioc理解之代理模式

    AOP代理模式可以实现事务控制和业务逻辑代码横切. 使用代理模式,动态代理实现横切. 什么是代理? 接口就是指定要做的事情,要实现的逻辑. 代理类似于房源租房 public interface ZuF ...

  7. 前端里那些你不知道的事儿之 【window.onload】

    作者:京东科技 孙凯 一.前言 相信很多前端开发者在做项目时同时也都做过页面性能优化,这不单是前端的必备职业技能,也是考验一个前端基础是否扎实的考点,而性能指标也通常是每一个开发者的绩效之一.尤其马上 ...

  8. Message源码分析

    Message 在Android中主要是在 消息循环机制 中使用,即配合 Handler,Looper和MessageQueue来进行线程切换,线程间传递数据.Message存储了我们所有需要的东西. ...

  9. 你真的懂synchronized锁?

    1. 前言 synchronized在我们的程序中非常的常见,主要是为了解决多个线程抢占同一个资源.那么我们知道synchronized有多种用法,以下从实践出发,题目由简入深,看你能答对几道题目? ...

  10. docker启动mysql注意事项

    1.编码问题 登录mysql伪终端 mysql查看编码 show variables like 'character%'; 宿主机在conf.d中添加配置my.cnf文件 [client] defau ...