代码参考

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

概述

在游戏项目中有很多资产如:预制体,图片,音频,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执行带空格的语句命令,cmd无法识别带空格路径的问题

    带空格的会识别不了 先说解决方法: 1:用cmd中的start: 在JAVA中可以如此使用: Runtime.getRuntime().exec("cmd /c start \"\ ...

  2. CSS必知必会

    CSS概念 css的使用是让网页具有统一美观的页面,css层叠样式表,简称样式表,文件后缀名.css css的规则由两部分构成:选择器以及一条或者多条声明 选择器:通常是需要改变的HTML元素 声明: ...

  3. Vue-Router 路由与配置

    ​现在的很多应用都流行SPA应用(singe page application) . 传统的项目大多使用多页面结构,需要切换内容的时候我们往往会进行单个html文件的跳转,这个时候因受到网络.性能的影 ...

  4. 发布新版博客备份功能:生成 sqlite 数据库文件,vscode 插件可查看

    大家好,最近我们重新开发了园子的博客备份功能,今天发布第一个预览版,欢迎大家试用. 点击博客后台侧边栏的博客备份进入新版博客备份: 点击创建备份按钮创建博客备份任务(目前每天只能创建一次备份),待备份 ...

  5. SpringBoot——拦截器

    更多内容,前往 IT-BLOG 一.登录时可能会出现重复提交问题.我们可以通过重定向解决此问题.例如:用户提交的请求为:/user/login,通过 redirect:重定向至 main.html请求 ...

  6. eval有时候也可以用,而且有奇效

    eval,一个我曾经避之不及的函数,最近我对它产生了一点新的感触:eval有时候也可以用,有奇效. 一般在使用js进行开发时,是不建议使用eval这类函数的.在JavaScript中,eval可以计算 ...

  7. 安全测试之探索 windows 游戏扫雷

    作者:京东工业 宛煜昕 扫雷游戏相信很多人都从小玩过,在那个电脑游戏并不多的时代,扫雷成为玩的热度蛮高的一款游戏之一,然而就在有一次,接触到了一次不寻常的扫雷过程,使得后来我也有了这个冲动,也来做一次 ...

  8. ECC(SM2) 简介及 C# 和 js 实现【加密知多少系列】

    〇.简介 椭圆曲线密码学(Elliptic curve cryptography:ECC),一种建立公开密钥加密的演算法,基于椭圆曲线数学.利用有限域上椭圆曲线的点构成的 Abel 群离散对数难解性, ...

  9. 安装 Metrics server

    安装 Metrics server Metrics Server 是 Kubernetes 内置自动缩放管道的可扩展.高效的容器资源指标来源. Metrics Server 从 Kubelets 收集 ...

  10. Python 3.11.官方文档

    索引 模块 | Python » English Spanish French Japanese Korean Brazilian Portuguese Simplified Chinese Trad ...