/// <summary> /// 引用-1 /// </summary> public bool Release(object refer_) { if (IsDisposed(true)) { return(false); } if (refer_ != null) { string referId = Refer.Format(refer_); if (!m_refHash.Contains(referId)) { //没被它引用 return(false); } m_refHash.Remove(referId); Refer.DetachDispose(referId, OnReferDispose); } if (m_ref_cnt > 0) { m_ref_cnt--; if (m_ref_cnt == 0) { __OnRelease(); } } else { Log.Assert("错误的引用计数", this); } return(true); }
public void OnReferDispose(object refer_) { #if UNITY_EDITOR Log.Debug("<color=magenta>检测到引用者析构: " + Refer.Format(refer_) + "</color>", this); #endif Release(refer_); }
/// <summary> /// 引用+1 /// </summary> public bool Retain(object refer_) { if (IsDisposed(true)) { return(false); } if (refer_ != null) { string referId = Refer.Format(refer_); if (m_refHash.Contains(referId)) { //已被它引用 return(false); } m_refHash.Add(referId); Refer.AttachDispose(referId, OnReferDispose); //监听引用者销毁 } m_ref_cnt++; if (m_ref_cnt == 1) { } return(true); }
/// <summary> /// 释放此引用者的所有引用 /// </summary> /// <param name="referId_"></param> public void ReleaseByRefer(object refer_) { string referId = Refer.Format(refer_); if (referId == null) { return; } HashSet <string> hash; if (m_refer2urls.TryGetValue(referId, out hash)) { foreach (string url in hash) { AssetData data = m_url2data[url]; if (data.refHash.Remove(referId)) { data.active_time = DateUtil.TimeFromStart; //刷新时间 } } hash.Clear(); m_hashPool.Push(hash); m_refer2urls.Remove(referId); } //DetachByRefer(refer_) }
public bool Release(object refer_) { string referId = Refer.Format(refer_); if (referId == null) { return(false); } if (refHash.Remove(referId)) { m_cache.__RemoveRefer(referId, url); return(true); } return(false); }
//-------∽-★-∽------∽-★-∽--------∽-★-∽引用相关∽-★-∽--------∽-★-∽------∽-★-∽--------// public bool Retain(object refer_) { string referId = Refer.Format(refer_); if (referId == null) { return(false); } if (refHash.Add(referId)) { m_cache.__AddRefer(referId, url); return(true); } return(false); }
/// <summary> /// 设置图片(同步加载) /// </summary> /// <param name="image_">是否需要保持引用,等go失效时设置为移除引用?</param> /// <param name="url_"></param> /// <param name="spriteName"></param> /// <param name="refer_"></param> /// <param name="nativeSize_">重置尺寸</param> public void SetSprite(object refer_, Image image_, string url_, string spriteName, bool nativeSize_ = false) { string real_url_ = FormatPath(url_); if (m_itemQueue.Count > 0 && m_image2item.ContainsKey(image_)) { //image在加载队列中,从队列移除 LoadItem item = m_image2item[image_]; RemoveLoadItem(item); } Refer.Assert(refer_); string referId = Refer.Format(refer_); RetainImage(image_, referId); __SetSprite(referId, image_, real_url_, spriteName, nativeSize_); }
/// <summary> /// 移除加载中的引用者 /// </summary> /// <param name="refer_"></param> static public void RemoveRefer(object refer_) { if (m_reqHash.Count == 0) { //这字典大部分时间应该会空 return; } string referId = Refer.Format(refer_); foreach (var req in m_reqHash) { if (req.referId == referId) { req.on_complete = null; //通过移除回调来实现 } } }
//-------∽-★-∽------∽-★-∽--------∽-★-∽引用者∽-★-∽--------∽-★-∽------∽-★-∽--------// public override void SetRefer(object refer_) { string id = Refer.Format(refer_); m_referId = id; if (load_reqs != null) { foreach (var v in load_reqs) { if (v.referId == null) { //还没有引用者 v.SetRefer(id); } } } }
/// <summary> /// 异步加载 /// </summary> /// <param name="url_"></param> /// <param name="onComplete_"></param> /// <param name="refer_">只影响onComplete,不会用来持有资源</param> public void LoadAsync(string url_, CALLBACK_GO onComplete_, object refer_) { url_ = url_.ToLower(); m_assetCache.RetainByUrl(this, url_); //m_assetCache.Retain(refer_, url_); //引用者只用this if (m_assetCache.HasAsset(url_)) { CreateGo(url_, onComplete_); return; } string referId = Refer.Format(refer_); AddLoadItem(url_, onComplete_, referId); m_assetCache.LoadAsync(url_, OnLoaded, this); //已自己作为引用者,在ReleaseUnused时才有可能释放 }
//-------∽-★-∽------∽-★-∽--------∽-★-∽加载操作∽-★-∽--------∽-★-∽------∽-★-∽--------// /// <summary> /// 加载图片 /// </summary> /// <param name="image_"></param> /// <param name="url_"></param> /// <param name="spriteName"></param> /// <param name="refer_"></param> /// <param name="nativeSize_">重置图片尺寸</param> public void LoadSprite(object refer_, Image image_, string url_, string spriteName, bool nativeSize_ = false) { string real_url_ = FormatPath(url_); if (m_assetCache.HasAsset(real_url_)) { //资源已加载 SetSprite(refer_, image_, url_, spriteName, nativeSize_); return; } Refer.Assert(refer_); string referId = Refer.Format(refer_); RetainImage(image_, referId); image_.sprite = null; //设置为透明图片 AddLoadItem(referId, image_, real_url_, spriteName, nativeSize_); m_assetCache.LoadAsync(real_url_, OnLoaded, refer_); //用refer_作引用者,直到它deactive才释放 //(这里有bug, 如果先来异步再来同步,异步回来会顶掉正确的那个) }
//-------∽-★-∽------∽-★-∽--------∽-★-∽引用者∽-★-∽--------∽-★-∽------∽-★-∽--------// //暂时没用?? public virtual void SetRefer(object refer_) { m_referId = Refer.Format(refer_); }