Exemplo n.º 1
0
        /// <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);
        }
Exemplo n.º 2
0
        public void OnReferDispose(object refer_)
        {
#if UNITY_EDITOR
            Log.Debug("<color=magenta>检测到引用者析构: " + Refer.Format(refer_) + "</color>", this);
#endif
            Release(refer_);
        }
Exemplo n.º 3
0
        /// <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);
        }
Exemplo n.º 4
0
        /// <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_)
        }
Exemplo n.º 5
0
        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);
        }
Exemplo n.º 6
0
        //-------∽-★-∽------∽-★-∽--------∽-★-∽引用相关∽-★-∽--------∽-★-∽------∽-★-∽--------//

        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);
        }
Exemplo n.º 7
0
        /// <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_);
        }
Exemplo n.º 8
0
        /// <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;     //通过移除回调来实现
                }
            }
        }
Exemplo n.º 9
0
        //-------∽-★-∽------∽-★-∽--------∽-★-∽引用者∽-★-∽--------∽-★-∽------∽-★-∽--------//

        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);
                    }
                }
            }
        }
Exemplo n.º 10
0
        /// <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时才有可能释放
        }
Exemplo n.º 11
0
        //-------∽-★-∽------∽-★-∽--------∽-★-∽加载操作∽-★-∽--------∽-★-∽------∽-★-∽--------//


        /// <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, 如果先来异步再来同步,异步回来会顶掉正确的那个)
        }
Exemplo n.º 12
0
        //-------∽-★-∽------∽-★-∽--------∽-★-∽引用者∽-★-∽--------∽-★-∽------∽-★-∽--------//

        //暂时没用??
        public virtual void SetRefer(object refer_)
        {
            m_referId = Refer.Format(refer_);
        }