From 71365e5c15d81759c04d7aab953fa757fb183f9b Mon Sep 17 00:00:00 2001
From: yyl <yyl>
Date: 星期三, 12 十一月 2025 18:54:59 +0800
Subject: [PATCH] Merge branch 'master' of http://192.168.1.20:10010/r/Project_SG_scripts

---
 Main/Utility/JaceCalculator.cs |   57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 55 insertions(+), 2 deletions(-)

diff --git a/Main/Utility/JaceCalculator.cs b/Main/Utility/JaceCalculator.cs
index 941f833..f1ca3b2 100644
--- a/Main/Utility/JaceCalculator.cs
+++ b/Main/Utility/JaceCalculator.cs
@@ -5,9 +5,15 @@
 public static class JaceCalculator
 {
     private static readonly CalculationEngine Engine = new CalculationEngine();
+    private static readonly Dictionary<string, double> _reusableVariables = new Dictionary<string, double>();
+    private static readonly object _lockObject = new object();
+    
+    // 鍏紡缂撳瓨锛岄伩鍏嶉噸澶嶈В鏋�
+    private static readonly Dictionary<string, Func<Dictionary<string, double>, double>> _formulaCache = 
+        new Dictionary<string, Func<Dictionary<string, double>, double>>();
 
     /// <summary>
-    /// 瑙f瀽骞惰绠楁暟瀛﹁〃杈惧紡
+    /// 瑙f瀽骞惰绠楁暟瀛﹁〃杈惧紡锛堜紭鍖栫増鏈紝鍑忓皯GC锛�
     /// </summary>
     /// <param name="formula">鏁板琛ㄨ揪寮忓瓧绗︿覆</param>
     /// <param name="variables">鍙橀噺瀛楀吀</param>
@@ -26,7 +32,14 @@
 
         try
         {
-            return Engine.Calculate(formula, variables);
+            // 浣跨敤缂撳瓨浼樺寲
+            if (!_formulaCache.TryGetValue(formula, out var compiledFormula))
+            {
+                compiledFormula = Engine.Build(formula);
+                _formulaCache[formula] = compiledFormula;
+            }
+            
+            return compiledFormula(variables);
         }
         catch (Exception ex)
         {
@@ -34,9 +47,49 @@
         }
     }
 
+    /// <summary>
+    /// 棰勭紪璇戝父鐢ㄥ叕寮忥紝鍑忓皯杩愯鏃惰В鏋愬紑閿�
+    /// </summary>
+    /// <param name="formulas">闇�瑕侀缂栬瘧鐨勫叕寮忔暟缁�</param>
+    public static void PrecompileFormulas(params string[] formulas)
+    {
+        if (formulas == null || formulas.Length == 0) return;
+        
+        lock (_lockObject)
+        {
+            foreach (var formula in formulas)
+            {
+                if (!string.IsNullOrEmpty(formula) && !_formulaCache.ContainsKey(formula))
+                {
+                    try
+                    {
+                        var compiledFormula = Engine.Build(formula);
+                        _formulaCache[formula] = compiledFormula;
+                    }
+                    catch (Exception ex)
+                    {
+                        UnityEngine.Debug.LogWarning($"Failed to precompile formula '{formula}': {ex.Message}");
+                    }
+                }
+            }
+        }
+    }
+
+    /// <summary>
+    /// 娓呯┖鍏紡缂撳瓨锛堢敤浜庡唴瀛樼鐞嗭級
+    /// </summary>
+    public static void ClearCache()
+    {
+        lock (_lockObject)
+        {
+            _formulaCache.Clear();
+        }
+    }
+
     public static void Init()
     {
         Engine.AddFunction("int", (Func<double, double>)(x => (int)x));
         Engine.AddFunction("long", (Func<double, double>)(x => (long)x));
+        
     }
 }
\ No newline at end of file

--
Gitblit v1.8.0