WuhuIslandTesting/Library/PackageCache/com.unity.addressables@1.21.12/Editor/Diagnostics/Profiler/ProfilerDetailsTreeViewItemData.cs
2025-01-07 02:06:59 +01:00

379 lines
13 KiB
C#

#if ENABLE_ADDRESSABLE_PROFILER && UNITY_2022_2_OR_NEWER
using System;
using System.Collections.Generic;
using UnityEditor.AddressableAssets.Build.Layout;
using UnityEngine;
using UnityEngine.ResourceManagement.Profiling;
using UnityEngine.ResourceManagement.Util;
namespace UnityEditor.AddressableAssets.Diagnostics
{
internal class ContentData
{
public string Name;
public int AddressableHandles;
public ContentStatus Status;
protected float m_PercentComplete;
public float PercentComplete
{
get
{
if (Status == ContentStatus.Loading)
return m_PercentComplete;
if (Status == ContentStatus.Active)
return 1f;
return -1f;
}
}
public virtual int TreeViewID
{
get { return Name.GetHashCode(); }
}
public readonly List<ContentData> Children = new List<ContentData>();
public ContentData Parent = null;
public readonly List<ContentData> ThisReferencesOther = new List<ContentData>();
public readonly List<ContentData> ReferencesToThis = new List<ContentData>();
public void AddReferenceTo(ContentData value)
{
if (!ThisReferencesOther.Contains(value))
ThisReferencesOther.Add(value);
}
public void AddReferenceBy(ContentData value)
{
if (!ReferencesToThis.Contains(value))
ReferencesToThis.Add(value);
}
public void AddChild(ContentData child)
{
Children.Add(child);
child.Parent = this;
}
public virtual string GetCellContent(string colName)
{
return colName switch
{
TreeColumnNames.TreeColumnName => Name,
TreeColumnNames.TreeColumnType => "",
TreeColumnNames.TreeColumnAddressedCount => AddressableHandles.ToString(),
TreeColumnNames.TreeColumnStatus => Status.ToString(),
TreeColumnNames.TreeColumnPercentage => PercentComplete < 0.5f ? "" : (int)(PercentComplete*100f)+"%",
TreeColumnNames.TreeColumnReferencedBy => ReferencesToThis.Count.ToString(),
TreeColumnNames.TreeColumnReferencesTo => ThisReferencesOther.Count.ToString(),
_ => ""
};
}
}
internal class GroupData : ContentData
{
public BuildLayout.Group m_ReportGroup;
public GroupData(BuildLayout.Group reportGroup)
{
m_ReportGroup = reportGroup;
if (m_ReportGroup == null)
{
Name = "Missing group";
return;
}
Name = reportGroup.Name;
}
public override string GetCellContent(string colName)
{
return colName switch
{
TreeColumnNames.TreeColumnName => Name,
_ => ""
};
}
}
internal class BundleData : ContentData
{
public readonly int BundleCode;
public readonly BundleSource Source;
public bool CheckSumEnabled;
public bool CachingEnabled;
internal BuildLayout.Bundle ReportBundle;
public List<ContentData> NotLoadedChildren = new List<ContentData>();
public Dictionary<string, int> AssetGuidToChildIndex = new Dictionary<string, int>();
public override int TreeViewID
{
get { return BundleCode; }
}
public override string GetCellContent(string colName)
{
if (colName == TreeColumnNames.TreeColumnType)
return "Asset Bundle";
return base.GetCellContent(colName);
}
public BundleData(BuildLayout.Bundle reportBundle, BundleFrameData frameData)
{
ReportBundle = reportBundle;
Name = reportBundle != null ? reportBundle.Name : frameData.BundleCode.ToString();
BundleCode = frameData.BundleCode;
Source = frameData.Source;
m_PercentComplete = frameData.PercentComplete;
CachingEnabled = frameData.LoadingOptions.HasFlag(BundleOptions.CachingEnabled);
CheckSumEnabled = frameData.LoadingOptions.HasFlag(BundleOptions.CheckSumEnabled);
AddressableHandles = frameData.ReferenceCount;
Status = frameData.Status;
}
public AssetData GetOrCreateAssetData(BuildLayout.ExplicitAsset asset)
{
if (AssetGuidToChildIndex.TryGetValue(asset.Guid, out int value))
return Children[value] as AssetData;
AssetData assetData = new AssetData(asset);
AssetGuidToChildIndex.Add(asset.Guid, Children.Count);
Children.Add(assetData);
assetData.Parent = this;
return assetData;
}
public AssetData GetOrCreateAssetData(BuildLayout.DataFromOtherAsset asset)
{
if (AssetGuidToChildIndex.TryGetValue(asset.AssetGuid, out int value))
return Children[value] as AssetData;
AssetData assetData = new AssetData(asset);
AssetGuidToChildIndex.Add(asset.AssetGuid, Children.Count);
Children.Add(assetData);
assetData.Parent = this;
return assetData;
}
/// <summary>
///
/// </summary>
/// <param name="asset"></param>
/// <param name="assetData"></param>
/// <returns>true if new assetData is created, else false is already a child of bundle</returns>
public bool GetOrCreateAssetData(BuildLayout.DataFromOtherAsset asset, out AssetData assetData)
{
if (AssetGuidToChildIndex.TryGetValue(asset.AssetGuid, out int value))
{
assetData = Children[value] as AssetData;
return false;
}
assetData = new AssetData(asset);
AssetGuidToChildIndex.Add(asset.AssetGuid, Children.Count);
Children.Add(assetData);
assetData.Parent = this;
return true;
}
/// <summary>
///
/// </summary>
/// <param name="asset"></param>
/// <param name="assetData"></param>
/// <returns>true if new assetData is created, else false is already a child of bundle</returns>
public bool GetOrCreateAssetData(BuildLayout.ExplicitAsset asset, out AssetData assetData)
{
if (AssetGuidToChildIndex.TryGetValue(asset.Guid, out int value))
{
assetData = Children[value] as AssetData;
return false;
}
assetData = new AssetData(asset);
AssetGuidToChildIndex.Add(asset.Guid, Children.Count);
Children.Add(assetData);
assetData.Parent = this;
return true;
}
}
internal class AssetData : ContentData
{
public readonly string AssetGuid;
public readonly AssetType MainAssetType;
public bool IsImplicit => ReportImplicitData != null;
public bool FullyLoaded => LoadedObjectIndices.Count == 0 || LoadedObjectIndices.Count == Children.Count;
public readonly BuildLayout.ExplicitAsset ReportExplicitData;
public readonly BuildLayout.DataFromOtherAsset ReportImplicitData;
public List<BuildLayout.ObjectData> ReportObjects
{
get
{
if (ReportExplicitData != null)
return ReportExplicitData.Objects;
return ReportImplicitData.Objects;
}
}
// if empty = all
public HashSet<int> LoadedObjectIndices = new HashSet<int>();
public Dictionary<long, int> LocalIdToChildIndex = new Dictionary<long, int>();
public string AssetPath => ReportExplicitData != null ? ReportExplicitData.AssetPath : ReportImplicitData != null ? ReportImplicitData.AssetPath : null;
public override int TreeViewID
{
get
{
if (IsImplicit && Parent != null)
{
BundleData bundleData = (BundleData)Parent;
return HashCode.Combine(bundleData.BundleCode, AssetGuid.GetHashCode());
}
return AssetGuid.GetHashCode();
}
}
public override string GetCellContent(string colName)
{
if (colName == TreeColumnNames.TreeColumnType)
return MainAssetType.ToString();
return base.GetCellContent(colName);
}
public AssetData(AssetFrameData frameData)
{
Name = frameData.AssetCode.ToString();
AddressableHandles = frameData.ReferenceCount;
Status = frameData.Status;
AssetGuid = "";
}
public AssetData(BuildLayout.ExplicitAsset reportAsset)
{
Debug.Assert(reportAsset != null);
Name = reportAsset.AddressableName == null ? reportAsset.AssetPath : reportAsset.AddressableName;
AddressableHandles = 0;
AssetGuid = reportAsset.Guid;
MainAssetType = reportAsset.MainAssetType;
ReportExplicitData = reportAsset;
}
public AssetData(BuildLayout.DataFromOtherAsset reportAsset)
{
Debug.Assert(reportAsset != null);
Name = reportAsset.AssetPath;
AddressableHandles = 0;
AssetGuid = reportAsset.AssetGuid;
MainAssetType = reportAsset.MainAssetType;
ReportImplicitData = reportAsset;
}
public void Update(AssetFrameData frameData)
{
AddressableHandles = frameData.ReferenceCount;
Status = frameData.Status;
m_PercentComplete = frameData.PercentComplete;
}
public void AddLoadedObjects(List<int> indicesAdding)
{
// if (this.AddressedCount > 0) // fully loaded
// return;
this.LoadedObjectIndices.UnionWith(indicesAdding);
}
public ObjectData GetOrCreateObjectData(BuildLayout.ObjectData obj)
{
if (LocalIdToChildIndex.TryGetValue(obj.LocalIdentifierInFile, out int value))
return Children[value] as ObjectData;
ObjectData objectData = new ObjectData(obj);
LocalIdToChildIndex.Add(obj.LocalIdentifierInFile, Children.Count);
Children.Add(objectData);
objectData.Parent = this;
return objectData;
}
}
internal class ObjectData : ContentData
{
public readonly AssetType AssetType;
public readonly string ComponentName;
private readonly long LocalIdentifierInFile;
public override int TreeViewID
{
get
{
if (Parent != null)
{
AssetData assetData = (AssetData)Parent;
return HashCode.Combine(assetData.TreeViewID, LocalIdentifierInFile.GetHashCode());
}
return LocalIdentifierInFile.GetHashCode();
}
}
public override string GetCellContent(string colName)
{
return colName switch
{
TreeColumnNames.TreeColumnType => AssetType.ToString(),
TreeColumnNames.TreeColumnAddressedCount => "",
_ => base.GetCellContent(colName)
};
}
public ObjectData(BuildLayout.ObjectData obj)
{
LocalIdentifierInFile = obj.LocalIdentifierInFile;
if (string.IsNullOrEmpty(obj.ObjectName))
Name = obj.LocalIdentifierInFile.ToString();
else if (!string.IsNullOrEmpty(obj.ComponentName))
Name = $"{obj.ObjectName} ({obj.ComponentName})";
else
Name = obj.ObjectName;
AssetType = obj.AssetType;
ComponentName = obj.ComponentName;
}
}
internal class ContainerData : ContentData
{
public override int TreeViewID
{
get
{
if (Parent != null)
{
if (Parent is BundleData bundleParent)
return HashCode.Combine(bundleParent.BundleCode, Name.GetHashCode());
return HashCode.Combine(Parent.GetHashCode(), Name.GetHashCode());
}
return Name.GetHashCode();
}
}
public override string GetCellContent(string colName)
{
return colName switch
{
TreeColumnNames.TreeColumnType => "",
TreeColumnNames.TreeColumnAddressedCount => "",
TreeColumnNames.TreeColumnStatus => "",
TreeColumnNames.TreeColumnReferencedBy => "",
TreeColumnNames.TreeColumnReferencesTo => "",
_ => base.GetCellContent(colName)
};
}
}
}
#endif