123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361 |
- //------------------------------------------------------------
- // Game Framework
- // Copyright © 2013-2021 loyalsoft. All rights reserved.
- // Homepage: http://www.game7000.com/
- // Feedback: http://www.game7000.com/
- //------------------------------------------------------------
- using GameFramework.FileSystem;
- using System;
- using System.Collections.Generic;
- using System.IO;
- namespace GameFramework.Resource
- {
- internal sealed partial class ResourceManager : GameFrameworkModule, IResourceManager
- {
- private sealed partial class ResourceLoader
- {
- /// <summary>
- /// 加载资源代理。
- /// </summary>
- private sealed partial class LoadResourceAgent : ITaskAgent<LoadResourceTaskBase>
- {
- private static readonly Dictionary<string, string> s_CachedResourceNames = new Dictionary<string, string>(StringComparer.Ordinal);
- private static readonly HashSet<string> s_LoadingAssetNames = new HashSet<string>(StringComparer.Ordinal);
- private static readonly HashSet<string> s_LoadingResourceNames = new HashSet<string>(StringComparer.Ordinal);
- private readonly ILoadResourceAgentHelper m_Helper;
- private readonly IResourceHelper m_ResourceHelper;
- private readonly ResourceLoader m_ResourceLoader;
- private readonly string m_ReadOnlyPath;
- private readonly string m_ReadWritePath;
- private readonly DecryptResourceCallback m_DecryptResourceCallback;
- private LoadResourceTaskBase m_Task;
- /// <summary>
- /// 初始化加载资源代理的新实例。
- /// </summary>
- /// <param name="loadResourceAgentHelper">加载资源代理辅助器。</param>
- /// <param name="resourceHelper">资源辅助器。</param>
- /// <param name="resourceLoader">加载资源器。</param>
- /// <param name="readOnlyPath">资源只读区路径。</param>
- /// <param name="readWritePath">资源读写区路径。</param>
- /// <param name="decryptResourceCallback">解密资源回调函数。</param>
- public LoadResourceAgent(ILoadResourceAgentHelper loadResourceAgentHelper, IResourceHelper resourceHelper, ResourceLoader resourceLoader, string readOnlyPath, string readWritePath, DecryptResourceCallback decryptResourceCallback)
- {
- if (loadResourceAgentHelper == null)
- {
- throw new GameFrameworkException("Load resource agent helper is invalid.");
- }
- if (resourceHelper == null)
- {
- throw new GameFrameworkException("Resource helper is invalid.");
- }
- if (resourceLoader == null)
- {
- throw new GameFrameworkException("Resource loader is invalid.");
- }
- if (decryptResourceCallback == null)
- {
- throw new GameFrameworkException("Decrypt resource callback is invalid.");
- }
- m_Helper = loadResourceAgentHelper;
- m_ResourceHelper = resourceHelper;
- m_ResourceLoader = resourceLoader;
- m_ReadOnlyPath = readOnlyPath;
- m_ReadWritePath = readWritePath;
- m_DecryptResourceCallback = decryptResourceCallback;
- m_Task = null;
- }
- public ILoadResourceAgentHelper Helper
- {
- get
- {
- return m_Helper;
- }
- }
- /// <summary>
- /// 获取加载资源任务。
- /// </summary>
- public LoadResourceTaskBase Task
- {
- get
- {
- return m_Task;
- }
- }
- /// <summary>
- /// 初始化加载资源代理。
- /// </summary>
- public void Initialize()
- {
- m_Helper.LoadResourceAgentHelperUpdate += OnLoadResourceAgentHelperUpdate;
- m_Helper.LoadResourceAgentHelperReadFileComplete += OnLoadResourceAgentHelperReadFileComplete;
- m_Helper.LoadResourceAgentHelperReadBytesComplete += OnLoadResourceAgentHelperReadBytesComplete;
- m_Helper.LoadResourceAgentHelperParseBytesComplete += OnLoadResourceAgentHelperParseBytesComplete;
- m_Helper.LoadResourceAgentHelperLoadComplete += OnLoadResourceAgentHelperLoadComplete;
- m_Helper.LoadResourceAgentHelperError += OnLoadResourceAgentHelperError;
- }
- /// <summary>
- /// 加载资源代理轮询。
- /// </summary>
- /// <param name="elapseSeconds">逻辑流逝时间,以秒为单位。</param>
- /// <param name="realElapseSeconds">真实流逝时间,以秒为单位。</param>
- public void Update(float elapseSeconds, float realElapseSeconds)
- {
- }
- /// <summary>
- /// 关闭并清理加载资源代理。
- /// </summary>
- public void Shutdown()
- {
- Reset();
- m_Helper.LoadResourceAgentHelperUpdate -= OnLoadResourceAgentHelperUpdate;
- m_Helper.LoadResourceAgentHelperReadFileComplete -= OnLoadResourceAgentHelperReadFileComplete;
- m_Helper.LoadResourceAgentHelperReadBytesComplete -= OnLoadResourceAgentHelperReadBytesComplete;
- m_Helper.LoadResourceAgentHelperParseBytesComplete -= OnLoadResourceAgentHelperParseBytesComplete;
- m_Helper.LoadResourceAgentHelperLoadComplete -= OnLoadResourceAgentHelperLoadComplete;
- m_Helper.LoadResourceAgentHelperError -= OnLoadResourceAgentHelperError;
- }
- public static void Clear()
- {
- s_CachedResourceNames.Clear();
- s_LoadingAssetNames.Clear();
- s_LoadingResourceNames.Clear();
- }
- /// <summary>
- /// 开始处理加载资源任务。
- /// </summary>
- /// <param name="task">要处理的加载资源任务。</param>
- /// <returns>开始处理任务的状态。</returns>
- public StartTaskStatus Start(LoadResourceTaskBase task)
- {
- if (task == null)
- {
- throw new GameFrameworkException("Task is invalid.");
- }
- m_Task = task;
- m_Task.StartTime = DateTime.UtcNow;
- ResourceInfo resourceInfo = m_Task.ResourceInfo;
- if (!resourceInfo.Ready)
- {
- m_Task.StartTime = default(DateTime);
- return StartTaskStatus.HasToWait;
- }
- if (IsAssetLoading(m_Task.AssetName))
- {
- m_Task.StartTime = default(DateTime);
- return StartTaskStatus.HasToWait;
- }
- if (!m_Task.IsScene)
- {
- AssetObject assetObject = m_ResourceLoader.m_AssetPool.Spawn(m_Task.AssetName);
- if (assetObject != null)
- {
- OnAssetObjectReady(assetObject);
- return StartTaskStatus.Done;
- }
- }
- foreach (string dependencyAssetName in m_Task.GetDependencyAssetNames())
- {
- if (!m_ResourceLoader.m_AssetPool.CanSpawn(dependencyAssetName))
- {
- m_Task.StartTime = default(DateTime);
- return StartTaskStatus.HasToWait;
- }
- }
- string resourceName = resourceInfo.ResourceName.Name;
- if (IsResourceLoading(resourceName))
- {
- m_Task.StartTime = default(DateTime);
- return StartTaskStatus.HasToWait;
- }
- s_LoadingAssetNames.Add(m_Task.AssetName);
- ResourceObject resourceObject = m_ResourceLoader.m_ResourcePool.Spawn(resourceName);
- if (resourceObject != null)
- {
- OnResourceObjectReady(resourceObject);
- return StartTaskStatus.CanResume;
- }
- s_LoadingResourceNames.Add(resourceName);
- string fullPath = null;
- if (!s_CachedResourceNames.TryGetValue(resourceName, out fullPath))
- {
- fullPath = Utility.Path.GetRegularPath(Path.Combine(resourceInfo.StorageInReadOnly ? m_ReadOnlyPath : m_ReadWritePath, resourceInfo.UseFileSystem ? resourceInfo.FileSystemName : resourceInfo.ResourceName.FullName));
- s_CachedResourceNames.Add(resourceName, fullPath);
- }
- if (resourceInfo.LoadType == LoadType.LoadFromFile)
- {
- if (resourceInfo.UseFileSystem)
- {
- IFileSystem fileSystem = m_ResourceLoader.m_ResourceManager.GetFileSystem(resourceInfo.FileSystemName, resourceInfo.StorageInReadOnly);
- m_Helper.ReadFile(fileSystem, resourceInfo.ResourceName.FullName);
- }
- else
- {
- m_Helper.ReadFile(fullPath);
- }
- }
- else if (resourceInfo.LoadType == LoadType.LoadFromMemory || resourceInfo.LoadType == LoadType.LoadFromMemoryAndQuickDecrypt || resourceInfo.LoadType == LoadType.LoadFromMemoryAndDecrypt)
- {
- if (resourceInfo.UseFileSystem)
- {
- IFileSystem fileSystem = m_ResourceLoader.m_ResourceManager.GetFileSystem(resourceInfo.FileSystemName, resourceInfo.StorageInReadOnly);
- m_Helper.ReadBytes(fileSystem, resourceInfo.ResourceName.FullName);
- }
- else
- {
- m_Helper.ReadBytes(fullPath);
- }
- }
- else
- {
- throw new GameFrameworkException(Utility.Text.Format("Resource load type '{0}' is not supported.", resourceInfo.LoadType));
- }
- return StartTaskStatus.CanResume;
- }
- /// <summary>
- /// 重置加载资源代理。
- /// </summary>
- public void Reset()
- {
- m_Helper.Reset();
- m_Task = null;
- }
- private static bool IsAssetLoading(string assetName)
- {
- return s_LoadingAssetNames.Contains(assetName);
- }
- private static bool IsResourceLoading(string resourceName)
- {
- return s_LoadingResourceNames.Contains(resourceName);
- }
- private void OnAssetObjectReady(AssetObject assetObject)
- {
- m_Helper.Reset();
- object asset = assetObject.Target;
- if (m_Task.IsScene)
- {
- m_ResourceLoader.m_SceneToAssetMap.Add(m_Task.AssetName, asset);
- }
- m_Task.OnLoadAssetSuccess(this, asset, (float)(DateTime.UtcNow - m_Task.StartTime).TotalSeconds);
- m_Task.Done = true;
- }
- private void OnResourceObjectReady(ResourceObject resourceObject)
- {
- m_Task.LoadMain(this, resourceObject);
- }
- private void OnError(LoadResourceStatus status, string errorMessage)
- {
- m_Helper.Reset();
- m_Task.OnLoadAssetFailure(this, status, errorMessage);
- s_LoadingAssetNames.Remove(m_Task.AssetName);
- s_LoadingResourceNames.Remove(m_Task.ResourceInfo.ResourceName.Name);
- m_Task.Done = true;
- }
- private void OnLoadResourceAgentHelperUpdate(object sender, LoadResourceAgentHelperUpdateEventArgs e)
- {
- m_Task.OnLoadAssetUpdate(this, e.Type, e.Progress);
- }
- private void OnLoadResourceAgentHelperReadFileComplete(object sender, LoadResourceAgentHelperReadFileCompleteEventArgs e)
- {
- ResourceObject resourceObject = ResourceObject.Create(m_Task.ResourceInfo.ResourceName.Name, e.Resource, m_ResourceHelper, m_ResourceLoader);
- m_ResourceLoader.m_ResourcePool.Register(resourceObject, true);
- s_LoadingResourceNames.Remove(m_Task.ResourceInfo.ResourceName.Name);
- OnResourceObjectReady(resourceObject);
- }
- private void OnLoadResourceAgentHelperReadBytesComplete(object sender, LoadResourceAgentHelperReadBytesCompleteEventArgs e)
- {
- byte[] bytes = e.GetBytes();
- ResourceInfo resourceInfo = m_Task.ResourceInfo;
- if (resourceInfo.LoadType == LoadType.LoadFromMemoryAndQuickDecrypt || resourceInfo.LoadType == LoadType.LoadFromMemoryAndDecrypt)
- {
- m_DecryptResourceCallback(bytes, 0, bytes.Length, resourceInfo.ResourceName.Name, resourceInfo.ResourceName.Variant, resourceInfo.ResourceName.Extension, resourceInfo.StorageInReadOnly, resourceInfo.FileSystemName, (byte)resourceInfo.LoadType, resourceInfo.Length, resourceInfo.HashCode);
- }
- m_Helper.ParseBytes(bytes);
- }
- private void OnLoadResourceAgentHelperParseBytesComplete(object sender, LoadResourceAgentHelperParseBytesCompleteEventArgs e)
- {
- ResourceObject resourceObject = ResourceObject.Create(m_Task.ResourceInfo.ResourceName.Name, e.Resource, m_ResourceHelper, m_ResourceLoader);
- m_ResourceLoader.m_ResourcePool.Register(resourceObject, true);
- s_LoadingResourceNames.Remove(m_Task.ResourceInfo.ResourceName.Name);
- OnResourceObjectReady(resourceObject);
- }
- private void OnLoadResourceAgentHelperLoadComplete(object sender, LoadResourceAgentHelperLoadCompleteEventArgs e)
- {
- AssetObject assetObject = null;
- if (m_Task.IsScene)
- {
- assetObject = m_ResourceLoader.m_AssetPool.Spawn(m_Task.AssetName);
- }
- if (assetObject == null)
- {
- List<object> dependencyAssets = m_Task.GetDependencyAssets();
- assetObject = AssetObject.Create(m_Task.AssetName, e.Asset, dependencyAssets, m_Task.ResourceObject.Target, m_ResourceHelper, m_ResourceLoader);
- m_ResourceLoader.m_AssetPool.Register(assetObject, true);
- m_ResourceLoader.m_AssetToResourceMap.Add(e.Asset, m_Task.ResourceObject.Target);
- foreach (object dependencyAsset in dependencyAssets)
- {
- object dependencyResource = null;
- if (m_ResourceLoader.m_AssetToResourceMap.TryGetValue(dependencyAsset, out dependencyResource))
- {
- m_Task.ResourceObject.AddDependencyResource(dependencyResource);
- }
- else
- {
- throw new GameFrameworkException("Can not find dependency resource.");
- }
- }
- }
- s_LoadingAssetNames.Remove(m_Task.AssetName);
- OnAssetObjectReady(assetObject);
- }
- private void OnLoadResourceAgentHelperError(object sender, LoadResourceAgentHelperErrorEventArgs e)
- {
- OnError(e.Status, e.ErrorMessage);
- }
- }
- }
- }
- }
|