代码参考

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

概述

在游戏项目中有很多资产如:预制体,图片,音频,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. Java泛型: 主要知识点总结

    Java泛型:主要知识点总结 1 泛型的好处 解决元素存储的安全性问题. 解决获取数据元素时,需要类型强制转换的问题. Java泛型可以保证如果程序在编译时没有发出警告,运行.时就不会产生ClassC ...

  2. 方差分析3——正交表与正交实验设计(R语言)

    正交试验设计(orthogonal design简称正交设计(orthoplan),是利用正交表(orthogonal table)科学地安排与分析多因素试验的方法,是最常用的试验设计之一.正交表是一 ...

  3. Spring源码系列一:入门——Hello World

    前言 讲解Spring之前,我们首先梳理下Spring有哪些知识点可以进行入手源码分析,比如: Spring IOC依赖注入 Spring AOP切面编程 Spring Bean的声明周期底层原理 S ...

  4. 【前端基础】(二)promise异步编排

    ☆promise异步编排 javascript众所周知只能支持单线程,因此各种网络请求必须异步发送,导致可能会出现很多问题,比如如下我们有三个文件,现在要求进行如下请求: ① 查出当前用户信息 ② 根 ...

  5. 【深度学习】【图像分类网络】(二)VisionTransformer

    Transformer简介 ![1png](file:///D:/资料/学习笔记/深度学习/图像分类/transformer/Self-Attention以及Multi-Head Attention/ ...

  6. Pytorch实现分类器

    本文实现两个分类器: softmax分类器和感知机分类器 Softmax分类器 Softmax分类是一种常用的多类别分类算法,它可以将输入数据映射到一个概率分布上.Softmax分类首先将输入数据通过 ...

  7. Go语言实现基于TCP的内存缓存服务

    接上文: https://www.cnblogs.com/N3ptune/p/16623738.html HTTP/REST的解析导致基于HTTP的内存缓存服务性能不佳,本次实现一个基于TCP的缓存服 ...

  8. ARM Cortex-M4|非常好用的一种串口收发方式

    在这里分享项目中我经常使用的一种串口收发方式:阻塞发送 + 接收中断 +空闲中断 + 环形队列 项目代码地址:www.baidu.com 一.简介 串口发送使用最简单的阻塞发送方式,一般来说都是接收的 ...

  9. Django框架——可视化界面之数据增删改查、Django请求生命周期、Django路由层、反向解析

    可视化界面之数据增删改查 针对数据对象主键字段的获取可以使用更加方便的 obj.pk获取 在模型类中定义双下str方法可以在数据对象被执行打印操作的时候方便的查看 ''' form表单中能够触发调剂动 ...

  10. 再解 [NOI2017] 整数

    提供一个来自 CF 大佬 adament 的有趣思路. 首先我们知道的是一个只增加的 \(b\) 进制整数计数器,如果 \(b\) 是常数那么复杂度是均摊 \(O(1)\) 的.证明只需要考虑将 \( ...