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

打印 上一主题 下一主题

主题 642|帖子 642|积分 1926

界说一个 LoaderManager class,用于管理各种资源加载器。它使用了对象池(Object Pool)来优化资源加载器的创建和烧毁,从而提高性能
举例界说一个 PrefabLoader
  1. --[[
  2.    Desc: 封装AAS的接口,加载Prefab
  3. --]]
  4. ---@alias PrefabLoader.CompleteDelegate fun(obj:table, l:PrefabLoader) | fun(l:PrefabLoader)
  5. ---@class PrefabLoader : BaseLoader
  6. ---@field result CS.UnityEngine.GameObject
  7. ---@field callback PrefabLoader.CompleteDelegate
  8. local PrefabLoader = SimpleClassUtil:class(require 'Topjoy.Engine.Resources.BaseLoader')
  9. PrefabLoader.intType = CS.Topjoy.Base.ResourceManagement.ResourcesUtil.TypeInts.GameObject
  10. ---@overload fun(parent:CS.UnityEngine.Transform): CS.UnityEngine.GameObject | CS.UnityEngine.Object
  11. ---@overload fun(): CS.UnityEngine.GameObject | CS.UnityEngine.Object
  12. ---@param parent CS.UnityEngine.Transform
  13. ---@param worldStay boolean @默认false
  14. ---@return CS.UnityEngine.GameObject | CS.UnityEngine.Object
  15. function PrefabLoader:instantiate(parent, worldStay)
  16.     if self.result then
  17.         if parent then
  18.             return CS.UnityEngine.GameObject.Instantiate(self.result, parent, worldStay==true)
  19.         else
  20.             return CS.UnityEngine.GameObject.Instantiate(self.result)
  21.         end
  22.     end
  23. end
  24. return 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来管理资源加载,确保资源加载的同等性和效率。
  1. ---@class LoaderManager
  2. local LoaderManager = SimpleClassUtil:class()
  3. local AssetLoader = require 'Topjoy.Engine.Resources.AssetLoader'
  4. local PrefabLoader = require 'Topjoy.Engine.Resources.PrefabLoader'
  5. local MaterialLoader = require 'Topjoy.Engine.Resources.MaterialLoader'
  6. local TextureLoader = require 'Topjoy.Engine.Resources.TextureLoader'
  7. local TextAssetLoader = require 'Topjoy.Engine.Resources.TextAssetLoader'
  8. local ListSpriteLoader = require 'Topjoy.Engine.Resources.ListSpriteLoader'
  9. local MultiAssetLoaders = require 'Topjoy.Engine.Resources.MultiAssetLoaders'
  10. local SceneLoader = require 'Topjoy.Engine.Resources.SceneLoader'
  11. local WwiseBankLoader = require 'Topjoy.Engine.Resources.WwiseBankLoader'
  12. local WalletLoader = require 'Topjoy.Engine.Resources.Wallet.LoaderWallet'
  13. function LoaderManager:initialize()
  14.     self:onInit()
  15. end
  16. function LoaderManager:onInit()
  17.     self._resourceManager = CS.Topjoy.Base.ResourceManagement.ResourceManager.Instance
  18.     self._assetPool = TablePool:new(16, function()
  19.         local loader = AssetLoader:new()
  20.         loader.rlsFunc = function(l)
  21.             self._assetPool:releaseObj(l)
  22.         end
  23.         return loader
  24.     end)
  25.     self._prefabPool = TablePool:new(16, function()
  26.         local loader = PrefabLoader:new()
  27.         loader.rlsFunc = function(l)
  28.             self._prefabPool:releaseObj(l)
  29.         end
  30.         return loader
  31.     end)
  32.     self._materialPool = TablePool:new(16, function()
  33.         local loader = MaterialLoader:new()
  34.         loader.rlsFunc = function(l)
  35.             self._materialPool:releaseObj(l)
  36.         end
  37.         return loader
  38.     end)
  39.     self._texturePool = TablePool:new(16, function()
  40.         local loader = TextureLoader:new()
  41.         loader.rlsFunc = function(l)
  42.             self._texturePool:releaseObj(l)
  43.         end
  44.         return loader
  45.     end)
  46.     self._textAssetPool = TablePool:new(16, function()
  47.         local loader = TextAssetLoader:new()
  48.         loader.rlsFunc = function(l)
  49.             self._textAssetPool:releaseObj(l)
  50.         end
  51.         return loader
  52.     end)
  53.     self._listSpritePool = TablePool:new(16, function()
  54.         local loader = ListSpriteLoader:new()
  55.         loader.rlsFunc = function(l)
  56.             self._listSpritePool:releaseObj(l)
  57.         end
  58.         return loader
  59.     end)
  60.     self._multiAssetsPool = TablePool:new(16, function()
  61.         local loader = MultiAssetLoaders:new()
  62.         loader.rlsFunc = function(l)
  63.             self._multiAssetsPool:releaseObj(l)
  64.         end
  65.         return loader
  66.     end)
  67.     self._scenePool = TablePool:new(16, function()
  68.         local loader = SceneLoader:new()
  69.         loader.rlsFunc = function(l)
  70.             self._scenePool:releaseObj(l)
  71.         end
  72.         return loader
  73.     end)
  74.     self._wwiseBankPool = TablePool:new(4, function()
  75.         local loader = WwiseBankLoader:new()
  76.         loader.rlsFunc = function(l)
  77.             self._wwiseBankPool:releaseObj(l)
  78.         end
  79.         return loader
  80.     end)
  81.     self._walletPool = TablePool:new(16,function ()
  82.         local loader = WalletLoader:new()
  83.         loader.rlsFunc = function(l)
  84.            self._walletPool:releaseObj(l)
  85.         end
  86.         return loader
  87.     end)
  88. end
  89. function LoaderManager:release()
  90.     self._resourceManager = nil
  91.     Logger.print("LoaderManager:release")
  92.     self._assetPool:release()
  93.     self._prefabPool:release()
  94.     self._materialPool:release()
  95.     self._texturePool:release()
  96.     self._textAssetPool:release()
  97.     self._listSpritePool:release()
  98.     self._multiAssetsPool:release()
  99.     self._scenePool:release()
  100.     self._wwiseBankPool:release()
  101.     self._walletPool:release()
  102. end
  103. ---@param path string
  104. ---@return AssetLoader
  105. function LoaderManager:newAssetLoader(path)
  106.     local loader = self._assetPool:getObj()
  107.     loader:init(path)
  108.     return loader
  109. end
  110. ---@param path string
  111. ---@param obj table @回调的self参数,可为nil
  112. ---@param data any @loader的附加参数,可通过loader.data获取
  113. ---@param callback AssetLoader.CompleteDelegate
  114. ---@return AssetLoader
  115. function LoaderManager:loadAssetAsync(path, callback, obj, data)
  116.     ---@type AssetLoader
  117.     local loader = self._assetPool:getObj()
  118.     loader:init(path)
  119.     loader:loadAsync(callback, obj, data)
  120.     return loader
  121. end
  122. ---@param path string
  123. ---@return PrefabLoader
  124. function LoaderManager:newPrefabLoader(path)
  125.     local loader = self._prefabPool:getObj()
  126.     loader:init(path)
  127.     return loader
  128. end
  129. ---@param path string
  130. ---@param obj table @回调的self参数,可为nil
  131. ---@param data any @loader的附加参数,可通过loader.data获取
  132. ---@param callback PrefabLoader.CompleteDelegate
  133. ---@return PrefabLoader
  134. function LoaderManager:loadPrefabAsync(path, callback, obj, data)
  135.     ---@type PrefabLoader
  136.     local loader = self._prefabPool:getObj()
  137.     loader:init(path)
  138.     loader:loadAsync(callback, obj, data)
  139.     return loader
  140. end
  141. ---@param path string
  142. ---@return MaterialLoader
  143. function LoaderManager:newMaterialLoader(path)
  144.     local loader = self._materialPool:getObj()
  145.     loader:init(path)
  146.     return loader
  147. end
  148. ---@param path string
  149. ---@param obj table @回调的self参数,可为nil
  150. ---@param data any @loader的附加参数,可通过loader.data获取
  151. ---@param callback MaterialLoader.CompleteDelegate
  152. ---@return MaterialLoader
  153. function LoaderManager:loadMaterialAsync(path, callback, obj, data)
  154.     ---@type MaterialLoader
  155.     local loader = self._materialPool:getObj()
  156.     loader:init(path)
  157.     loader:loadAsync(callback, obj, data)
  158.     return loader
  159. end
  160. ---@param path string
  161. ---@return TextureLoader
  162. function LoaderManager:newTextureLoader(path)
  163.     local loader = self._texturePool:getObj()
  164.     loader:init(path)
  165.     return loader
  166. end
  167. ---@param path string
  168. ---@param obj table @回调的self参数,可为nil
  169. ---@param data any @loader的附加参数,可通过loader.data获取
  170. ---@param callback TextureLoader.CompleteDelegate
  171. ---@return TextureLoader
  172. function LoaderManager:loadTextureAsync(path, callback, obj, data)
  173.     ---@type TextureLoader
  174.     local loader = self._texturePool:getObj()
  175.     loader:init(path)
  176.     loader:loadAsync(callback, obj, data)
  177.     return loader
  178. end
  179. ---@param path string
  180. ---@return TextAssetLoader
  181. function LoaderManager:newTextAssetLoader(path)
  182.     local loader = self._textAssetPool:getObj()
  183.     loader:init(path)
  184.     return loader
  185. end
  186. ---@param path string
  187. ---@param obj table @回调的self参数,可为nil
  188. ---@param data any @loader的附加参数,可通过loader.data获取
  189. ---@param callback TextAssetLoader.CompleteDelegate
  190. ---@return TextAssetLoader
  191. function LoaderManager:loadTextAssetAsync(path, callback, obj, data)
  192.     ---@type TextAssetLoader
  193.     local loader = self._textAssetPool:getObj()
  194.     loader:init(path)
  195.     loader:loadAsync(callback, obj, data)
  196.     return loader
  197. end
  198. ---@param path string
  199. ---@return ListSpriteLoader
  200. function LoaderManager:newListSpriteLoader(path)
  201.     local loader = self._listSpritePool:getObj()
  202.     loader:init(path)
  203.     return loader
  204. end
  205. ---@param path string
  206. ---@param obj table @回调的self参数,可为nil
  207. ---@param data any @loader的附加参数,可通过loader.data获取
  208. ---@param callback ListSpriteLoader.CompleteDelegate
  209. ---@return ListSpriteLoader
  210. function LoaderManager:loadListSpriteAsync(path, callback, obj, data)
  211.     ---@type ListSpriteLoader
  212.     local loader = self._listSpritePool:getObj()
  213.     loader:init(path)
  214.     loader:loadAsync(callback, obj, data)
  215.     return loader
  216. end
  217. ---@param callback MultiAssetLoaders.CompleteDelegate
  218. ---@return MultiAssetLoaders
  219. function LoaderManager:loadMultiAssetAsync(callback, obj, data, ...)
  220.     ---@type MultiAssetLoaders
  221.     local loader = self._multiAssetsPool:getObj()
  222.     loader:init(...)
  223.     loader:loadAsync(callback, obj, data)
  224.     return loader
  225. end
  226. ---@param callback SceneLoader.CompleteDelegate
  227. ---@return SceneLoader
  228. function LoaderManager:loadSceneAsync(path, callback, obj, data)
  229.     ---@type SceneLoader
  230.     local loader = self._scenePool:getObj()
  231.     loader:init(path)
  232.     loader:loadAsync(callback, obj, data)
  233.     return loader
  234. end
  235. ---@param callback WwiseBankLoader.CompleteDelegate
  236. ---@return WwiseBankLoader
  237. function LoaderManager:newWwiseBankLoader(path)
  238.     ---@type SceneLoader
  239.     local loader = self._wwiseBankPool:getObj()
  240.     loader:init(path)
  241.     return loader
  242. end
  243. ---@param owner @传self
  244. ---@return LoaderWallet
  245. function LoaderManager:newLoaderWallet(owner)
  246.     local loader = self._walletPool:getObj()
  247.     loader:setOwner(owner)
  248.     return loader
  249. end
  250. ---@param maxExecute number @最大同时异步加载数量
  251. ---@param maxComplete number @最大同帧回调数量
  252. ---@return CS.Topjoy.Base.ResourceManagement.OperationHandles.OperationQueue
  253. function LoaderManager:newLoaderQueue(maxExecute, maxComplete)
  254.     local queue = self._resourceManager:NewOperationQueue(maxExecute, maxComplete)
  255.     return queue
  256. end
  257. ---@param queue CS.Topjoy.Base.ResourceManagement.ResourceManager
  258. function LoaderManager:destroyLoaderQueue(queue)
  259.     self._resourceManager:DestroyOperationQueue(queue)
  260. end
  261. return LoaderManager
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

天空闲话

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表