//------------------------------------------------------------ // Game Framework // Copyright © 2013-2021 loyalsoft. All rights reserved. // Homepage: http://www.game7000.com/ // Feedback: http://www.game7000.com/ //------------------------------------------------------------ namespace GameFramework.Resource { internal sealed partial class ResourceManager : GameFrameworkModule, IResourceManager { private sealed partial class ResourceChecker { /// /// 资源检查信息。 /// private sealed partial class CheckInfo { private readonly ResourceName m_ResourceName; private CheckStatus m_Status; private bool m_NeedRemove; private bool m_NeedMoveToDisk; private bool m_NeedMoveToFileSystem; private RemoteVersionInfo m_VersionInfo; private LocalVersionInfo m_ReadOnlyInfo; private LocalVersionInfo m_ReadWriteInfo; private string m_CachedFileSystemName; /// /// 初始化资源检查信息的新实例。 /// /// 资源名称。 public CheckInfo(ResourceName resourceName) { m_ResourceName = resourceName; m_Status = CheckStatus.Unknown; m_NeedRemove = false; m_NeedMoveToDisk = false; m_NeedMoveToFileSystem = false; m_VersionInfo = default(RemoteVersionInfo); m_ReadOnlyInfo = default(LocalVersionInfo); m_ReadWriteInfo = default(LocalVersionInfo); m_CachedFileSystemName = null; } /// /// 获取资源名称。 /// public ResourceName ResourceName { get { return m_ResourceName; } } /// /// 获取资源检查状态。 /// public CheckStatus Status { get { return m_Status; } } /// /// 获取是否需要移除读写区的资源。 /// public bool NeedRemove { get { return m_NeedRemove; } } /// /// 获取是否需要将读写区的资源移动到磁盘。 /// public bool NeedMoveToDisk { get { return m_NeedMoveToDisk; } } /// /// 获取是否需要将读写区的资源移动到文件系统。 /// public bool NeedMoveToFileSystem { get { return m_NeedMoveToFileSystem; } } /// /// 获取资源所在的文件系统名称。 /// public string FileSystemName { get { return m_VersionInfo.FileSystemName; } } /// /// 获取资源是否使用文件系统。 /// public bool ReadWriteUseFileSystem { get { return m_ReadWriteInfo.UseFileSystem; } } /// /// 获取读写资源所在的文件系统名称。 /// public string ReadWriteFileSystemName { get { return m_ReadWriteInfo.FileSystemName; } } /// /// 获取资源加载方式。 /// public LoadType LoadType { get { return m_VersionInfo.LoadType; } } /// /// 获取资源大小。 /// public int Length { get { return m_VersionInfo.Length; } } /// /// 获取资源哈希值。 /// public int HashCode { get { return m_VersionInfo.HashCode; } } /// /// 获取压缩后大小。 /// public int CompressedLength { get { return m_VersionInfo.CompressedLength; } } /// /// 获取压缩后哈希值。 /// public int CompressedHashCode { get { return m_VersionInfo.CompressedHashCode; } } /// /// 临时缓存资源所在的文件系统名称。 /// /// 资源所在的文件系统名称。 public void SetCachedFileSystemName(string fileSystemName) { m_CachedFileSystemName = fileSystemName; } /// /// 设置资源在版本中的信息。 /// /// 资源加载方式。 /// 资源大小。 /// 资源哈希值。 /// 压缩后大小。 /// 压缩后哈希值。 public void SetVersionInfo(LoadType loadType, int length, int hashCode, int compressedLength, int compressedHashCode) { if (m_VersionInfo.Exist) { throw new GameFrameworkException(Utility.Text.Format("You must set version info of '{0}' only once.", m_ResourceName.FullName)); } m_VersionInfo = new RemoteVersionInfo(m_CachedFileSystemName, loadType, length, hashCode, compressedLength, compressedHashCode); m_CachedFileSystemName = null; } /// /// 设置资源在只读区中的信息。 /// /// 资源加载方式。 /// 资源大小。 /// 资源哈希值。 public void SetReadOnlyInfo(LoadType loadType, int length, int hashCode) { if (m_ReadOnlyInfo.Exist) { throw new GameFrameworkException(Utility.Text.Format("You must set read-only info of '{0}' only once.", m_ResourceName.FullName)); } m_ReadOnlyInfo = new LocalVersionInfo(m_CachedFileSystemName, loadType, length, hashCode); m_CachedFileSystemName = null; } /// /// 设置资源在读写区中的信息。 /// /// 资源加载方式。 /// 资源大小。 /// 资源哈希值。 public void SetReadWriteInfo(LoadType loadType, int length, int hashCode) { if (m_ReadWriteInfo.Exist) { throw new GameFrameworkException(Utility.Text.Format("You must set read-write info of '{0}' only once.", m_ResourceName.FullName)); } m_ReadWriteInfo = new LocalVersionInfo(m_CachedFileSystemName, loadType, length, hashCode); m_CachedFileSystemName = null; } /// /// 刷新资源信息状态。 /// /// 当前变体。 /// 是否忽略处理其它变体的资源,若不忽略则移除。 public void RefreshStatus(string currentVariant, bool ignoreOtherVariant) { if (!m_VersionInfo.Exist) { m_Status = CheckStatus.Disuse; m_NeedRemove = m_ReadWriteInfo.Exist; return; } if (m_ResourceName.Variant == null || m_ResourceName.Variant == currentVariant) { if (m_ReadOnlyInfo.Exist && m_ReadOnlyInfo.FileSystemName == m_VersionInfo.FileSystemName && m_ReadOnlyInfo.LoadType == m_VersionInfo.LoadType && m_ReadOnlyInfo.Length == m_VersionInfo.Length && m_ReadOnlyInfo.HashCode == m_VersionInfo.HashCode) { m_Status = CheckStatus.StorageInReadOnly; m_NeedRemove = m_ReadWriteInfo.Exist; } else if (m_ReadWriteInfo.Exist && m_ReadWriteInfo.LoadType == m_VersionInfo.LoadType && m_ReadWriteInfo.Length == m_VersionInfo.Length && m_ReadWriteInfo.HashCode == m_VersionInfo.HashCode) { bool differentFileSystem = m_ReadWriteInfo.FileSystemName != m_VersionInfo.FileSystemName; m_Status = CheckStatus.StorageInReadWrite; m_NeedMoveToDisk = m_ReadWriteInfo.UseFileSystem && differentFileSystem; m_NeedMoveToFileSystem = m_VersionInfo.UseFileSystem && differentFileSystem; } else { m_Status = CheckStatus.Update; m_NeedRemove = m_ReadWriteInfo.Exist; } } else { m_Status = CheckStatus.Unavailable; m_NeedRemove = !ignoreOtherVariant && m_ReadWriteInfo.Exist; } } } } } }