266 lines
6.6 KiB
C#
266 lines
6.6 KiB
C#
/****************************************************************************
|
|
* Copyright (c) 2017 snowcold
|
|
* Copyright (c) 2017 ~ 2018.7 liangxie
|
|
*
|
|
* http://qframework.io
|
|
* https://github.com/liangxiegame/QFramework
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
* of this software and associated documentation files (the "Software"), to deal
|
|
* in the Software without restriction, including without limitation the rights
|
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
* copies of the Software, and to permit persons to whom the Software is
|
|
* furnished to do so, subject to the following conditions:
|
|
*
|
|
* The above copyright notice and this permission notice shall be included in
|
|
* all copies or substantial portions of the Software.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
* THE SOFTWARE.
|
|
****************************************************************************/
|
|
|
|
namespace QFramework
|
|
{
|
|
using UnityEngine;
|
|
using System.Collections;
|
|
|
|
public static class NetImageResUtil
|
|
{
|
|
public static string ToNetImageResName(this string selfHttpUrl)
|
|
{
|
|
return string.Format("netimage:{0}", selfHttpUrl);
|
|
}
|
|
}
|
|
|
|
public class NetImageRes : Res
|
|
{
|
|
private string mUrl;
|
|
private string mHashCode;
|
|
private object mRawAsset;
|
|
#pragma warning disable CS0618
|
|
private WWW mWWW;
|
|
#pragma warning restore CS0618
|
|
|
|
public static NetImageRes Allocate(string lowerName,string originalName)
|
|
{
|
|
NetImageRes res = SafeObjectPool<NetImageRes>.Instance.Allocate();
|
|
if (res != null)
|
|
{
|
|
res.AssetName = lowerName;
|
|
res.SetUrl(originalName.Substring(9));
|
|
}
|
|
return res;
|
|
}
|
|
|
|
public void SetDownloadProgress(int totalSize, int download)
|
|
{
|
|
|
|
}
|
|
|
|
public string LocalResPath
|
|
{
|
|
get { return string.Format("{0}{1}", AssetBundlePathHelper.PersistentDataPath4Photo, mHashCode); }
|
|
}
|
|
|
|
public virtual object RawAsset
|
|
{
|
|
get { return mRawAsset; }
|
|
}
|
|
|
|
public bool NeedDownload
|
|
{
|
|
get { return RefCount > 0; }
|
|
}
|
|
|
|
public string Url
|
|
{
|
|
get { return mUrl; }
|
|
}
|
|
|
|
public int FileSize
|
|
{
|
|
get { return 1; }
|
|
}
|
|
|
|
public void SetUrl(string url)
|
|
{
|
|
if (string.IsNullOrEmpty(url))
|
|
{
|
|
return;
|
|
}
|
|
|
|
mUrl = url;
|
|
mHashCode = string.Format("Photo_{0}", mUrl.GetHashCode());
|
|
}
|
|
|
|
public override bool UnloadImage(bool flag)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
public override bool LoadSync()
|
|
{
|
|
return false;
|
|
}
|
|
|
|
public override void LoadAsync()
|
|
{
|
|
if (!CheckLoadAble())
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (string.IsNullOrEmpty(mAssetName))
|
|
{
|
|
return;
|
|
}
|
|
|
|
DoLoadWork();
|
|
}
|
|
|
|
private void DoLoadWork()
|
|
{
|
|
State = ResState.Loading;
|
|
|
|
OnDownLoadResult(true);
|
|
|
|
//检测本地文件是否存在
|
|
/*
|
|
if (!File.Exists(LocalResPath))
|
|
{
|
|
ResDownloader.S.AddDownloadTask(this);
|
|
}
|
|
else
|
|
{
|
|
OnDownLoadResult(true);
|
|
}
|
|
*/
|
|
}
|
|
|
|
protected override void OnReleaseRes()
|
|
{
|
|
if (mAsset != null)
|
|
{
|
|
GameObject.Destroy(mAsset);
|
|
mAsset = null;
|
|
}
|
|
|
|
mRawAsset = null;
|
|
}
|
|
|
|
public override void Recycle2Cache()
|
|
{
|
|
SafeObjectPool<NetImageRes>.Instance.Recycle(this);
|
|
}
|
|
|
|
public override void OnRecycled()
|
|
{
|
|
|
|
}
|
|
|
|
public void DeleteOldResFile()
|
|
{
|
|
//throw new NotImplementedException();
|
|
}
|
|
|
|
public void OnDownLoadResult(bool result)
|
|
{
|
|
if (!result)
|
|
{
|
|
OnResLoadFaild();
|
|
return;
|
|
}
|
|
|
|
if (RefCount <= 0)
|
|
{
|
|
State = ResState.Waiting;
|
|
return;
|
|
}
|
|
|
|
ResMgr.Instance.PushIEnumeratorTask(this);
|
|
//ResMgr.S.PostLoadTask(LoadImage());
|
|
}
|
|
|
|
//完全的WWW方式,Unity 帮助管理纹理缓存,并且效率貌似更高
|
|
public override IEnumerator DoLoadAsync(System.Action finishCallback)
|
|
{
|
|
if (RefCount <= 0)
|
|
{
|
|
OnResLoadFaild();
|
|
finishCallback();
|
|
yield break;
|
|
}
|
|
|
|
#pragma warning disable CS0618
|
|
WWW www = new WWW(mUrl);
|
|
#pragma warning restore CS0618
|
|
|
|
mWWW = www;
|
|
|
|
yield return www;
|
|
|
|
mWWW = null;
|
|
|
|
if (www.error != null)
|
|
{
|
|
Debug.LogError($"Res:{mUrl}, WWW Errors:{www.error}");
|
|
OnResLoadFaild();
|
|
finishCallback();
|
|
yield break;
|
|
}
|
|
|
|
if (!www.isDone)
|
|
{
|
|
Debug.LogError("NetImageRes WWW Not Done! Url:" + mUrl);
|
|
OnResLoadFaild();
|
|
finishCallback();
|
|
|
|
www.Dispose();
|
|
www = null;
|
|
|
|
yield break;
|
|
}
|
|
|
|
if (RefCount <= 0)
|
|
{
|
|
OnResLoadFaild();
|
|
finishCallback();
|
|
|
|
www.Dispose();
|
|
www = null;
|
|
yield break;
|
|
}
|
|
|
|
//TimeDebugger dt = new TimeDebugger("Tex");
|
|
//dt.Begin("LoadingTask");
|
|
//这里是同步的操作
|
|
mAsset = www.texture;
|
|
//dt.End();
|
|
|
|
www.Dispose();
|
|
www = null;
|
|
|
|
//dt.Dump(-1);
|
|
|
|
State = ResState.Ready;
|
|
|
|
finishCallback();
|
|
}
|
|
|
|
protected override float CalculateProgress()
|
|
{
|
|
if (mWWW == null)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
return mWWW.progress;
|
|
}
|
|
}
|
|
}
|