首页 > 其他分享 >U3DFrameWorkDemo:二、资源管理

U3DFrameWorkDemo:二、资源管理

时间:2023-05-29 09:44:07浏览次数:29  
标签:AB 资产 引用 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包加载资产
  • 资产使用的过程中,有一些场合资产会被反复的加载/卸载,例如点击来回点击页签时背景图反复切换,比较耗。需要延迟卸载资源,使用缓存策略。
  • 有些资产资产比较大,加载比较耗,为了保持游戏的流畅运行,资产的加载需要异步加载,此时还需考虑异步加载状态
  • 一些成熟的项目还需要资源、内存等分析

详解

资源管理系统

image

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

用户接口

image

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

资源加载

image
image

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

AB包加载

image

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

资源卸载

image

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

AB包卸载

image

  • 更新引用计数,计数为0进入垃圾池
  • 检查垃圾池溢出,溢出的AB包卸载掉并更新依赖包的引用计数

备注

  • 使用该模块的开发者需要手动在合适的时机卸载资源,但是为托底防止漏内存,句柄没有被释放而被GC时会去卸载资源。
  • LuaLoder托管资源加载有相当的局限性,在很多时候还是需要开发者自己释放资源。特殊情况下,为特定的资源或模块定制Loder。如:UIImage设置图片时,可以以UIImage对象为key去记录资源,当UIImage设置其他图片释放记录的资源。
  • 成熟的方案参考YooAsset

标签:AB,资产,引用,U3DFrameWorkDemo,卸载,资源管理,资源,加载
From: https://www.cnblogs.com/hggzhang/p/17074441.html

相关文章

  • U3DFrameWorkDemo:零、工程说明
    序言前段时间拾起U3D时,重新看了一下之前的学习资料,整理成了一个demo。主要包含框架基本模块核心功能实现。当然,这个小demo是我个人的学习和探索,如demo的中文解释,它是一个“原型”--既是它的优点,也是它的缺点。它并不是一个完整的框架,但包含其核心功能模块的实现思路,简单直接(应用......
  • U3DFrameWorkDemo:一、生命周期管理
    代码参考见工程MgrBase、GameManager等代码文件,工程参考第零章工程说明概述在游戏的项目中,有一些APP中阶段的转换节点,如:进入App,登录,切地图等。通常有一些模块只在某个阶段被使用,比如:在玩家登录后启动玩家资产管理模块,玩家切地图清理(或刷新)地图资源管理模块等等。还要注意的是这......
  • C#中使用using进行资源管理的的类型有哪些?
    在C#中,实现IDisposable接口的类型可以使用using语句进行资源管理,具体如下:1. System.IO.Stream:表示字节流的抽象类。它是所有文件I/O操作的基类,包括文件读取和写入。using(Streamstream=newFileStream("file.txt",FileMode.Open)){//使用stream对象进行文件读取操......
  • 【重学C++】01| C++ 如何进行内存资源管理?
    文章首发【重学C++】01|C++如何进行内存资源管理?前言大家好,我是只讲技术干货的会玩code,今天是【重学C++】的第一讲,我们来学习下C++的内存管理。与java、golang等自带垃圾回收机制的语言不同,C++并不会自动回收内存。我们必须手动管理堆上内存分配和释放,这往往会导致内存泄漏......
  • APP-PER-5002: Oracle 人力资源管理系统无法检索用户类型配置文件选项的值。
    打开设置“职位层次结构"窗体时提示错误:APP-PER-5002:Oracle 人力资源管理系统无法检索用户类型配置文件选项的值。请确保为您的责任正确设置此值。解决方式:为该职责(例如职责全称:PO_超级管理员(CUX)) 设置配置文件(路径:SYSTEMADMINISTRATOR>> 配置文件>>系统。)。 ......
  • hadoop -- Yarn资源管理
    YarnYARN被设计用以解决以往架构的需求和缺陷的资源管理和调度软件。ApacheHadoopYARN(YetAnotherResourceNegotiator,另一种资源协调者)是一种新的Hadoop资源管理器,它是一个通用资源管理系统和调度平台,可为上层应用提供统一的资源管理和调度,它的引入为集群在利用率、资源......
  • Win10文件资源管理器无法找到“始终显示图标,不显示缩略图”的解决办法
    来源:https://answers.microsoft.com/en-us/windows/forum/all/always-show-icons-never-thumbnails-option-not/31a04351-eaf7-4ed0-9b1f-d74682514f11顺利解决缩略图不显示的问题。有可能会问是否替换,输入yes即可。Basedfromthescreenshotthatyou'veprovided,itappears......
  • 【2】Django项目-人力资源管理系统-设计表结构
    Django项目-人力资源管理系统-设计表结构一、在models.py中编写表结构创建两张表:部门表和用户信息表fromdjango.dbimportmodels#Createyourmodelshere.classDepartment(models.Model):'''部门表'''dp_name=models.CharField(max_length=32,verbo......
  • Django项目-人力资源管理系统
    人力资源管理系统【HRMS】一、pycharm新建项目1.新建项目2.创建APP-website2.1  方法1:终端输入pythonmanage.pystartappwebsite2.2 方法2:利用Pycharm工具输入:快捷键 CTRL+ALT+R输入startappwebsite 2.3 创建完成 ......
  • Kubernetes从入门到精通 资源管理
    一资源管理介绍在kubernetes中,所有的内容都抽象为资源,用户需要通过操作资源来管理kubernetes。kubernetes的本质上就是一个集群系统,用户可以在集群中部署各种服务,所谓的部署服务,其实就是在kubernetes集群中运行一个个的容器,并将指定的程序跑在容器中。kubernetes的最小管理单......