lua 游戏架构 之 LoaderWallet 异步加载

定义了一个名为`LoaderWallet` class,用于管理资源加载器(Loader)。这个类封装了资源加载的功能,包括异步加载,以及资源的释放和状态查询。下面是对代码的详细解释:

### 类定义和初始化

这里定义了一个名为`LoaderWallet`的类,并使用`SimpleClassUtil:class()`方法进行初始化。

定义 一个对象池:TablePool 类 lua 游戏架构 之 TablePool`对象池-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/heyuchang666/article/details/140530648
定义了一个`cachePool`对象,用于缓存`LoaderWallet`的内部对象,减少内存分配和回收的开销。

local cachePool =TablePool:new(16,nil,function(t)for i, _ in pairs(t) dot[i] = nilendend
)

owner是一个成员变量,用于存储LoaderWallet的拥有者。这个拥有者可以是任何对象,通常是一个游戏对象或场景对象,用于管理资源加载。

function LoaderWallet:initialize(owner)self.owner = owner
endfunction LoaderWallet:setOwner(owner)self.owner = ownerself.loaders = cachePool:getObj()self.callbacks = cachePool:getObj()
end

释放所有内部加载器,并释放loaderscallbacks对象。如果LoaderWallet已经被释放过,则输出错误日志。

function LoaderWallet:release()if not self.owner thenLogger.error("Try to Release LoaderWallet Twice. You should check if nil firstly.")returnendfor _, loader in pairs(self.loaders) doloader:release()endcachePool:releaseObj(self.loaders)cachePool:releaseObj(self.callbacks)self.owner = nilself.loaders = nilself.callbacks = nilif self.rlsFunc thenself.rlsFunc(self)end
end
设计方法 于查询加载器的状态,包括是否完成、加载进度、是否正在加载以及句柄是否有效。
  • isComplete
  • getProgress
  • isLoading
  • isValidHandle
设计方法用于标记资源是否需要卸载、释放加载器、获取加载完成的资源以及获取子资源
  • markUnloadParam
  • releaseHandle
  • getAsset
  • getSubAsset
设计 异步加载不同类型的资源 方法 loadAssetAsync
  1. 创建资源加载器:使用g.loaderManager:newAssetLoader(path)创建一个新的资源加载器实例,path是资源的路径。
  2. 判断是否使用队列:如果提供了queue参数,则调用loader:loadQueued(queue, self.onLoaderDone, self)将资源加载操作加入队列中,并指定加载完成后的回调函数self.onLoaderDone。否则,调用loader:loadAsync(self.onLoaderDone, self)直接异步加载资源。
  3. 保存加载器实例和回调函数:将加载器实例和对应的回调函数保存到self.loadersself.callbacks表中,使用加载器的句柄(handleID)作为键。
  4. 返回句柄:返回加载器的句柄,用于标识这个加载操作。
---@param path string
---@param callback fun(self:table, handle:number) @self是owner
---@param queue CS.Topjoy.Base.ResourceManagement.OperationHandles.OperationQueue
---@return number @handle
function LoaderWallet:loadAssetAsync(path, callback, queue)---@type AssetLoaderlocal loader = g.loaderManager:newAssetLoader(path)if queue thenloader:loadQueued(queue, self.onLoaderDone, self)elseloader:loadAsync(self.onLoaderDone, self)endlocal handle = loader.handleIDself.loaders[handle] = loaderself.callbacks[handle] = callbackreturn handle
end

异步加载资源,并允许用户指定加载完成后的回调函数。这对于需要异步加载资源并处理加载结果的应用场景非常有用,比如游戏中的资源预加载、UI资源的动态加载等。

### 注意事项

1. **资源管理**:确保在不再需要资源时及时释放,避免内存泄漏。
2. **错误处理**:在资源加载失败时,应记录错误信息,便于调试。
3. **线程安全**:如果`LoaderWallet`在多线程环境下使用,需要确保线程安全。

这段代码主要用于游戏开发中的资源管理,通过封装资源加载器,简化了资源加载和管理的流程。

--[[Desc: Loader持有者,封装Release
--]]---@class LoaderWallet
local LoaderWallet = SimpleClassUtil:class()
local cachePool =TablePool:new(16,nil,function(t)for i, _ in pairs(t) dot[i] = nilendend
)
function LoaderWallet:initialize(owner)self.owner = owner
endfunction LoaderWallet:setOwner(owner)self.owner = ownerself.loaders = cachePool:getObj()self.callbacks = cachePool:getObj()
end--- 释放所有的内部loader
function LoaderWallet:release()if not self.owner thenLogger.error("Try to Release LoaderWallet Twice. You should check if nil firstly.")returnendfor _, loader in pairs(self.loaders) doloader:release()endcachePool:releaseObj(self.loaders)cachePool:releaseObj(self.callbacks)self.owner = nilself.loaders = nilself.callbacks = nilif self.rlsFunc thenself.rlsFunc(self)end
end---@private
---@param loader BaseLoader
function LoaderWallet:onLoaderDone(loader)if self.owner==nil thenloader:release()returnendlocal handle = loader.handleIDlocal cb = self.callbacks[handle]if cb thencb(self.owner, handle)end
end---@param handle number
---@return boolean
function LoaderWallet:isComplete(handle)local loader = self.loaders[handle]if loader thenreturn loader.isCompleteendreturn false
end---@param handle number
---@return number @[0, 1]
function LoaderWallet:getProgress(handle)local loader = self.loaders[handle]if loader thenreturn loader:getProgress()endreturn 0
end---@param handle number
---@return boolean
function LoaderWallet:isLoading(handle)local loader = self.loaders[handle]if loader thenreturn loader:isLoading()endreturn false
end---@param handle number
---@return boolean
function LoaderWallet:isValidHandle(handle)return self.loaders[handle]~=nil
end---@param handle number
---@param unload boolean
function LoaderWallet:markUnloadParam(handle, unload)local loader = self.loaders[handle]if loader thenloader:markUnloadParam(unload)elseLogger.error("Miss Loader for handle:", handle)end
end---@param handle number
function LoaderWallet:releaseHandle(handle)local loader = self.loaders[handle]if loader thenloader:release()self.loaders[handle] = nilself.callbacks[handle] = nilelseLogger.error("Miss Loader for handle:", handle)end
end---@param path string
---@return boolean
function LoaderWallet:hasAnyWithPath(path)for _, loader in pairs(self.loaders) doif loader.path == path thenreturn trueendendreturn false
end--- 获取加载完成后的资源。如,prefab。
---@param handle number
---@return CS.UnityEngine.Object
function LoaderWallet:getAsset(handle)local loader = self.loaders[handle]if loader thenreturn loader.resultelseLogger.error("Miss Loader for handle:", handle)end
end--- 获取子资源。如,sprite。
---@param handle number
---@param name string
---@return CS.UnityEngine.Object
function LoaderWallet:getSubAsset(handle, name)local loader = self.loaders[handle]if loader thenreturn loader:getSubAsset(name)elseLogger.error("Miss Loader for handle:", handle)end
end---@param path string
---@param callback fun(self:table, handle:number) @self是owner
---@param queue CS.GameYL.Base.ResourceManagement.OperationHandles.OperationQueue
---@return number @handle
function LoaderWallet:loadAssetAsync(path, callback, queue)---@type AssetLoaderlocal loader = g.loaderManager:newAssetLoader(path)if queue thenloader:loadQueued(queue, self.onLoaderDone, self)elseloader:loadAsync(self.onLoaderDone, self)endlocal handle = loader.handleIDself.loaders[handle] = loaderself.callbacks[handle] = callbackreturn handle
end---@param path string
---@param callback fun(self:table, handle:number) @self是owner
---@param queue CS.GameYL.Base.ResourceManagement.OperationHandles.OperationQueue
---@return number @handle
function LoaderWallet:loadListSpriteAsync(path, callback, queue)---@type ListSpriteLoaderlocal loader = g.loaderManager:newListSpriteLoader(path)if queue thenloader:loadQueued(queue, self.onLoaderDone, self)elseloader:loadAsync(self.onLoaderDone, self)endlocal handle = loader.handleIDself.loaders[handle] = loaderself.callbacks[handle] = callbackreturn handle
end---@param path string
---@param callback fun(self:table, handle:number) @self是owner
---@param queue CS.GameYL.Base.ResourceManagement.OperationHandles.OperationQueue
---@return number @handle
function LoaderWallet:loadMaterialAsync(path, callback, queue)---@type MaterialLoaderlocal loader = g.loaderManager:newMaterialLoader(path)if queue thenloader:loadQueued(queue, self.onLoaderDone, self)elseloader:loadAsync(self.onLoaderDone, self)endlocal handle = loader.handleIDself.loaders[handle] = loaderself.callbacks[handle] = callbackreturn handle
end---@param path string
---@param callback fun(self:table, handle:number) @self是owner
---@param queue CS.GameYL.Base.ResourceManagement.OperationHandles.OperationQueue
---@return number @handle
function LoaderWallet:loadPrefabAsync(path, callback, queue)---@type PrefabLoaderlocal loader = g.loaderManager:newPrefabLoader(path)if queue thenloader:loadQueued(queue, self.onLoaderDone, self)elseloader:loadAsync(self.onLoaderDone, self)endlocal handle = loader.handleIDself.loaders[handle] = loaderself.callbacks[handle] = callbackreturn handle
end---@param path string
---@param callback fun(self:table, handle:number) @self是owner
---@return number @handle
function LoaderWallet:loadSceneAsync(path, callback)---@type SceneLoaderlocal loader = Global.loaderManager:loadSceneAsync(path, self.onLoaderDone, self)local handle = loader.handleIDself.loaders[handle] = loaderself.callbacks[handle] = callbackreturn handle
end---@param path string
---@param callback fun(self:table, handle:number) @self是owner
---@param queue CS.GameYL.Base.ResourceManagement.OperationHandles.OperationQueue
---@return number @handle
function LoaderWallet:loadTextAssetAsync(path, callback, queue)---@type TextAssetLoaderlocal loader = g.loaderManager:newTextAssetLoader(path)if queue thenloader:loadQueued(queue, self.onLoaderDone, self)elseloader:loadAsync(self.onLoaderDone, self)endlocal handle = loader.handleIDself.loaders[handle] = loaderself.callbacks[handle] = callbackreturn handle
end---@param path string
---@param callback fun(self:table, handle:number) @self是owner
---@param queue CS.GameYL.Base.ResourceManagement.OperationHandles.OperationQueue
---@return number @handle
function LoaderWallet:loadTextureAsync(path, callback, queue)---@type TextureLoaderlocal loader = g.loaderManager:newTextureLoader(path)if queue thenloader:loadQueued(queue, self.onLoaderDone, self)elseloader:loadAsync(self.onLoaderDone, self)endlocal handle = loader.handleIDself.loaders[handle] = loaderself.callbacks[handle] = callbackreturn handle
end---@param path string
---@param callback fun(self:table, handle:number) @self是owner
---@return number @handle
function LoaderWallet:loadWwiseBankAsync(path, callback)---@type WwiseBankLoaderlocal loader = g.loaderManager:newWwiseBankLoader(path)loader:loadAsync(self.onLoaderDone, self)local handle = loader.handleIDself.loaders[handle] = loaderself.callbacks[handle] = callbackreturn handle
end---@overload fun(path:string)
---@param path string
---@param decodeBank boolean
---@param saveDecodedBank boolean
---@return number @handle
function LoaderWallet:loadWwiseBankSync(path, decodeBank, saveDecodedBank)---@type WwiseBankLoaderlocal loader = g.loaderManager:newWwiseBankLoader(path)loader.decodeBank = decodeBankloader.saveDecodedBank = saveDecodedBankloader:loadSync()local handle = loader.handleIDself.loaders[handle] = loaderreturn handle
endreturn LoaderWallet

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/381831.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Inconsistent Query Results Based on Output Fields Selection in Milvus Dashboard

题意:在Milvus仪表盘中基于输出字段选择的不一致查询结果 问题背景: Im experiencing an issue with the Milvus dashboard where the search results change based on the selected output fields. Im working on a RAG project using text data conv…

AndroidStudio 编辑xml布局文件卡死问题解决

之前项目编写的都是正常,升级AndroidStudio后编辑布局文件就卡死,还以为是AndroidStudio文件。 其实不然,我给整个项目增加了版权声明。所以全部跟新后,布局文件也增加了版权声明。估计AndroidStudio在 解析布局文件时候因为有版…

推荐丨SSL证书是什么?该怎么申请,需要准备哪些材料?

SSL证书是什么? SSL证书(Secure Sockets Layer Certificate),又称为数字证书,是一种用于在互联网上验证网站身份和加密通信的技术。它遵守SSL协议,由受信任的数字证书颁发机构(CA)在…

在 CI/CD Pipeline 中实施持续测试的最佳实践!

随着软件开发周期的不断加快,持续集成(CI)和持续交付/部署(CD)已经成为现代软件开发的重要组成部分。在这一过程中,持续测试的实施对于确保代码质量、提高发布效率至关重要。本文将详细介绍在CI/CD流水线中…

STM32高级运动控制系统教程

目录 引言环境准备高级运动控制系统基础代码实现:实现高级运动控制系统 4.1 传感器数据采集模块 4.2 数据处理与运动控制模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景:运动控制与优化问题解决方案与优化收尾与总结 1. 引言 高级运动…

深入理解Linux网络(五):TCP接收唤醒

深入理解Linux网络(五):TCP接收唤醒 TCP接收唤醒由软中断提供服务。 软中断(也就是 Linux ⾥的 ksoftirqd 进程)⾥收到数据包以后,发现是 tcp 的包的话就会执⾏到 tcp_v4_rcv 函数。接着如果是 ESTABLISH…

mysql JSON特性优化

有朋友问到,mysql如果要根据json中的某个属性过滤,数据量大的话,性能很差,要如何提高性能? 为什么要用json串? 由于一些特定场景,mysql需要用到json串,例如文档,不同的…

【LabVIEW作业篇 - 5】:水仙花数、数组与for循环的连接

文章目录 水仙花数数组与for循环的连接 水仙花数 水仙花数,是指一个3位数,它的每个位上的数字的3次幂之和等于它本身。如371 3^3 7^3 1^3,则371是一个水仙花数。 思路:水仙花数是一个三位数,通过使用for循环&#xf…

RabbitMQ的学习和模拟实现|muduo库的介绍和使用

muduo库 项目仓库:https://github.com/ffengc/HareMQ muduo库 muduo库是什么快速上手搭建服务端快速上手搭建客户端上面搭建的服务端-客户端通信还有什么问题?muduo库中的protobuf基于muduo库中的protobuf协议实现一个服务器 muduo库是什么 Muduo由陈硕大佬开…

ReadAgent,一款具有要点记忆的人工智能阅读代理

人工智能咨询培训老师叶梓 转载标明出处 现有的大模型(LLMs)在处理长文本时受限于固定的最大上下文长度,并且当输入文本越来越长时,性能往往会下降,即使在没有超出明确上下文窗口的情况下,LLMs 的性能也会随…

pytorch 笔记:torch.optim.Adam

torch.optim.Adam 是一个实现 Adam 优化算法的类。Adam 是一个常用的梯度下降优化方法,特别适合处理大规模数据集和参数的深度学习模型 torch.optim.Adam(params, lr0.001, betas(0.9, 0.999), eps1e-08, weight_decay0, amsgradFalse, *, foreachNone, maximizeFa…

OpenAI从GPT-4V到GPT-4O,再到GPT-4OMini简介

OpenAI从GPT-4V到GPT-4O,再到GPT-4OMini简介 一、引言 在人工智能领域,OpenAI的GPT系列模型一直是自然语言处理的标杆。随着技术的不断进步,OpenAI推出了多个版本的GPT模型,包括视觉增强的GPT-4V(GPT-4 with Vision&…

HarmonyOS应用开发者高级认证,Next版本发布后最新题库 - 单选题序号3

基础认证题库请移步:HarmonyOS应用开发者基础认证题库 注:有读者反馈,题库的代码块比较多,打开文章时会卡死。所以笔者将题库拆分,单选题20个为一组,多选题10个为一组,题库目录如下,…

hive3 hql脚本传递参数

在数仓的构建过程中,需要配置hive的调度任务,这时就需要对hive hql脚本进行封装,将参数提取出来,作为变量进行配置,比如日期、类型等。 hive3版本,hive -f 在执行sql脚本文件的时候是可以传递参数。 具体…

GitHub 令牌泄漏, Python 核心资源库面临潜在攻击

TheHackerNews网站消息,软件供应链安全公司 JFrog 的网络安全研究人员称,他们发现了一个意外泄露的 GitHub 令牌,可授予 Python 语言 GitHub 存储库、Python 软件包索引(PyPI)和 Python 软件基金会(PSF&…

系统架构设计师教程 第3章 信息系统基础知识-3.5 专家系统-解读

系统架构设计师教程 第3章 信息系统基础知识-3.5 专家系统(ES) 3.5.1 人工智能3.5.1.1 人工智能的特点3.5.1.2 人工智能的主要分支3.5.2 ES的概念3.5.2.1 ES 概述3.5.2.2 与传统程序的区别3.5.3 ES的特点3.5.4 ES的组成3.5.4.1 知识库3.5.4.2 综合数据库3.5.4.3 推理机3.5.4.…

google 浏览器插件开发简单学习案例:TodoList

参考: google插件支持: https://blog.csdn.net/weixin_42357472/article/details/140412993 这里是把前面做的TodoList做成google插件,具体网页可以参考下面链接 TodoList网页: https://blog.csdn.net/weixin_42357472/article/de…

MongoDB教程(十八):MongoDB MapReduce

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 文章目录 引言一、MapRed…

OpenCV 图像旋转和平移 数学和代码原理详解

文章目录 数学原理旋转矩阵平移和旋转合成变换矩阵应用在OpenCV中的实现 代码关键点解读完整代码C代码:Python代码: 在OpenCV中进行图像旋转涉及到一些基本的几何变换和图像处理操作。 数学原理 在图像旋转中,背后的数学原理主要涉及二维欧…

阿里云ubuntu宝塔面板部署uni-app-flask-websocket前后端项目

1.下载宝塔面板 wget -O install.sh https://download.bt.cn/install/install-ubuntu_6.0.sh && sudo bash install.sh ed8484bec 然后去安全组开放对应的端口 面板账户登录信息 【云服务器】请在安全组放行 29725 端口 进入控制面板后修改默认用户名和密码 2. …