ResourceManager.ResourceIniter.cs 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  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;
  8. using System.Collections.Generic;
  9. using System.IO;
  10. namespace GameFramework.Resource
  11. {
  12. internal sealed partial class ResourceManager : GameFrameworkModule, IResourceManager
  13. {
  14. /// <summary>
  15. /// 资源初始化器。
  16. /// </summary>
  17. private sealed class ResourceIniter
  18. {
  19. private readonly ResourceManager m_ResourceManager;
  20. private readonly Dictionary<ResourceName, string> m_CachedFileSystemNames;
  21. private string m_CurrentVariant;
  22. public GameFrameworkAction ResourceInitComplete;
  23. /// <summary>
  24. /// 初始化资源初始化器的新实例。
  25. /// </summary>
  26. /// <param name="resourceManager">资源管理器。</param>
  27. public ResourceIniter(ResourceManager resourceManager)
  28. {
  29. m_ResourceManager = resourceManager;
  30. m_CachedFileSystemNames = new Dictionary<ResourceName, string>();
  31. m_CurrentVariant = null;
  32. ResourceInitComplete = null;
  33. }
  34. /// <summary>
  35. /// 关闭并清理资源初始化器。
  36. /// </summary>
  37. public void Shutdown()
  38. {
  39. }
  40. /// <summary>
  41. /// 初始化资源。
  42. /// </summary>
  43. public void InitResources(string currentVariant)
  44. {
  45. m_CurrentVariant = currentVariant;
  46. if (m_ResourceManager.m_ResourceHelper == null)
  47. {
  48. throw new GameFrameworkException("Resource helper is invalid.");
  49. }
  50. if (string.IsNullOrEmpty(m_ResourceManager.m_ReadOnlyPath))
  51. {
  52. throw new GameFrameworkException("Read-only path is invalid.");
  53. }
  54. m_ResourceManager.m_ResourceHelper.LoadBytes(Utility.Path.GetRemotePath(Path.Combine(m_ResourceManager.m_ReadOnlyPath, RemoteVersionListFileName)), new LoadBytesCallbacks(OnLoadPackageVersionListSuccess, OnLoadPackageVersionListFailure), null);
  55. }
  56. private void OnLoadPackageVersionListSuccess(string fileUri, byte[] bytes, float duration, object userData)
  57. {
  58. MemoryStream memoryStream = null;
  59. try
  60. {
  61. memoryStream = new MemoryStream(bytes, false);
  62. PackageVersionList versionList = m_ResourceManager.m_PackageVersionListSerializer.Deserialize(memoryStream);
  63. if (!versionList.IsValid)
  64. {
  65. throw new GameFrameworkException("Deserialize package version list failure.");
  66. }
  67. PackageVersionList.Asset[] assets = versionList.GetAssets();
  68. PackageVersionList.Resource[] resources = versionList.GetResources();
  69. PackageVersionList.FileSystem[] fileSystems = versionList.GetFileSystems();
  70. PackageVersionList.ResourceGroup[] resourceGroups = versionList.GetResourceGroups();
  71. m_ResourceManager.m_ApplicableGameVersion = versionList.ApplicableGameVersion;
  72. m_ResourceManager.m_InternalResourceVersion = versionList.InternalResourceVersion;
  73. m_ResourceManager.m_AssetInfos = new Dictionary<string, AssetInfo>(assets.Length, StringComparer.Ordinal);
  74. m_ResourceManager.m_ResourceInfos = new Dictionary<ResourceName, ResourceInfo>(resources.Length, new ResourceNameComparer());
  75. ResourceGroup defaultResourceGroup = m_ResourceManager.GetOrAddResourceGroup(string.Empty);
  76. foreach (PackageVersionList.FileSystem fileSystem in fileSystems)
  77. {
  78. int[] resourceIndexes = fileSystem.GetResourceIndexes();
  79. foreach (int resourceIndex in resourceIndexes)
  80. {
  81. PackageVersionList.Resource resource = resources[resourceIndex];
  82. if (resource.Variant != null && resource.Variant != m_CurrentVariant)
  83. {
  84. continue;
  85. }
  86. m_CachedFileSystemNames.Add(new ResourceName(resource.Name, resource.Variant, resource.Extension), fileSystem.Name);
  87. }
  88. }
  89. foreach (PackageVersionList.Resource resource in resources)
  90. {
  91. if (resource.Variant != null && resource.Variant != m_CurrentVariant)
  92. {
  93. continue;
  94. }
  95. ResourceName resourceName = new ResourceName(resource.Name, resource.Variant, resource.Extension);
  96. int[] assetIndexes = resource.GetAssetIndexes();
  97. foreach (int assetIndex in assetIndexes)
  98. {
  99. PackageVersionList.Asset asset = assets[assetIndex];
  100. int[] dependencyAssetIndexes = asset.GetDependencyAssetIndexes();
  101. int index = 0;
  102. string[] dependencyAssetNames = new string[dependencyAssetIndexes.Length];
  103. foreach (int dependencyAssetIndex in dependencyAssetIndexes)
  104. {
  105. dependencyAssetNames[index++] = assets[dependencyAssetIndex].Name;
  106. }
  107. m_ResourceManager.m_AssetInfos.Add(asset.Name, new AssetInfo(asset.Name, resourceName, dependencyAssetNames));
  108. }
  109. string fileSystemName = null;
  110. if (!m_CachedFileSystemNames.TryGetValue(resourceName, out fileSystemName))
  111. {
  112. fileSystemName = null;
  113. }
  114. m_ResourceManager.m_ResourceInfos.Add(resourceName, new ResourceInfo(resourceName, fileSystemName, (LoadType)resource.LoadType, resource.Length, resource.HashCode, resource.Length, true, true));
  115. defaultResourceGroup.AddResource(resourceName, resource.Length, resource.Length);
  116. }
  117. foreach (PackageVersionList.ResourceGroup resourceGroup in resourceGroups)
  118. {
  119. ResourceGroup group = m_ResourceManager.GetOrAddResourceGroup(resourceGroup.Name);
  120. int[] resourceIndexes = resourceGroup.GetResourceIndexes();
  121. foreach (int resourceIndex in resourceIndexes)
  122. {
  123. PackageVersionList.Resource resource = resources[resourceIndex];
  124. if (resource.Variant != null && resource.Variant != m_CurrentVariant)
  125. {
  126. continue;
  127. }
  128. group.AddResource(new ResourceName(resource.Name, resource.Variant, resource.Extension), resource.Length, resource.Length);
  129. }
  130. }
  131. ResourceInitComplete();
  132. }
  133. catch (Exception exception)
  134. {
  135. if (exception is GameFrameworkException)
  136. {
  137. throw;
  138. }
  139. throw new GameFrameworkException(Utility.Text.Format("Parse package version list exception '{0}'.", exception), exception);
  140. }
  141. finally
  142. {
  143. m_CachedFileSystemNames.Clear();
  144. if (memoryStream != null)
  145. {
  146. memoryStream.Dispose();
  147. memoryStream = null;
  148. }
  149. }
  150. }
  151. private void OnLoadPackageVersionListFailure(string fileUri, string errorMessage, object userData)
  152. {
  153. throw new GameFrameworkException(Utility.Text.Format("Package version list '{0}' is invalid, error message is '{1}'.", fileUri, string.IsNullOrEmpty(errorMessage) ? "<Empty>" : errorMessage));
  154. }
  155. }
  156. }
  157. }