ResourceManager.ResourceGroup.cs 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  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. using System.Collections.Generic;
  8. namespace GameFramework.Resource
  9. {
  10. internal sealed partial class ResourceManager : GameFrameworkModule, IResourceManager
  11. {
  12. /// <summary>
  13. /// 资源组。
  14. /// </summary>
  15. private sealed class ResourceGroup : IResourceGroup
  16. {
  17. private readonly string m_Name;
  18. private readonly Dictionary<ResourceName, ResourceInfo> m_ResourceInfos;
  19. private readonly HashSet<ResourceName> m_ResourceNames;
  20. private long m_TotalLength;
  21. private long m_TotalCompressedLength;
  22. /// <summary>
  23. /// 初始化资源组的新实例。
  24. /// </summary>
  25. /// <param name="name">资源组名称。</param>
  26. /// <param name="resourceInfos">资源信息引用。</param>
  27. public ResourceGroup(string name, Dictionary<ResourceName, ResourceInfo> resourceInfos)
  28. {
  29. if (name == null)
  30. {
  31. throw new GameFrameworkException("Name is invalid.");
  32. }
  33. if (resourceInfos == null)
  34. {
  35. throw new GameFrameworkException("Resource infos is invalid.");
  36. }
  37. m_Name = name;
  38. m_ResourceInfos = resourceInfos;
  39. m_ResourceNames = new HashSet<ResourceName>();
  40. }
  41. /// <summary>
  42. /// 获取资源组名称。
  43. /// </summary>
  44. public string Name
  45. {
  46. get
  47. {
  48. return m_Name;
  49. }
  50. }
  51. /// <summary>
  52. /// 获取资源组是否准备完毕。
  53. /// </summary>
  54. public bool Ready
  55. {
  56. get
  57. {
  58. return ReadyCount >= TotalCount;
  59. }
  60. }
  61. /// <summary>
  62. /// 获取资源组包含资源数量。
  63. /// </summary>
  64. public int TotalCount
  65. {
  66. get
  67. {
  68. return m_ResourceNames.Count;
  69. }
  70. }
  71. /// <summary>
  72. /// 获取资源组中已准备完成资源数量。
  73. /// </summary>
  74. public int ReadyCount
  75. {
  76. get
  77. {
  78. int readyCount = 0;
  79. foreach (ResourceName resourceName in m_ResourceNames)
  80. {
  81. ResourceInfo resourceInfo = null;
  82. if (m_ResourceInfos.TryGetValue(resourceName, out resourceInfo) && resourceInfo.Ready)
  83. {
  84. readyCount++;
  85. }
  86. }
  87. return readyCount;
  88. }
  89. }
  90. /// <summary>
  91. /// 获取资源组包含资源的总大小。
  92. /// </summary>
  93. public long TotalLength
  94. {
  95. get
  96. {
  97. return m_TotalLength;
  98. }
  99. }
  100. /// <summary>
  101. /// 获取资源组包含资源压缩后的总大小。
  102. /// </summary>
  103. public long TotalCompressedLength
  104. {
  105. get
  106. {
  107. return m_TotalCompressedLength;
  108. }
  109. }
  110. /// <summary>
  111. /// 获取资源组中已准备完成资源的总大小。
  112. /// </summary>
  113. public long ReadyLength
  114. {
  115. get
  116. {
  117. long readyLength = 0L;
  118. foreach (ResourceName resourceName in m_ResourceNames)
  119. {
  120. ResourceInfo resourceInfo = null;
  121. if (m_ResourceInfos.TryGetValue(resourceName, out resourceInfo) && resourceInfo.Ready)
  122. {
  123. readyLength += resourceInfo.Length;
  124. }
  125. }
  126. return readyLength;
  127. }
  128. }
  129. /// <summary>
  130. /// 获取资源组中已准备完成资源压缩后的总大小。
  131. /// </summary>
  132. public long ReadyCompressedLength
  133. {
  134. get
  135. {
  136. long readyCompressedLength = 0L;
  137. foreach (ResourceName resourceName in m_ResourceNames)
  138. {
  139. ResourceInfo resourceInfo = null;
  140. if (m_ResourceInfos.TryGetValue(resourceName, out resourceInfo) && resourceInfo.Ready)
  141. {
  142. readyCompressedLength += resourceInfo.CompressedLength;
  143. }
  144. }
  145. return readyCompressedLength;
  146. }
  147. }
  148. /// <summary>
  149. /// 获取资源组的完成进度。
  150. /// </summary>
  151. public float Progress
  152. {
  153. get
  154. {
  155. return m_TotalLength > 0L ? (float)ReadyLength / m_TotalLength : 1f;
  156. }
  157. }
  158. /// <summary>
  159. /// 获取资源组包含的资源名称列表。
  160. /// </summary>
  161. /// <returns>资源组包含的资源名称列表。</returns>
  162. public string[] GetResourceNames()
  163. {
  164. int index = 0;
  165. string[] resourceNames = new string[m_ResourceNames.Count];
  166. foreach (ResourceName resourceName in m_ResourceNames)
  167. {
  168. resourceNames[index++] = resourceName.FullName;
  169. }
  170. return resourceNames;
  171. }
  172. /// <summary>
  173. /// 获取资源组包含的资源名称列表。
  174. /// </summary>
  175. /// <param name="results">资源组包含的资源名称列表。</param>
  176. public void GetResourceNames(List<string> results)
  177. {
  178. if (results == null)
  179. {
  180. throw new GameFrameworkException("Results is invalid.");
  181. }
  182. results.Clear();
  183. foreach (ResourceName resourceName in m_ResourceNames)
  184. {
  185. results.Add(resourceName.FullName);
  186. }
  187. }
  188. /// <summary>
  189. /// 获取资源组包含的资源名称列表。
  190. /// </summary>
  191. /// <returns>资源组包含的资源名称列表。</returns>
  192. public ResourceName[] InternalGetResourceNames()
  193. {
  194. int index = 0;
  195. ResourceName[] resourceNames = new ResourceName[m_ResourceNames.Count];
  196. foreach (ResourceName resourceName in m_ResourceNames)
  197. {
  198. resourceNames[index++] = resourceName;
  199. }
  200. return resourceNames;
  201. }
  202. /// <summary>
  203. /// 获取资源组包含的资源名称列表。
  204. /// </summary>
  205. /// <param name="results">资源组包含的资源名称列表。</param>
  206. public void InternalGetResourceNames(List<ResourceName> results)
  207. {
  208. if (results == null)
  209. {
  210. throw new GameFrameworkException("Results is invalid.");
  211. }
  212. results.Clear();
  213. foreach (ResourceName resourceName in m_ResourceNames)
  214. {
  215. results.Add(resourceName);
  216. }
  217. }
  218. /// <summary>
  219. /// 检查指定资源是否属于资源组。
  220. /// </summary>
  221. /// <param name="resourceName">要检查的资源的名称。</param>
  222. /// <returns>指定资源是否属于资源组。</returns>
  223. public bool HasResource(ResourceName resourceName)
  224. {
  225. return m_ResourceNames.Contains(resourceName);
  226. }
  227. /// <summary>
  228. /// 向资源组中增加资源。
  229. /// </summary>
  230. /// <param name="resourceName">资源名称。</param>
  231. /// <param name="length">资源大小。</param>
  232. /// <param name="compressedLength">资源压缩后的大小。</param>
  233. public void AddResource(ResourceName resourceName, int length, int compressedLength)
  234. {
  235. m_ResourceNames.Add(resourceName);
  236. m_TotalLength += length;
  237. m_TotalCompressedLength += compressedLength;
  238. }
  239. }
  240. }
  241. }