using System.Collections.Generic; namespace XGame.Framework.Asset { /// /// 加载过的资源对象,只用于内部记录引用 /// internal class AssetInstance { public object Asset { private set; get; } public int Reference { private set; get; } public long Hashcode { private set; get; } public string Name { private set; get; } private List parents; public AssetInstance(object asset, string name) { Asset = asset; Reference = 1; Hashcode = asset.GetLongHashCode(); Name = name; } public void Retain() { Reference++; } public bool Release() { return --Reference <= 0; } public bool AddParent(long parentHash) { if (parents == null) { parents = new List(); } if (parents.Contains(parentHash)) { return false; } parents.Add(parentHash); return true; } public bool RemoveParent(long parentHash) { return parents?.Remove(parentHash) ?? false; } public bool IsContainParent(long parentHash) { return parents?.Contains(parentHash) ?? false; } public override string ToString() { return $"LoadedAsset type:{Asset?.GetType()} name:{Name} hash:{Hashcode} ref:{Reference}"; } public void Clear() { Asset = null; Reference = 0; Hashcode = 0; Name = string.Empty; parents?.Clear(); } internal AssetInstance Clone() { var clone = new AssetInstance(Asset, Name) { Reference = Reference, }; return clone; } } }