//------------------------------------------------------------ // Game Framework // Copyright © 2013-2021 loyalsoft. All rights reserved. // Homepage: http://www.game7000.com/ // Feedback: http://www.game7000.com/ //------------------------------------------------------------ using System.Collections.Generic; namespace GameFramework.Resource { internal sealed partial class ResourceManager : GameFrameworkModule, IResourceManager { /// /// 资源组集合。 /// private sealed class ResourceGroupCollection : IResourceGroupCollection { private readonly ResourceGroup[] m_ResourceGroups; private readonly Dictionary m_ResourceInfos; private readonly HashSet m_ResourceNames; private long m_TotalLength; private long m_TotalCompressedLength; /// /// 初始化资源组集合的新实例。 /// /// 资源组集合。 /// 资源信息引用。 public ResourceGroupCollection(ResourceGroup[] resourceGroups, Dictionary resourceInfos) { if (resourceGroups == null || resourceGroups.Length < 1) { throw new GameFrameworkException("Resource groups is invalid."); } if (resourceInfos == null) { throw new GameFrameworkException("Resource infos is invalid."); } int lastIndex = resourceGroups.Length - 1; for (int i = 0; i < lastIndex; i++) { if (resourceGroups[i] == null) { throw new GameFrameworkException(Utility.Text.Format("Resource group index '{0}' is invalid.", i)); } for (int j = i + 1; j < resourceGroups.Length; j++) { if (resourceGroups[i] == resourceGroups[j]) { throw new GameFrameworkException(Utility.Text.Format("Resource group '{0}' duplicated.", resourceGroups[i].Name)); } } } if (resourceGroups[lastIndex] == null) { throw new GameFrameworkException(Utility.Text.Format("Resource group index '{0}' is invalid.", lastIndex)); } m_ResourceGroups = resourceGroups; m_ResourceInfos = resourceInfos; m_ResourceNames = new HashSet(); m_TotalLength = 0L; m_TotalCompressedLength = 0L; List cachedResourceNames = new List(); foreach (ResourceGroup resourceGroup in m_ResourceGroups) { resourceGroup.InternalGetResourceNames(cachedResourceNames); foreach (ResourceName resourceName in cachedResourceNames) { ResourceInfo resourceInfo = null; if (!m_ResourceInfos.TryGetValue(resourceName, out resourceInfo)) { throw new GameFrameworkException(Utility.Text.Format("Resource info '{0}' is invalid.", resourceName.FullName)); } if (m_ResourceNames.Add(resourceName)) { m_TotalLength += resourceInfo.Length; m_TotalCompressedLength += resourceInfo.CompressedLength; } } } } /// /// 获取资源组集合是否准备完毕。 /// public bool Ready { get { return ReadyCount >= TotalCount; } } /// /// 获取资源组集合包含资源数量。 /// public int TotalCount { get { return m_ResourceNames.Count; } } /// /// 获取资源组集合中已准备完成资源数量。 /// public int ReadyCount { get { int readyCount = 0; foreach (ResourceName resourceName in m_ResourceNames) { ResourceInfo resourceInfo = null; if (m_ResourceInfos.TryGetValue(resourceName, out resourceInfo) && resourceInfo.Ready) { readyCount++; } } return readyCount; } } /// /// 获取资源组集合包含资源的总大小。 /// public long TotalLength { get { return m_TotalLength; } } /// /// 获取资源组集合包含资源压缩后的总大小。 /// public long TotalCompressedLength { get { return m_TotalCompressedLength; } } /// /// 获取资源组集合中已准备完成资源的总大小。 /// public long ReadyLength { get { long readyLength = 0L; foreach (ResourceName resourceName in m_ResourceNames) { ResourceInfo resourceInfo = null; if (m_ResourceInfos.TryGetValue(resourceName, out resourceInfo) && resourceInfo.Ready) { readyLength += resourceInfo.Length; } } return readyLength; } } /// /// 获取资源组集合中已准备完成资源压缩后的总大小。 /// public long ReadyCompressedLength { get { long readyCompressedLength = 0L; foreach (ResourceName resourceName in m_ResourceNames) { ResourceInfo resourceInfo = null; if (m_ResourceInfos.TryGetValue(resourceName, out resourceInfo) && resourceInfo.Ready) { readyCompressedLength += resourceInfo.CompressedLength; } } return readyCompressedLength; } } /// /// 获取资源组集合的完成进度。 /// public float Progress { get { return m_TotalLength > 0L ? (float)ReadyLength / m_TotalLength : 1f; } } /// /// 获取资源组集合包含的资源组列表。 /// /// 资源组包含的资源名称列表。 public IResourceGroup[] GetResourceGroups() { return m_ResourceGroups; } /// /// 获取资源组集合包含的资源名称列表。 /// /// 资源组包含的资源名称列表。 public string[] GetResourceNames() { int index = 0; string[] resourceNames = new string[m_ResourceNames.Count]; foreach (ResourceName resourceName in m_ResourceNames) { resourceNames[index++] = resourceName.FullName; } return resourceNames; } /// /// 获取资源组集合包含的资源名称列表。 /// /// 资源组包含的资源名称列表。 public void GetResourceNames(List results) { if (results == null) { throw new GameFrameworkException("Results is invalid."); } results.Clear(); foreach (ResourceName resourceName in m_ResourceNames) { results.Add(resourceName.FullName); } } } } }