lua 游戏架构 之 资源加载 LoaderManager (一)
定义一个 LoaderManager class,用于管理各种资源加载器。它使用了对象池(Object Pool)来优化资源加载器的创建和销毁,从而提高性能
举例定义一个 PrefabLoader
--[[Desc: 封装AAS的接口,加载Prefab
--]]---@alias PrefabLoader.CompleteDelegate fun(obj:table, l:PrefabLoader) | fun(l:PrefabLoader)---@class PrefabLoader : BaseLoader
---@field result CS.UnityEngine.GameObject
---@field callback PrefabLoader.CompleteDelegate
local PrefabLoader = SimpleClassUtil:class(require 'Topjoy.Engine.Resources.BaseLoader')PrefabLoader.intType = CS.Topjoy.Base.ResourceManagement.ResourcesUtil.TypeInts.GameObject---@overload fun(parent:CS.UnityEngine.Transform): CS.UnityEngine.GameObject | CS.UnityEngine.Object
---@overload fun(): CS.UnityEngine.GameObject | CS.UnityEngine.Object
---@param parent CS.UnityEngine.Transform
---@param worldStay boolean @默认false
---@return CS.UnityEngine.GameObject | CS.UnityEngine.Object
function PrefabLoader:instantiate(parent, worldStay)if self.result thenif parent thenreturn CS.UnityEngine.GameObject.Instantiate(self.result, parent, worldStay==true)elsereturn CS.UnityEngine.GameObject.Instantiate(self.result)endend
endreturn PrefabLoader
设计思路:
- 引入了各种资源加载器,如
AssetLoader、PrefabLoader等,这些加载器负责加载不同类型的资源。 -
initialize方法调用onInit方法进行初始化。onInit方法中,首先获取资源管理器实例,然后初始化各种资源加载器池,每个池子使用TablePool来管理对象池。 -
PrefabLoader为例,创建了一个对象池,池子大小为16。当需要新的PrefabLoader实例时,会调用传入的函数创建一个新的PrefabLoader对象,并设置其释放函数为self._assetPool:releaseObj(1) -
loadAssetAsync方法用于异步加载资源。它从对象池中获取一个PrefabLoader实例,初始化它,并调用其loadAsync方法进行异步加载。 -
release方法用于释放所有资源加载器池,并清理资源管理器实例。
注意事项
- 对象池的使用:通过对象池管理资源加载器,可以减少对象的频繁创建和销毁,提高性能。
- 异步加载:资源加载方法(如
loadAssetAsync)都是异步的,可以避免阻塞主线程。 - 资源管理器:使用
CS.Topjoy.Base.ResourceManagement.ResourceManager来管理资源加载,确保资源加载的一致性和效率。
---@class LoaderManager
local LoaderManager = SimpleClassUtil:class()local AssetLoader = require 'Topjoy.Engine.Resources.AssetLoader'
local PrefabLoader = require 'Topjoy.Engine.Resources.PrefabLoader'
local MaterialLoader = require 'Topjoy.Engine.Resources.MaterialLoader'
local TextureLoader = require 'Topjoy.Engine.Resources.TextureLoader'
local TextAssetLoader = require 'Topjoy.Engine.Resources.TextAssetLoader'
local ListSpriteLoader = require 'Topjoy.Engine.Resources.ListSpriteLoader'
local MultiAssetLoaders = require 'Topjoy.Engine.Resources.MultiAssetLoaders'
local SceneLoader = require 'Topjoy.Engine.Resources.SceneLoader'
local WwiseBankLoader = require 'Topjoy.Engine.Resources.WwiseBankLoader'
local WalletLoader = require 'Topjoy.Engine.Resources.Wallet.LoaderWallet'function LoaderManager:initialize()self:onInit()
endfunction LoaderManager:onInit()self._resourceManager = CS.Topjoy.Base.ResourceManagement.ResourceManager.Instanceself._assetPool = TablePool:new(16, function()local loader = AssetLoader:new()loader.rlsFunc = function(l)self._assetPool:releaseObj(l)endreturn loaderend)self._prefabPool = TablePool:new(16, function()local loader = PrefabLoader:new()loader.rlsFunc = function(l)self._prefabPool:releaseObj(l)endreturn loaderend)self._materialPool = TablePool:new(16, function()local loader = MaterialLoader:new()loader.rlsFunc = function(l)self._materialPool:releaseObj(l)endreturn loaderend)self._texturePool = TablePool:new(16, function()local loader = TextureLoader:new()loader.rlsFunc = function(l)self._texturePool:releaseObj(l)endreturn loaderend)self._textAssetPool = TablePool:new(16, function()local loader = TextAssetLoader:new()loader.rlsFunc = function(l)self._textAssetPool:releaseObj(l)endreturn loaderend)self._listSpritePool = TablePool:new(16, function()local loader = ListSpriteLoader:new()loader.rlsFunc = function(l)self._listSpritePool:releaseObj(l)endreturn loaderend)self._multiAssetsPool = TablePool:new(16, function()local loader = MultiAssetLoaders:new()loader.rlsFunc = function(l)self._multiAssetsPool:releaseObj(l)endreturn loaderend)self._scenePool = TablePool:new(16, function()local loader = SceneLoader:new()loader.rlsFunc = function(l)self._scenePool:releaseObj(l)endreturn loaderend)self._wwiseBankPool = TablePool:new(4, function()local loader = WwiseBankLoader:new()loader.rlsFunc = function(l)self._wwiseBankPool:releaseObj(l)endreturn loaderend)self._walletPool = TablePool:new(16,function ()local loader = WalletLoader:new()loader.rlsFunc = function(l)self._walletPool:releaseObj(l)endreturn loaderend)
endfunction LoaderManager:release()self._resourceManager = nilLogger.print("LoaderManager:release")self._assetPool:release()self._prefabPool:release()self._materialPool:release()self._texturePool:release()self._textAssetPool:release()self._listSpritePool:release()self._multiAssetsPool:release()self._scenePool:release()self._wwiseBankPool:release()self._walletPool:release()
end---@param path string
---@return AssetLoader
function LoaderManager:newAssetLoader(path)local loader = self._assetPool:getObj()loader:init(path)return loader
end---@param path string
---@param obj table @回调的self参数,可为nil
---@param data any @loader的附加参数,可通过loader.data获取
---@param callback AssetLoader.CompleteDelegate
---@return AssetLoader
function LoaderManager:loadAssetAsync(path, callback, obj, data)---@type AssetLoaderlocal loader = self._assetPool:getObj()loader:init(path)loader:loadAsync(callback, obj, data)return loader
end---@param path string
---@return PrefabLoader
function LoaderManager:newPrefabLoader(path)local loader = self._prefabPool:getObj()loader:init(path)return loader
end---@param path string
---@param obj table @回调的self参数,可为nil
---@param data any @loader的附加参数,可通过loader.data获取
---@param callback PrefabLoader.CompleteDelegate
---@return PrefabLoader
function LoaderManager:loadPrefabAsync(path, callback, obj, data)---@type PrefabLoaderlocal loader = self._prefabPool:getObj()loader:init(path)loader:loadAsync(callback, obj, data)return loader
end---@param path string
---@return MaterialLoader
function LoaderManager:newMaterialLoader(path)local loader = self._materialPool:getObj()loader:init(path)return loader
end---@param path string
---@param obj table @回调的self参数,可为nil
---@param data any @loader的附加参数,可通过loader.data获取
---@param callback MaterialLoader.CompleteDelegate
---@return MaterialLoader
function LoaderManager:loadMaterialAsync(path, callback, obj, data)---@type MaterialLoaderlocal loader = self._materialPool:getObj()loader:init(path)loader:loadAsync(callback, obj, data)return loader
end---@param path string
---@return TextureLoader
function LoaderManager:newTextureLoader(path)local loader = self._texturePool:getObj()loader:init(path)return loader
end---@param path string
---@param obj table @回调的self参数,可为nil
---@param data any @loader的附加参数,可通过loader.data获取
---@param callback TextureLoader.CompleteDelegate
---@return TextureLoader
function LoaderManager:loadTextureAsync(path, callback, obj, data)---@type TextureLoaderlocal loader = self._texturePool:getObj()loader:init(path)loader:loadAsync(callback, obj, data)return loader
end---@param path string
---@return TextAssetLoader
function LoaderManager:newTextAssetLoader(path)local loader = self._textAssetPool:getObj()loader:init(path)return loader
end---@param path string
---@param obj table @回调的self参数,可为nil
---@param data any @loader的附加参数,可通过loader.data获取
---@param callback TextAssetLoader.CompleteDelegate
---@return TextAssetLoader
function LoaderManager:loadTextAssetAsync(path, callback, obj, data)---@type TextAssetLoaderlocal loader = self._textAssetPool:getObj()loader:init(path)loader:loadAsync(callback, obj, data)return loader
end---@param path string
---@return ListSpriteLoader
function LoaderManager:newListSpriteLoader(path)local loader = self._listSpritePool:getObj()loader:init(path)return loader
end---@param path string
---@param obj table @回调的self参数,可为nil
---@param data any @loader的附加参数,可通过loader.data获取
---@param callback ListSpriteLoader.CompleteDelegate
---@return ListSpriteLoader
function LoaderManager:loadListSpriteAsync(path, callback, obj, data)---@type ListSpriteLoaderlocal loader = self._listSpritePool:getObj()loader:init(path)loader:loadAsync(callback, obj, data)return loader
end---@param callback MultiAssetLoaders.CompleteDelegate
---@return MultiAssetLoaders
function LoaderManager:loadMultiAssetAsync(callback, obj, data, ...)---@type MultiAssetLoaderslocal loader = self._multiAssetsPool:getObj()loader:init(...)loader:loadAsync(callback, obj, data)return loader
end---@param callback SceneLoader.CompleteDelegate
---@return SceneLoader
function LoaderManager:loadSceneAsync(path, callback, obj, data)---@type SceneLoaderlocal loader = self._scenePool:getObj()loader:init(path)loader:loadAsync(callback, obj, data)return loader
end---@param callback WwiseBankLoader.CompleteDelegate
---@return WwiseBankLoader
function LoaderManager:newWwiseBankLoader(path)---@type SceneLoaderlocal loader = self._wwiseBankPool:getObj()loader:init(path)return loader
end---@param owner @传self
---@return LoaderWallet
function LoaderManager:newLoaderWallet(owner)local loader = self._walletPool:getObj()loader:setOwner(owner)return loader
end---@param maxExecute number @最大同时异步加载数量
---@param maxComplete number @最大同帧回调数量
---@return CS.Topjoy.Base.ResourceManagement.OperationHandles.OperationQueue
function LoaderManager:newLoaderQueue(maxExecute, maxComplete)local queue = self._resourceManager:NewOperationQueue(maxExecute, maxComplete)return queue
end---@param queue CS.Topjoy.Base.ResourceManagement.ResourceManager
function LoaderManager:destroyLoaderQueue(queue)self._resourceManager:DestroyOperationQueue(queue)
endreturn LoaderManager
相关文章:
lua 游戏架构 之 资源加载 LoaderManager (一)
定义一个 LoaderManager class,用于管理各种资源加载器。它使用了对象池(Object Pool)来优化资源加载器的创建和销毁,从而提高性能 举例定义一个 PrefabLoader --[[Desc: 封装AAS的接口,加载Prefab --]]---alias Pre…...
【人工智能】-- 迁移学习
个人主页:欢迎来到 Papicatch的博客 课设专栏 :学生成绩管理系统 专业知识专栏: 专业知识 文章目录 🍉引言 🍉迁移学习 🍈基本概念 🍍定义 🍌归纳迁移学习(Induct…...
Flink源码学习资料
Flink系列文档脑图 由于源码分析系列文档较多,本人绘制了Flink文档脑图。和下面的文档目录对应。各位读者可以选择自己感兴趣的模块阅读并参与讨论。 此脑图不定期更新中…… 文章目录 以下是本人Flink 源码分析系列文档目录,欢迎大家查阅和参与讨论。…...
HarmonyOS4.0开发-环境配置
鸿蒙应⽤开发快速体验 1.1. 准备开发环境 1.1.1 安装IDE 鸿蒙应⽤开发需要使⽤配套的IDE——HUAWEI DevEco Studio。 DevEco Studio基于IntelliJIDEA Community(IDEA社区版)构建,为鸿蒙应⽤提供了⼀站式开发环境,集成了开发、运⾏…...
GESP CCF C++ 三级认证真题 2024年6月
第 1 题 小杨父母带他到某培训机构给他报名参加CCF组织的GESP认证考试的第1级,那他可以选择的认证语言有()种。 A. 1 B. 2 C. 3 D. 4 第 2 题 下面流程图在yr输入2024时,可以判定yr代表闰年,并输出 2月是29天 &#x…...
华为的热机备份和流量限制
要求: 12,对现有网络进行改造升级,将当个防火墙组网改成双机热备的组网形式,做负载分担模式,游客区和DMZ区走FW4,生产区和办公区的流量走FW5 13,办公区上网用户限制流量不超过100M,…...
Vite的WebSocket
Vite的webSocket SocketJava Socket概述工作原理优势劣势 Java WebSocket概述工作原理代码示例nodeJS WebSocket优势劣势 vite中的WebSocket💫代码示例使用vite进行创建服务器并对Vue实行HMR 总结 Socket Java 中的 Socket 与 WebSocket 都用于网络通信,…...
Vue3项目基于Axios封装request请求
在 Vue 3 的项目开发中,使用 Axios 进行 HTTP 请求是非常常见的作法,为了更方便开发者更高效的进行代码编写和项目的维护,可以通过再次封装 Axios 来实现。 在本文中,博主将详细指导你如何在自己的 Vue 3 项目中使用 Axios 二次封…...
html(抽奖设计)
<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>抽奖</title><style type"text/css">* {margin: 0;padding: 0;}.container {width: 800px;height: 800px;border: 1px dashed red;position: absolut…...
Linux·权限与工具(上)
1. shell命令以及运行原理 Linux严格意义上来说是一个操作系统,我们称之为 "核心(kernel)" ,但我们一般的用户不呢个直接使用到核心,因为不会用。所以开发者在核心外面封装了一层 "外壳(shell)" 程序,来与核心…...
成为CMake砖家(2): macOS创建CMake本地文档的app
大家好,我是白鱼。 使用 CMake 的小伙伴, 有的是在 Windows 上, 还有的是在 macOS 上。之前咱们讲了 windows 上查看 cmake 本地 html 文档的方式, 这篇讲讲 macOS 上查看 cmake 本地 html 文档的方法。 1. 问题描述 当使用 CMa…...
基于opencv的图片加水印实现方案
加水印应该是个很常见的需求,但是网上找的代码,都感觉不太完善。记录下自己搞出来的一个方案 水印有几个需求: 中文文字水印文字倾斜满图都是,而不是只有一个地方水印文字所在之处完全展示水印 实现思路 准备水印图 我是这么…...
STM32 IAP 需要关注的一些事
1、首先要知道STM32的程序是如何分布在FLASH中的。 2、升级的时候涉及到两个程序,一个是bootloader,一个是user程序,这两个程序的功能分别的什么作用的? 3、编译的固件是怎么分布的?通过那个配置文件去指导编译器去排布…...
高并发服务器-使用多进程(Multi-Process)实现【C语言】
在上期的socket套接字的使用详解中(socket套接字的使用详解)最后实现的TCP服务器只能处理一个客户端的请求发送,当有其他客户端请求连接时会被阻塞。为了能同时处理多个客户端的连接请求,本期使用多进程的方式来解决。 解决方案步…...
线程控制
对线程的控制思路和进程相似,创建、等待、终止,只需要调用接口就行。但是在Linux下没有线程的概念,因为Linux的设计者认为,线程是一种轻量级的进程,毕竟创建线程只需要创建PCB。因此Linux中使用多线程必须使用第三方pt…...
Spring Data Jpa 原生SQL联表查询返回自定义DTO
Spring Data Jpa 原生SQL联表查询返回自定义DTO 方案一:返回Map 这个就不说了 方案二:实体定义成接口的形式 该方式最直观!!推荐!!! 注意:XxxDto是interface接口,而…...
Hadoop3:HDFS存储优化之小文件归档
一、情景说明 我们知道,NameNode存储一个文件元数据,默认是150byte大小的内存空间。 那么,如果出现很多的小文件,就会导致NameNode的内存占用。 但注意,存储小文件所需要的磁盘容量和数据块的大小无关。 例如&#x…...
Golang | Leetcode Golang题解之第234题回文链表
题目: 题解: func reverseList(head *ListNode) *ListNode {var prev, cur *ListNode nil, headfor cur ! nil {nextTmp : cur.Nextcur.Next prevprev curcur nextTmp}return prev }func endOfFirstHalf(head *ListNode) *ListNode {fast : headslo…...
Unity Apple Vision Pro 开发(四):体积相机 Volume Camera
文章目录 📕教程说明📕教程内容概括📕体积相机作用📕创建体积相机📕添加体积相机配置文件📕体积相机配置文件参数📕体积相机的边界盒大小📕体积相机边界盒大小和应用边界盒大小的区别…...
C语言 | Leetcode C语言题解之第231题2的幂
题目: 题解: const int BIG 1 << 30;bool isPowerOfTwo(int n) {return n > 0 && BIG % n 0; }...
__attribute__((unused))的妙用:如何优雅地处理未使用的变量与参数
1. 为什么我们需要__attribute__((unused)) 在C/C开发中,编译器警告就像一位严格的代码审查员,时刻提醒我们可能存在的问题。但有时候,我们确实需要定义一些暂时不使用的变量或参数,比如为了保持接口兼容性,或者在某些…...
OpenClaw多通道管理:百川2-13B-4bits量化模型同时接入飞书与钉钉
OpenClaw多通道管理:百川2-13B-4bits量化模型同时接入飞书与钉钉 1. 为什么需要多通道管理? 上个月我遇到一个尴尬场景:团队部分成员用飞书沟通,另一部分用钉钉。当我尝试用OpenClaw搭建自动化助手时,不得不在两个平…...
【具身智能06】具身智能多模态感知与传感器融合:从看见到理解
06_具身智能多模态感知与传感器融合 关键词 多模态感知,传感器融合,触觉传感器,力觉传感器,时空对齐,环境建模,IMU,视觉-触觉融合,深度感知一、引言:从单模态感知到多模态融合的必然之路 具身智能机器人的本质是在物理世界中行动,而行动的前提是感知。传统的工业机器…...
会议纪要助手:OpenClaw+nanobot自动提炼讨论要点
会议纪要助手:OpenClawnanobot自动提炼讨论要点 1. 为什么需要自动化会议纪要 每次开完会最头疼的就是整理会议纪要。作为技术负责人,我每周要参加至少5场会议,从需求评审到技术方案讨论,经常一开就是两小时。会后花半小时手动整…...
终极指南:如何快速实现CocoaHTTPServer自定义连接处理
终极指南:如何快速实现CocoaHTTPServer自定义连接处理 【免费下载链接】CocoaHTTPServer A small, lightweight, embeddable HTTP server for Mac OS X or iOS applications 项目地址: https://gitcode.com/gh_mirrors/co/CocoaHTTPServer CocoaHTTPServer是…...
STM32红外遥控器设计与多协议控制实现
基于STM32的万能红外遥控器设计与实现1. 项目概述1.1 系统架构本设计采用STM32F103RCT6作为主控芯片,构建了一个多功能红外遥控系统。系统架构包含以下核心模块:主控模块:STM32F103RCT6微控制器人机交互模块:1.44寸LCD显示屏 4x4…...
避坑指南:思科模拟器做链路聚合时,你可能会遇到的5个报错及解决方法
思科模拟器链路聚合实战:5个典型报错分析与精准排错指南 在Packet Tracer中配置链路聚合时,最令人头疼的往往不是基础配置步骤,而是那些突如其来的报错信息。上周有位学员在CCNA备考群里发了一张截图:%EC-5-CANNOT_BUNDLE2: Fa0/2…...
从Vaihingen数据集到训练样本:高分辨率遥感影像语义分割全流程实战
1. 初识Vaihingen数据集:遥感语义分割的黄金标准 第一次接触Vaihingen数据集时,我被它5厘米的超高分辨率震撼到了。这个由ISPRS提供的基准数据集,虽然只包含38张60006000像素的影像,但每张都清晰地展现了德国小镇Vaihingen的街道、…...
STM32F103 SPI+DMA驱动WS2812B的时序实现原理
1. WS2812B_STM32_Libmaple 库深度解析:基于 SPI DMA 的高性能 NeoPixel 驱动实现WS2812B(常被称作 NeoPixel)是当前嵌入式系统中最主流的单线协议可寻址 RGB LED。其核心挑战在于严格的时序要求:T0H(逻辑 0 的高电平时…...
DownKyi如何成为B站视频下载的智能管家?8K高清+批量处理全解析
DownKyi如何成为B站视频下载的智能管家?8K高清批量处理全解析 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视频提取、去水印等…...
