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