diff --git a/Source/Editor/Windows/AssetReferencesGraphWindow.cs b/Source/Editor/Windows/AssetReferencesGraphWindow.cs index 64eef8224..5d0eee183 100644 --- a/Source/Editor/Windows/AssetReferencesGraphWindow.cs +++ b/Source/Editor/Windows/AssetReferencesGraphWindow.cs @@ -2,7 +2,9 @@ using System; using System.Collections.Generic; +using System.IO; using System.Linq; +using System.Runtime.CompilerServices; using System.Threading; using System.Threading.Tasks; using FlaxEditor.Content; @@ -137,6 +139,7 @@ namespace FlaxEditor.Windows } } + private string _cacheFolder; private Guid _assetId; private Surface _surface; private Label _loadingLabel; @@ -161,6 +164,9 @@ namespace FlaxEditor.Windows { Title = assetItem.ShortName + " References"; + _cacheFolder = Path.Combine(Globals.ProjectCacheFolder, "References"); + if (!Directory.Exists(_cacheFolder)) + Directory.CreateDirectory(_cacheFolder); _assetId = assetItem.ID; _surface = new Surface(this) { @@ -189,7 +195,7 @@ namespace FlaxEditor.Windows return node; } - private void SearchRefs(Guid assetId) + private unsafe void SearchRefs(Guid assetId) { // Skip assets that never contain references to prevent loading them if (FlaxEngine.Content.GetAssetInfo(assetId, out var assetInfo) && @@ -202,8 +208,24 @@ namespace FlaxEditor.Windows if (_refs.ContainsKey(assetId)) return; + // Try to load cached references form previous run + var cachePath = Path.Combine(_cacheFolder, $"{FlaxEngine.Json.JsonSerializer.GetStringID(assetId)}.1.cache"); + var hasInfo = FlaxEngine.Content.GetAssetInfo(assetId, out var info); + if (hasInfo && File.Exists(cachePath) && File.GetLastWriteTime(cachePath) > File.GetLastWriteTime(info.Path)) + { + byte[] rawData = File.ReadAllBytes(cachePath); + Guid[] loadedRefs = new Guid[rawData.Length / sizeof(Guid)]; + if (rawData.Length != 0) + { + fixed (byte* rawDataPtr = rawData) + fixed (Guid* loadedRefsPtr = loadedRefs) + Unsafe.CopyBlock(loadedRefsPtr, rawDataPtr, (uint)rawData.Length); + } + _refs[assetId] = loadedRefs; + return; + } + // Load asset (with cancel support) - //Debug.Log("Searching refs for " + assetInfo.Path); var obj = FlaxEngine.Object.TryFind(ref assetId); if (obj is Scene scene) { @@ -226,7 +248,21 @@ namespace FlaxEditor.Windows return; // Get direct references - _refs[assetId] = asset.GetReferences(); + var references = asset.GetReferences(); + _refs[assetId] = references; + + // Save reference to the cache + if (hasInfo) + { + byte[] rawData = new byte[references.Length * sizeof(Guid)]; + if (rawData.Length != 0) + { + fixed (byte* rawDataPtr = rawData) + fixed (Guid* referencesPtr = references) + Unsafe.CopyBlock(rawDataPtr, referencesPtr, (uint)rawData.Length); + } + File.WriteAllBytes(cachePath, rawData); + } } private void BuildGraph(AssetNode node, int level, bool reverse)