@@ -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<FlaxEngine.Object>(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)
|
||||
|
||||
Reference in New Issue
Block a user