From 0a85f3126fee5a314c2845208e1e2228d827401b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E4=BD=95=E5=86=A0=E5=B3=B0?= <hevinci@hotmail.com>
Date: Tue, 11 Feb 2025 18:18:29 +0800
Subject: [PATCH] update extension sample
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

优化了微信小游戏文件系统缓存机制。
---
 .../WXFSClearAllBundleFilesOperation.cs       |  1 -
 .../WXFSClearUnusedBundleFilesAsync.cs        | 65 ++++++++++---------
 .../Operation/WXFSDownloadFileOperation.cs    |  1 -
 .../Operation/WXFSInitializeOperation.cs      | 37 +----------
 .../Operation/WXFSLoadBundleOperation.cs      |  1 -
 .../RecordWechatCacheFilesOperation.cs        | 60 -----------------
 .../RecordWechatCacheFilesOperation.cs.meta   | 11 ----
 .../WechatFileSystem/WechatFileSystem.cs      | 61 ++++-------------
 8 files changed, 47 insertions(+), 190 deletions(-)
 delete mode 100644 Assets/YooAsset/Samples~/Extension Sample/Runtime/ExtensionFileSystem/WechatFileSystem/Operation/internal/RecordWechatCacheFilesOperation.cs
 delete mode 100644 Assets/YooAsset/Samples~/Extension Sample/Runtime/ExtensionFileSystem/WechatFileSystem/Operation/internal/RecordWechatCacheFilesOperation.cs.meta

diff --git a/Assets/YooAsset/Samples~/Extension Sample/Runtime/ExtensionFileSystem/WechatFileSystem/Operation/WXFSClearAllBundleFilesOperation.cs b/Assets/YooAsset/Samples~/Extension Sample/Runtime/ExtensionFileSystem/WechatFileSystem/Operation/WXFSClearAllBundleFilesOperation.cs
index a04fbdb4..2c94df39 100644
--- a/Assets/YooAsset/Samples~/Extension Sample/Runtime/ExtensionFileSystem/WechatFileSystem/Operation/WXFSClearAllBundleFilesOperation.cs	
+++ b/Assets/YooAsset/Samples~/Extension Sample/Runtime/ExtensionFileSystem/WechatFileSystem/Operation/WXFSClearAllBundleFilesOperation.cs	
@@ -42,7 +42,6 @@ internal class WXFSClearAllBundleFilesOperation : FSClearCacheFilesOperation
                     YooLogger.Log("微信缓存清理成功!");
                     _steps = ESteps.Done;
                     Status = EOperationStatus.Succeed;
-                    _fileSystem.ClearAllRecords();
                 }
                 else
                 {
diff --git a/Assets/YooAsset/Samples~/Extension Sample/Runtime/ExtensionFileSystem/WechatFileSystem/Operation/WXFSClearUnusedBundleFilesAsync.cs b/Assets/YooAsset/Samples~/Extension Sample/Runtime/ExtensionFileSystem/WechatFileSystem/Operation/WXFSClearUnusedBundleFilesAsync.cs
index 42a1de75..87b40f3a 100644
--- a/Assets/YooAsset/Samples~/Extension Sample/Runtime/ExtensionFileSystem/WechatFileSystem/Operation/WXFSClearUnusedBundleFilesAsync.cs	
+++ b/Assets/YooAsset/Samples~/Extension Sample/Runtime/ExtensionFileSystem/WechatFileSystem/Operation/WXFSClearUnusedBundleFilesAsync.cs	
@@ -4,6 +4,7 @@ using System.IO;
 using UnityEngine;
 using YooAsset;
 using WeChatWASM;
+using static UnityEngine.Networking.UnityWebRequest;
 
 internal class WXFSClearUnusedBundleFilesAsync : FSClearCacheFilesOperation
 {
@@ -11,6 +12,7 @@ internal class WXFSClearUnusedBundleFilesAsync : FSClearCacheFilesOperation
     {
         None,
         GetUnusedCacheFiles,
+        WaitingSearch,
         ClearUnusedCacheFiles,
         Done,
     }
@@ -37,20 +39,44 @@ internal class WXFSClearUnusedBundleFilesAsync : FSClearCacheFilesOperation
 
         if (_steps == ESteps.GetUnusedCacheFiles)
         {
-            _unusedCacheFiles = GetUnusedCacheFiles();
-            _unusedFileTotalCount = _unusedCacheFiles.Count;
-            _steps = ESteps.ClearUnusedCacheFiles;
-            YooLogger.Log($"Found unused cache files count : {_unusedFileTotalCount}");
+            _steps = ESteps.WaitingSearch;
+
+            var fileSystemMgr = _fileSystem.GetFileSystemMgr();
+            var statOption = new WXStatOption();
+            statOption.path = _fileSystem.FileRoot;
+            statOption.recursive = true;
+            statOption.success = (WXStatResponse response) =>
+            {
+                foreach (var fileStat in response.stats)
+                {
+                    // 注意:存储文件必须按照Bundle文件哈希值存储!
+                    string bundleGUID = Path.GetFileNameWithoutExtension(fileStat.path);
+                    if (_manifest.TryGetPackageBundleByBundleGUID(bundleGUID, out PackageBundle value) == false)
+                    {
+                        _unusedCacheFiles.Add(fileStat.path);
+                    }
+                }
+
+                _steps = ESteps.ClearUnusedCacheFiles;
+                _unusedFileTotalCount = _unusedCacheFiles.Count;
+                YooLogger.Log($"Found unused cache files count : {_unusedFileTotalCount}");
+            };
+            statOption.fail = (WXStatResponse response) =>
+            {
+                _steps = ESteps.Done;
+                Status = EOperationStatus.Failed;
+                Error = response.errMsg;
+            };
+            fileSystemMgr.Stat(statOption);
         }
 
         if (_steps == ESteps.ClearUnusedCacheFiles)
         {
             for (int i = _unusedCacheFiles.Count - 1; i >= 0; i--)
             {
-                string clearFilePath = _unusedCacheFiles[i];
+                string filePath = _unusedCacheFiles[i];
                 _unusedCacheFiles.RemoveAt(i);
-                _fileSystem.ClearRecord(clearFilePath);
-                WX.RemoveFile(clearFilePath, null);
+                WX.RemoveFile(filePath, null);
 
                 if (OperationSystem.IsBusy)
                     break;
@@ -68,30 +94,5 @@ internal class WXFSClearUnusedBundleFilesAsync : FSClearCacheFilesOperation
             }
         }
     }
-
-    private List<string> GetUnusedCacheFiles()
-    {
-        var allRecords = _fileSystem.GetAllRecords();
-        List<string> result = new List<string>(allRecords.Count);
-        foreach (var filePath in allRecords)
-        {
-            // 如果存储文件名是按照Bundle文件哈希值存储
-            string bundleGUID = Path.GetFileNameWithoutExtension(filePath);
-            if (_manifest.TryGetPackageBundleByBundleGUID(bundleGUID, out PackageBundle value) == false)
-            {
-                result.Add(filePath);
-            }
-
-            // 如果存储文件名是按照Bundle文件名称存储
-            /*
-            string bundleName = Path.GetFileNameWithoutExtension(filePath);
-            if (_manifest.TryGetPackageBundleByBundleName(bundleName, out PackageBundle value) == false)
-            {
-                result.Add(filePath);
-            }
-            */
-        }
-        return result;
-    }
 }
 #endif
\ No newline at end of file
diff --git a/Assets/YooAsset/Samples~/Extension Sample/Runtime/ExtensionFileSystem/WechatFileSystem/Operation/WXFSDownloadFileOperation.cs b/Assets/YooAsset/Samples~/Extension Sample/Runtime/ExtensionFileSystem/WechatFileSystem/Operation/WXFSDownloadFileOperation.cs
index 970a119e..0612417b 100644
--- a/Assets/YooAsset/Samples~/Extension Sample/Runtime/ExtensionFileSystem/WechatFileSystem/Operation/WXFSDownloadFileOperation.cs	
+++ b/Assets/YooAsset/Samples~/Extension Sample/Runtime/ExtensionFileSystem/WechatFileSystem/Operation/WXFSDownloadFileOperation.cs	
@@ -51,7 +51,6 @@ internal class WXFSDownloadFileOperation : DefaultDownloadFileOperation
             {
                 _steps = ESteps.Done;
                 Status = EOperationStatus.Succeed;
-                _fileSystem.TryRecordBundle(Bundle); //记录下载文件
 
                 //TODO 解决微信小游戏插件问题
                 // Issue : https://github.com/wechat-miniprogram/minigame-unity-webgl-transform/issues/108#
diff --git a/Assets/YooAsset/Samples~/Extension Sample/Runtime/ExtensionFileSystem/WechatFileSystem/Operation/WXFSInitializeOperation.cs b/Assets/YooAsset/Samples~/Extension Sample/Runtime/ExtensionFileSystem/WechatFileSystem/Operation/WXFSInitializeOperation.cs
index 71f71381..397220ee 100644
--- a/Assets/YooAsset/Samples~/Extension Sample/Runtime/ExtensionFileSystem/WechatFileSystem/Operation/WXFSInitializeOperation.cs	
+++ b/Assets/YooAsset/Samples~/Extension Sample/Runtime/ExtensionFileSystem/WechatFileSystem/Operation/WXFSInitializeOperation.cs	
@@ -3,16 +3,7 @@ using YooAsset;
 
 internal partial class WXFSInitializeOperation : FSInitializeFileSystemOperation
 {
-    private enum ESteps
-    {
-        None,
-        RecordCacheFiles,
-        Done,
-    }
-
     private readonly WechatFileSystem _fileSystem;
-    private RecordWechatCacheFilesOperation _recordWechatCacheFilesOp;
-    private ESteps _steps = ESteps.None;
 
     public WXFSInitializeOperation(WechatFileSystem fileSystem)
     {
@@ -20,36 +11,10 @@ internal partial class WXFSInitializeOperation : FSInitializeFileSystemOperation
     }
     internal override void InternalOnStart()
     {
-        _steps = ESteps.RecordCacheFiles;
+        Status = EOperationStatus.Succeed;
     }
     internal override void InternalOnUpdate()
     {
-        if (_steps == ESteps.None || _steps == ESteps.Done)
-            return;
-
-        if (_steps == ESteps.RecordCacheFiles)
-        {
-            if (_recordWechatCacheFilesOp == null)
-            {
-                _recordWechatCacheFilesOp = new RecordWechatCacheFilesOperation(_fileSystem);
-                OperationSystem.StartOperation(_fileSystem.PackageName, _recordWechatCacheFilesOp);
-            }
-
-            if (_recordWechatCacheFilesOp.IsDone == false)
-                return;
-
-            if (_recordWechatCacheFilesOp.Status == EOperationStatus.Succeed)
-            {
-                _steps = ESteps.Done;
-                Status = EOperationStatus.Succeed;
-            }
-            else
-            {
-                _steps = ESteps.Done;
-                Status = EOperationStatus.Failed;
-                Error = _recordWechatCacheFilesOp.Error;
-            }
-        }
     }
 }
 #endif
\ No newline at end of file
diff --git a/Assets/YooAsset/Samples~/Extension Sample/Runtime/ExtensionFileSystem/WechatFileSystem/Operation/WXFSLoadBundleOperation.cs b/Assets/YooAsset/Samples~/Extension Sample/Runtime/ExtensionFileSystem/WechatFileSystem/Operation/WXFSLoadBundleOperation.cs
index 5521b01f..1fab8212 100644
--- a/Assets/YooAsset/Samples~/Extension Sample/Runtime/ExtensionFileSystem/WechatFileSystem/Operation/WXFSLoadBundleOperation.cs	
+++ b/Assets/YooAsset/Samples~/Extension Sample/Runtime/ExtensionFileSystem/WechatFileSystem/Operation/WXFSLoadBundleOperation.cs	
@@ -61,7 +61,6 @@ internal class WXFSLoadBundleOperation : FSLoadBundleOperation
                     _steps = ESteps.Done;
                     Result = new WXAssetBundleResult(_fileSystem, _bundle, assetBundle);
                     Status = EOperationStatus.Succeed;
-                    _fileSystem.TryRecordBundle(_bundle); //记录下载文件
 
                     //TODO 解决微信小游戏插件问题
                     // Issue : https://github.com/wechat-miniprogram/minigame-unity-webgl-transform/issues/108#
diff --git a/Assets/YooAsset/Samples~/Extension Sample/Runtime/ExtensionFileSystem/WechatFileSystem/Operation/internal/RecordWechatCacheFilesOperation.cs b/Assets/YooAsset/Samples~/Extension Sample/Runtime/ExtensionFileSystem/WechatFileSystem/Operation/internal/RecordWechatCacheFilesOperation.cs
deleted file mode 100644
index 45d39b98..00000000
--- a/Assets/YooAsset/Samples~/Extension Sample/Runtime/ExtensionFileSystem/WechatFileSystem/Operation/internal/RecordWechatCacheFilesOperation.cs	
+++ /dev/null
@@ -1,60 +0,0 @@
-#if UNITY_WEBGL && WEIXINMINIGAME
-using YooAsset;
-using WeChatWASM;
-using System.IO;
-
-internal class RecordWechatCacheFilesOperation : AsyncOperationBase
-{
-    private enum ESteps
-    {
-        None,
-        RecordCacheFiles,
-        WaitResponse,
-        Done,
-    }
-
-    private readonly WechatFileSystem _fileSystem;
-    private ESteps _steps = ESteps.None;
-
-    public RecordWechatCacheFilesOperation(WechatFileSystem fileSystem)
-    {
-        _fileSystem = fileSystem;
-    }
-    internal override void InternalOnStart()
-    {
-        _steps = ESteps.RecordCacheFiles;
-    }
-    internal override void InternalOnUpdate()
-    {
-        if (_steps == ESteps.None || _steps == ESteps.Done)
-            return;
-
-        if (_steps == ESteps.RecordCacheFiles)
-        {
-            _steps = ESteps.WaitResponse;
-
-            var fileSystemMgr = _fileSystem.GetFileSystemMgr();
-            var statOption = new WXStatOption();
-            statOption.path = _fileSystem.FileRoot;
-            statOption.recursive = true;
-            statOption.success = (WXStatResponse response) =>
-            {
-                _steps = ESteps.Done;
-                Status = EOperationStatus.Succeed;
-                foreach (var fileStat in response.stats)
-                {
-                    //TODO 需要确认存储文件为Bundle文件
-                    _fileSystem.RecordBundleFile(_fileSystem.FileRoot + fileStat.path);
-                }
-            };
-            statOption.fail = (WXStatResponse response) =>
-            {
-                _steps = ESteps.Done;
-                Status = EOperationStatus.Failed;
-                Error = response.errMsg;
-            };
-            fileSystemMgr.Stat(statOption);
-        }
-    }
-}
-#endif
\ No newline at end of file
diff --git a/Assets/YooAsset/Samples~/Extension Sample/Runtime/ExtensionFileSystem/WechatFileSystem/Operation/internal/RecordWechatCacheFilesOperation.cs.meta b/Assets/YooAsset/Samples~/Extension Sample/Runtime/ExtensionFileSystem/WechatFileSystem/Operation/internal/RecordWechatCacheFilesOperation.cs.meta
deleted file mode 100644
index 3ddd1e8d..00000000
--- a/Assets/YooAsset/Samples~/Extension Sample/Runtime/ExtensionFileSystem/WechatFileSystem/Operation/internal/RecordWechatCacheFilesOperation.cs.meta	
+++ /dev/null
@@ -1,11 +0,0 @@
-fileFormatVersion: 2
-guid: 640ec7bd883b8314db53b508278aea6e
-MonoImporter:
-  externalObjects: {}
-  serializedVersion: 2
-  defaultReferences: []
-  executionOrder: 0
-  icon: {instanceID: 0}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/Assets/YooAsset/Samples~/Extension Sample/Runtime/ExtensionFileSystem/WechatFileSystem/WechatFileSystem.cs b/Assets/YooAsset/Samples~/Extension Sample/Runtime/ExtensionFileSystem/WechatFileSystem/WechatFileSystem.cs
index 2c72df3d..1220a8f8 100644
--- a/Assets/YooAsset/Samples~/Extension Sample/Runtime/ExtensionFileSystem/WechatFileSystem/WechatFileSystem.cs	
+++ b/Assets/YooAsset/Samples~/Extension Sample/Runtime/ExtensionFileSystem/WechatFileSystem/WechatFileSystem.cs	
@@ -53,8 +53,7 @@ internal class WechatFileSystem : IFileSystem
         }
     }
 
-    private readonly HashSet<string> _recorders = new HashSet<string>();
-    private readonly Dictionary<string, string> _cacheFilePaths = new Dictionary<string, string>(10000);
+    private readonly Dictionary<string, string> _cacheFilePathMapping = new Dictionary<string, string>(10000);
     private WXFileSystemManager _fileSystemMgr;
     private string _wxCacheRoot = string.Empty;
 
@@ -83,7 +82,7 @@ internal class WechatFileSystem : IFileSystem
     {
         get
         {
-            return _recorders.Count;
+            return 0;
         }
     }
 
@@ -174,10 +173,10 @@ internal class WechatFileSystem : IFileSystem
             YooLogger.Warning($"Invalid parameter : {name}");
         }
     }
-    public virtual void OnCreate(string packageName, string rootDirectory)
+    public virtual void OnCreate(string packageName, string packageRoot)
     {
         PackageName = packageName;
-        _wxCacheRoot = rootDirectory;
+        _wxCacheRoot = packageRoot;
 
         if (string.IsNullOrEmpty(_wxCacheRoot))
         {
@@ -204,7 +203,7 @@ internal class WechatFileSystem : IFileSystem
     public virtual bool Exists(PackageBundle bundle)
     {
         string filePath = GetCacheFileLoadPath(bundle);
-        return _recorders.Contains(filePath);
+        return CheckCacheFileExist(filePath);
     }
     public virtual bool NeedDownload(PackageBundle bundle)
     {
@@ -250,55 +249,21 @@ internal class WechatFileSystem : IFileSystem
     }
     public bool CheckCacheFileExist(string filePath)
     {
-        string result = _fileSystemMgr.AccessSync(filePath);
-        return result.Equals("access:ok");
+        string result = WX.GetCachePath(filePath);
+        if (string.IsNullOrEmpty(result))
+            return false;
+        else
+            return true;
     }
     public string GetCacheFileLoadPath(PackageBundle bundle)
     {
-        if (_cacheFilePaths.TryGetValue(bundle.BundleGUID, out string filePath) == false)
+        if (_cacheFilePathMapping.TryGetValue(bundle.BundleGUID, out string filePath) == false)
         {
-            filePath = PathUtility.Combine(_wxCacheRoot, "__GAME_FILE_CACHE", _packageRoot, bundle.FileName);
-            _cacheFilePaths.Add(bundle.BundleGUID, filePath);
+            filePath = PathUtility.Combine(_wxCacheRoot, bundle.FileName);
+            _cacheFilePathMapping.Add(bundle.BundleGUID, filePath);
         }
         return filePath;
     }
     #endregion
-
-    #region 本地记录
-    public List<string> GetAllRecords()
-    {
-        return _recorders.ToList();
-    }
-    public bool RecordBundleFile(string filePath)
-    {
-        if (_recorders.Contains(filePath))
-        {
-            YooLogger.Error($"{nameof(WechatFileSystem)} has element : {filePath}");
-            return false;
-        }
-
-        _recorders.Add(filePath);
-        return true;
-    }
-    public void TryRecordBundle(PackageBundle bundle)
-    {
-        string filePath = GetCacheFileLoadPath(bundle);
-        if (_recorders.Contains(filePath) == false)
-        {
-            _recorders.Add(filePath);
-        }
-    }
-    public void ClearAllRecords()
-    {
-        _recorders.Clear();
-    }
-    public void ClearRecord(string filePath)
-    {
-        if (_recorders.Contains(filePath))
-        {
-            _recorders.Remove(filePath);
-        }
-    }
-    #endregion
 }
 #endif
\ No newline at end of file