ResourceManager.ResourceChecker.CheckInfo.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294
  1. //------------------------------------------------------------
  2. // Game Framework
  3. // Copyright © 2013-2021 loyalsoft. All rights reserved.
  4. // Homepage: http://www.game7000.com/
  5. // Feedback: http://www.game7000.com/
  6. //------------------------------------------------------------
  7. namespace GameFramework.Resource
  8. {
  9. internal sealed partial class ResourceManager : GameFrameworkModule, IResourceManager
  10. {
  11. private sealed partial class ResourceChecker
  12. {
  13. /// <summary>
  14. /// 资源检查信息。
  15. /// </summary>
  16. private sealed partial class CheckInfo
  17. {
  18. private readonly ResourceName m_ResourceName;
  19. private CheckStatus m_Status;
  20. private bool m_NeedRemove;
  21. private bool m_NeedMoveToDisk;
  22. private bool m_NeedMoveToFileSystem;
  23. private RemoteVersionInfo m_VersionInfo;
  24. private LocalVersionInfo m_ReadOnlyInfo;
  25. private LocalVersionInfo m_ReadWriteInfo;
  26. private string m_CachedFileSystemName;
  27. /// <summary>
  28. /// 初始化资源检查信息的新实例。
  29. /// </summary>
  30. /// <param name="resourceName">资源名称。</param>
  31. public CheckInfo(ResourceName resourceName)
  32. {
  33. m_ResourceName = resourceName;
  34. m_Status = CheckStatus.Unknown;
  35. m_NeedRemove = false;
  36. m_NeedMoveToDisk = false;
  37. m_NeedMoveToFileSystem = false;
  38. m_VersionInfo = default(RemoteVersionInfo);
  39. m_ReadOnlyInfo = default(LocalVersionInfo);
  40. m_ReadWriteInfo = default(LocalVersionInfo);
  41. m_CachedFileSystemName = null;
  42. }
  43. /// <summary>
  44. /// 获取资源名称。
  45. /// </summary>
  46. public ResourceName ResourceName
  47. {
  48. get
  49. {
  50. return m_ResourceName;
  51. }
  52. }
  53. /// <summary>
  54. /// 获取资源检查状态。
  55. /// </summary>
  56. public CheckStatus Status
  57. {
  58. get
  59. {
  60. return m_Status;
  61. }
  62. }
  63. /// <summary>
  64. /// 获取是否需要移除读写区的资源。
  65. /// </summary>
  66. public bool NeedRemove
  67. {
  68. get
  69. {
  70. return m_NeedRemove;
  71. }
  72. }
  73. /// <summary>
  74. /// 获取是否需要将读写区的资源移动到磁盘。
  75. /// </summary>
  76. public bool NeedMoveToDisk
  77. {
  78. get
  79. {
  80. return m_NeedMoveToDisk;
  81. }
  82. }
  83. /// <summary>
  84. /// 获取是否需要将读写区的资源移动到文件系统。
  85. /// </summary>
  86. public bool NeedMoveToFileSystem
  87. {
  88. get
  89. {
  90. return m_NeedMoveToFileSystem;
  91. }
  92. }
  93. /// <summary>
  94. /// 获取资源所在的文件系统名称。
  95. /// </summary>
  96. public string FileSystemName
  97. {
  98. get
  99. {
  100. return m_VersionInfo.FileSystemName;
  101. }
  102. }
  103. /// <summary>
  104. /// 获取资源是否使用文件系统。
  105. /// </summary>
  106. public bool ReadWriteUseFileSystem
  107. {
  108. get
  109. {
  110. return m_ReadWriteInfo.UseFileSystem;
  111. }
  112. }
  113. /// <summary>
  114. /// 获取读写资源所在的文件系统名称。
  115. /// </summary>
  116. public string ReadWriteFileSystemName
  117. {
  118. get
  119. {
  120. return m_ReadWriteInfo.FileSystemName;
  121. }
  122. }
  123. /// <summary>
  124. /// 获取资源加载方式。
  125. /// </summary>
  126. public LoadType LoadType
  127. {
  128. get
  129. {
  130. return m_VersionInfo.LoadType;
  131. }
  132. }
  133. /// <summary>
  134. /// 获取资源大小。
  135. /// </summary>
  136. public int Length
  137. {
  138. get
  139. {
  140. return m_VersionInfo.Length;
  141. }
  142. }
  143. /// <summary>
  144. /// 获取资源哈希值。
  145. /// </summary>
  146. public int HashCode
  147. {
  148. get
  149. {
  150. return m_VersionInfo.HashCode;
  151. }
  152. }
  153. /// <summary>
  154. /// 获取压缩后大小。
  155. /// </summary>
  156. public int CompressedLength
  157. {
  158. get
  159. {
  160. return m_VersionInfo.CompressedLength;
  161. }
  162. }
  163. /// <summary>
  164. /// 获取压缩后哈希值。
  165. /// </summary>
  166. public int CompressedHashCode
  167. {
  168. get
  169. {
  170. return m_VersionInfo.CompressedHashCode;
  171. }
  172. }
  173. /// <summary>
  174. /// 临时缓存资源所在的文件系统名称。
  175. /// </summary>
  176. /// <param name="fileSystemName">资源所在的文件系统名称。</param>
  177. public void SetCachedFileSystemName(string fileSystemName)
  178. {
  179. m_CachedFileSystemName = fileSystemName;
  180. }
  181. /// <summary>
  182. /// 设置资源在版本中的信息。
  183. /// </summary>
  184. /// <param name="loadType">资源加载方式。</param>
  185. /// <param name="length">资源大小。</param>
  186. /// <param name="hashCode">资源哈希值。</param>
  187. /// <param name="compressedLength">压缩后大小。</param>
  188. /// <param name="compressedHashCode">压缩后哈希值。</param>
  189. public void SetVersionInfo(LoadType loadType, int length, int hashCode, int compressedLength, int compressedHashCode)
  190. {
  191. if (m_VersionInfo.Exist)
  192. {
  193. throw new GameFrameworkException(Utility.Text.Format("You must set version info of '{0}' only once.", m_ResourceName.FullName));
  194. }
  195. m_VersionInfo = new RemoteVersionInfo(m_CachedFileSystemName, loadType, length, hashCode, compressedLength, compressedHashCode);
  196. m_CachedFileSystemName = null;
  197. }
  198. /// <summary>
  199. /// 设置资源在只读区中的信息。
  200. /// </summary>
  201. /// <param name="loadType">资源加载方式。</param>
  202. /// <param name="length">资源大小。</param>
  203. /// <param name="hashCode">资源哈希值。</param>
  204. public void SetReadOnlyInfo(LoadType loadType, int length, int hashCode)
  205. {
  206. if (m_ReadOnlyInfo.Exist)
  207. {
  208. throw new GameFrameworkException(Utility.Text.Format("You must set read-only info of '{0}' only once.", m_ResourceName.FullName));
  209. }
  210. m_ReadOnlyInfo = new LocalVersionInfo(m_CachedFileSystemName, loadType, length, hashCode);
  211. m_CachedFileSystemName = null;
  212. }
  213. /// <summary>
  214. /// 设置资源在读写区中的信息。
  215. /// </summary>
  216. /// <param name="loadType">资源加载方式。</param>
  217. /// <param name="length">资源大小。</param>
  218. /// <param name="hashCode">资源哈希值。</param>
  219. public void SetReadWriteInfo(LoadType loadType, int length, int hashCode)
  220. {
  221. if (m_ReadWriteInfo.Exist)
  222. {
  223. throw new GameFrameworkException(Utility.Text.Format("You must set read-write info of '{0}' only once.", m_ResourceName.FullName));
  224. }
  225. m_ReadWriteInfo = new LocalVersionInfo(m_CachedFileSystemName, loadType, length, hashCode);
  226. m_CachedFileSystemName = null;
  227. }
  228. /// <summary>
  229. /// 刷新资源信息状态。
  230. /// </summary>
  231. /// <param name="currentVariant">当前变体。</param>
  232. /// <param name="ignoreOtherVariant">是否忽略处理其它变体的资源,若不忽略则移除。</param>
  233. public void RefreshStatus(string currentVariant, bool ignoreOtherVariant)
  234. {
  235. if (!m_VersionInfo.Exist)
  236. {
  237. m_Status = CheckStatus.Disuse;
  238. m_NeedRemove = m_ReadWriteInfo.Exist;
  239. return;
  240. }
  241. if (m_ResourceName.Variant == null || m_ResourceName.Variant == currentVariant)
  242. {
  243. 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)
  244. {
  245. m_Status = CheckStatus.StorageInReadOnly;
  246. m_NeedRemove = m_ReadWriteInfo.Exist;
  247. }
  248. else if (m_ReadWriteInfo.Exist && m_ReadWriteInfo.LoadType == m_VersionInfo.LoadType && m_ReadWriteInfo.Length == m_VersionInfo.Length && m_ReadWriteInfo.HashCode == m_VersionInfo.HashCode)
  249. {
  250. bool differentFileSystem = m_ReadWriteInfo.FileSystemName != m_VersionInfo.FileSystemName;
  251. m_Status = CheckStatus.StorageInReadWrite;
  252. m_NeedMoveToDisk = m_ReadWriteInfo.UseFileSystem && differentFileSystem;
  253. m_NeedMoveToFileSystem = m_VersionInfo.UseFileSystem && differentFileSystem;
  254. }
  255. else
  256. {
  257. m_Status = CheckStatus.Update;
  258. m_NeedRemove = m_ReadWriteInfo.Exist;
  259. }
  260. }
  261. else
  262. {
  263. m_Status = CheckStatus.Unavailable;
  264. m_NeedRemove = !ignoreOtherVariant && m_ReadWriteInfo.Exist;
  265. }
  266. }
  267. }
  268. }
  269. }
  270. }