255 lines
5.7 KiB
Plaintext
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 |