using Jace; using System; using System.Collections.Generic; public static class JaceCalculator { private static readonly CalculationEngine Engine = new CalculationEngine(); private static readonly Dictionary _reusableVariables = new Dictionary(); private static readonly object _lockObject = new object(); // 公式缓存,避免重复解析 private static readonly Dictionary, double>> _formulaCache = new Dictionary, double>>(); /// /// 解析并计算数学表达式(优化版本,减少GC) /// /// 数学表达式字符串 /// 变量字典 /// 计算结果 public static double Calculate(string formula, Dictionary variables) { if (string.IsNullOrEmpty(formula)) { throw new ArgumentException("Formula cannot be null or empty."); } if (variables == null || variables.Count == 0) { throw new ArgumentException("Variables dictionary cannot be null or empty."); } try { // 使用缓存优化 if (!_formulaCache.TryGetValue(formula, out var compiledFormula)) { compiledFormula = Engine.Build(formula); _formulaCache[formula] = compiledFormula; } return compiledFormula(variables); } catch (Exception ex) { throw new InvalidOperationException($"Failed to calculate formula: {ex.Message}", ex); } } /// /// 预编译常用公式,减少运行时解析开销 /// /// 需要预编译的公式数组 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}"); } } } } } /// /// 清空公式缓存(用于内存管理) /// public static void ClearCache() { lock (_lockObject) { _formulaCache.Clear(); } } public static void Init() { Engine.AddFunction("int", (Func)(x => (int)x)); Engine.AddFunction("long", (Func)(x => (long)x)); } }