2025-06-04 05:02:57 +08:00

255 lines
5.7 KiB
Plaintext

AssetManager = class('AssetManager')
AssetManager.CachePoolNum = 10
function AssetManager.Me()
if nil == AssetManager.me then
AssetManager.me = AssetManager.new()
end
return AssetManager.me
end
function AssetManager.AssetCreator(resID)
if(ResourceManager.Instance)then
return ResourceManager.Instance:Load(resID);
end
return nil
end
function AssetManager.AssetDeletor(assetInfo)
AssetManager.AssetRealDeletor(assetInfo.resID)
end
function AssetManager.AssetRealDeletor(resID)
if(ResourceManager.Instance)then
-- print("AssetRealDeletor "..resID.getRealPath)
ResourceManager.Instance:UnLoad(resID, false);
end
end
function AssetManager:ctor()
self.pool = LuaObjPool.new("AssetPool", 10, AssetManager.AssetDeletor)
self:Reset()
end
function AssetManager:Reset()
self.assetInfoCache = {}
self.ownerMapAssetInfo = {}
self.cachePool = {}
end
function AssetManager:RealLoadAsset(resID)
local resInfo = self.pool:Get(resID.getRealPath)
if nil ~= resInfo then
-- print("RealLoadAsset "..resID.getRealPath)
return resInfo.asset
end
local asset = AssetManager.AssetCreator(resID)
if nil == asset then
return nil
end
return asset
end
function AssetManager:RealUnloadAsset(resID, asset)
if(asset~=nil and not GameObjectUtil.Instance:ObjectIsNULL(asset)) then
local resInfo = {}
resInfo.asset = asset
resInfo.resID = resID
-- print("RealUnloadAsset "..resID.getRealPath)
self.pool:Put(resID.getRealPath, resInfo)
end
end
function AssetManager:AddAssetInfo(resID,asset,owner)
local assetInfo = self:GetAssetInfo(resID)
if(assetInfo == nil) then
assetInfo = AssetInfo.new(asset,owner,resID)
self.assetInfoCache[resID.getRealPath] = assetInfo
else
assetInfo:AddOwner(owner)
end
return assetInfo
end
-- unique begin
function AssetManager:GetOnwerAssetInfo(owner)
return self.ownerMapAssetInfo[owner]
end
function AssetManager:SetOnwerAssetInfo(owner, assetInfo)
self.ownerMapAssetInfo[owner] = assetInfo
end
function AssetManager:TryClearUnusedOwnerAssetInfo()
local goUtil = GameObjectUtil.Instance
local removes = {}
for k,v in pairs(self.ownerMapAssetInfo) do
if goUtil:ObjectIsNULL(k) then
removes[#removes + 1] = k
end
end
if(removes and 0 < #removes) then
for i=1,#removes do
self:SetOnwerAssetInfo(removes[i], nil)
end
end
end
function AssetManager:TryClearOwnerOldAssetInfo(owner, resID)
local cleared = false
local ownerMapInfo = self:GetOnwerAssetInfo(owner)
if nil ~= ownerMapInfo then
if nil == resID or not ownerMapInfo:IsResID(resID) then
self:SetOnwerAssetInfo(owner, nil)
cleared = true
end
end
return ownerMapInfo, cleared
end
-- unique end
function AssetManager:GetAssetInfo(resID)
return self.assetInfoCache[resID.getRealPath]
end
function AssetManager:DisposeAssetInfo(resID)
local assetInfo = self:GetAssetInfo(resID)
if(assetInfo) then
self.assetInfoCache[resID.getRealPath] = nil
self:RealUnloadAsset(resID, assetInfo.asset)
end
end
function AssetManager:LoadAsset(owner,resID)
-- unique test begin
local oldAssetInfo, cleared = self:TryClearOwnerOldAssetInfo(owner, resID)
if nil ~= oldAssetInfo then
if cleared then
self:UnLoadAsset(owner, oldAssetInfo.resID)
else
return oldAssetInfo.asset
end
end
-- unique test end
local assetInfo = self:GetAssetInfo(resID)
if(assetInfo==nil) then
-- print("create new info.."..resID.getRealPath)
local asset = self:RealLoadAsset(resID)
if nil == asset then
-- print("asset is nil!!!!")
return nil
end
assetInfo = self:AddAssetInfo(resID,asset,owner)
else
assetInfo:AddOwner(owner)
end
self:SetOnwerAssetInfo(owner, assetInfo)
-- print(resID.getRealPath,assetInfo.asset)
return assetInfo.asset
end
function AssetManager:UnLoadAsset(owner,resID)
-- unique test begin
self:TryClearOwnerOldAssetInfo(owner, nil)
-- unique test end
local assetInfo = self:GetAssetInfo(resID)
if(assetInfo) then
assetInfo:RemoveOwner(owner)
assetInfo:RemoveUnUsedOwners()
if(assetInfo:HasNoOwners()) then
self:DisposeAssetInfo(resID,true)
end
end
end
function AssetManager:TryUnLoadAllUnused()
local removes
for k,v in pairs(self.assetInfoCache) do
v:RemoveUnUsedOwners()
if(v:HasNoOwners()) then
removes = removes or {}
removes[#removes + 1] = k
-- print("TryUnLoadAllUnused "..k)
self:RealUnloadAsset(v.resID,v.asset)
end
end
if(removes) then
for i=1,#removes do
self.assetInfoCache[removes[i]] = nil
end
end
-- for k,v in pairs(self.assetInfoCache) do
-- print("left.."..k)
-- end
-- unique test begin
self:TryClearUnusedOwnerAssetInfo()
-- unique test end
end
function AssetManager:TryUnLoadUnused(resID)
local assetInfo = self:GetAssetInfo(resID)
if(assetInfo) then
assetInfo:RemoveUnUsedOwners()
if(assetInfo:HasNoOwners()) then
self:DisposeAssetInfo(resID)
return true
end
end
return false
end
AssetInfo = class("AssetInfo")
function AssetInfo:ctor(asset,owner,resID)
self.asset = asset
self.resID = resID
self.owners = {}
self:AddOwner(owner)
end
function AssetInfo:AddOwner(owner)
if(owner) then
local findIndex = TableUtil.ArrayIndexOf(self.owners,owner)
if(findIndex == 0) then
self.owners[#self.owners + 1] = owner
return true
end
end
return false
end
function AssetInfo:RemoveOwner(owner)
local index = TableUtil.Remove(self.owners,owner)
return index~= 0
end
function AssetInfo:RemoveUnUsedOwners()
local goUtil = GameObjectUtil.Instance
local o
for i=#self.owners,1,-1 do
o = self.owners[i]
if(o==nil or goUtil:ObjectIsNULL(o)) then
table.remove(self.owners,i)
end
end
end
function AssetInfo:HasNoOwners()
return #self.owners == 0
end
function AssetInfo:IsResID(testResID)
local eq = false
if(testResID and self.resID)then
eq = testResID.IDStr == self.resID.IDStr
end
return eq
end