lua 游戏架构 之 资源加载 LoaderManager (一)

定义一个 LoaderManager class,用于管理各种资源加载器。它使用了对象池(Object Pool)来优化资源加载器的创建和销毁,从而提高性能

举例定义一个 PrefabLoader

Lua 复制代码
--[[
   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 then
        if parent then
            return CS.UnityEngine.GameObject.Instantiate(self.result, parent, worldStay==true)
        else
            return CS.UnityEngine.GameObject.Instantiate(self.result)
        end
    end
end

return PrefabLoader

设计思路:

  • 引入了各种资源加载器,如AssetLoader、PrefabLoader等,这些加载器负责加载不同类型的资源。

  • initialize方法调用onInit方法进行初始化。onInit方法中,首先获取资源管理器实例,然后初始化各种资源加载器池,每个池子使用TablePool来管理对象池。

  • PrefabLoader为例,创建了一个对象池,池子大小为16。当需要新的PrefabLoader实例时,会调用传入的函数创建一个新的PrefabLoader对象,并设置其释放函数为self._assetPool:releaseObj(1)

  • loadAssetAsync方法用于异步加载资源。它从对象池中获取一个PrefabLoader实例,初始化它,并调用其loadAsync方法进行异步加载。

  • release方法用于释放所有资源加载器池,并清理资源管理器实例。

注意事项

  1. 对象池的使用:通过对象池管理资源加载器,可以减少对象的频繁创建和销毁,提高性能。
  2. 异步加载 :资源加载方法(如loadAssetAsync)都是异步的,可以避免阻塞主线程。
  3. 资源管理器 :使用CS.Topjoy.Base.ResourceManagement.ResourceManager来管理资源加载,确保资源加载的一致性和效率。
Lua 复制代码
---@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()
end

function LoaderManager:onInit()
    self._resourceManager = CS.Topjoy.Base.ResourceManagement.ResourceManager.Instance

    self._assetPool = TablePool:new(16, function()
        local loader = AssetLoader:new()
        loader.rlsFunc = function(l)
            self._assetPool:releaseObj(l)
        end
        return loader
    end)
    self._prefabPool = TablePool:new(16, function()
        local loader = PrefabLoader:new()
        loader.rlsFunc = function(l)
            self._prefabPool:releaseObj(l)
        end
        return loader
    end)
    self._materialPool = TablePool:new(16, function()
        local loader = MaterialLoader:new()
        loader.rlsFunc = function(l)
            self._materialPool:releaseObj(l)
        end
        return loader
    end)
    self._texturePool = TablePool:new(16, function()
        local loader = TextureLoader:new()
        loader.rlsFunc = function(l)
            self._texturePool:releaseObj(l)
        end
        return loader
    end)
    self._textAssetPool = TablePool:new(16, function()
        local loader = TextAssetLoader:new()
        loader.rlsFunc = function(l)
            self._textAssetPool:releaseObj(l)
        end
        return loader
    end)
    self._listSpritePool = TablePool:new(16, function()
        local loader = ListSpriteLoader:new()
        loader.rlsFunc = function(l)
            self._listSpritePool:releaseObj(l)
        end
        return loader
    end)
    self._multiAssetsPool = TablePool:new(16, function()
        local loader = MultiAssetLoaders:new()
        loader.rlsFunc = function(l)
            self._multiAssetsPool:releaseObj(l)
        end
        return loader
    end)
    self._scenePool = TablePool:new(16, function()
        local loader = SceneLoader:new()
        loader.rlsFunc = function(l)
            self._scenePool:releaseObj(l)
        end
        return loader
    end)
    self._wwiseBankPool = TablePool:new(4, function()
        local loader = WwiseBankLoader:new()
        loader.rlsFunc = function(l)
            self._wwiseBankPool:releaseObj(l)
        end
        return loader
    end)
    self._walletPool = TablePool:new(16,function ()
        local loader = WalletLoader:new()
        loader.rlsFunc = function(l)
           self._walletPool:releaseObj(l)
        end
        return loader
    end)
end

function LoaderManager:release()
    self._resourceManager = nil
    Logger.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 AssetLoader
    local 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 PrefabLoader
    local 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 MaterialLoader
    local 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 TextureLoader
    local 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 TextAssetLoader
    local 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 ListSpriteLoader
    local 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 MultiAssetLoaders
    local 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 SceneLoader
    local 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 SceneLoader
    local 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)
end

return LoaderManager
相关推荐
loulanyue_7 小时前
从个人提效到团队可验证交付:中宏保险AI Coding流水线重塑与Qoder实战——读中宏保险AI架构总监王志宇2026云栖专场演讲
人工智能·架构
甲维斯8 小时前
我用AI做了一款「三国吃鸡」,开局孔明灯,落地青龙刀 !
人工智能·游戏·游戏开发
Erishen9 小时前
Lume C11编译器内部架构:从树形解释器到双LLVM后端的设计之旅
架构·开源·编译器
沪上企服通9 小时前
历史账套科目重映射与规则版本重算:旧账梳理的“口径复位”工程
笔记·架构
亥时无人机管理系统10 小时前
无人机管理系统源码 | 私有化部署平台 航线规划飞行审批实时监控功能介绍
架构·私有化部署·无人机·低空经济·无人机巡检·无人机管理系统·一网统飞
这个DBA有点耶11 小时前
时序数据库InfluxDB高基数问题深度拆解:内存索引膨胀机制与OOM完整链路
数据库·架构·dba
木子n112 小时前
软件架构设计实战-架构15.ISO 26262 架构设计要求:安全机制在架构里的落点
架构·autosar·功能安全·iso 26262
myshare202212 小时前
Dungeon Saga 常用词中英文对照表(阵营 / 品质 / 部位 / 套装 / 属性 / 套装效果)
游戏·dungeon saga·链游攻略
这个DBA有点耶13 小时前
为什么UPDATE比SELECT危险得多?锁范围等于扫描行数
数据库·架构·代码规范
薛定谔的猫-菜鸟程序员13 小时前
上传试卷、打Boss,玩游戏:我用 TextIn xParse 做了一套“会解析试卷的刷题游戏“
人工智能·游戏·大模型·textin·ai数据层基础设施