hch
21 小时以前 03942026b95aba9f0af1c637749ad27de399b932
0312 优化掉落战力计算卡顿问题
4个文件已修改
2个文件已添加
368 ■■■■■ 已修改文件
Main/System/DayMission/DayMissionManager.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Main/FightPowerFormula.cs 158 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Main/FightPowerFormula.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Main/FightPowerManager.cs 130 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Utility/GlobalTimeEvent.cs 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Utility/JaceCalculator.cs 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/DayMission/DayMissionManager.cs
@@ -20,7 +20,7 @@
    public override void Init()
    {
        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += OnBeforePlayerDataInitialize;
        GlobalTimeEvent.Instance.MS100Event += OnMSEvent;
        GlobalTimeEvent.Instance.MSEvent += OnMSEvent;
        ParseConfig();
    }
@@ -28,7 +28,7 @@
    public override void Release()
    {
        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent -= OnBeforePlayerDataInitialize;
        GlobalTimeEvent.Instance.MS100Event -= OnMSEvent;
        GlobalTimeEvent.Instance.MSEvent -= OnMSEvent;
    }
    void OnBeforePlayerDataInitialize()
Main/System/Main/FightPowerFormula.cs
New file
@@ -0,0 +1,158 @@
using System.Collections.Generic;
public class FightPowerFormula
{
    // 基础属性公式
    // 战斗属性公式
    // (lvValue+equipValue+bookValue+realmValue+gubaoValue+hjgValue+horseValue)+(heroSelfValue+lineupHaloValue+starTalentValue+breakLVValue+awakeTalentValue)+fetterValue
    // 战斗力公式
    // long(Atk*AtkRatio+MaxHP*MaxHPRatio+Def*DefRatio+(StunRate*StunRateRatio+SuperHitRate*SuperHitRateRatio+ComboRate*ComboRateRatio+MissRate*MissRateRatio+ParryRate*ParryRateRatio+SuckHPPer*SuckHPPerRatio+StunRateDef*StunRateDefRatio+SuperHitRateDef*SuperHitRateDefRatio+ComboRateDef*ComboRateDefRatio+MissRateDef*MissRateDefRatio+ParryRateDef*ParryRateDefRatio+SuckHPPerDef*SuckHPPerDefRatio+FinalDamPer*FinalDamPerRatio+FinalDamPerDef*FinalDamPerDefRatio+PhyDamPer*PhyDamPerRatio+PhyDamPerDef*PhyDamPerDefRatio+MagDamPer*MagDamPerRatio+MagDamPerDef*MagDamPerDefRatio+NormalSkillPer*NormalSkillPerRatio+NormalSkillPerDef*NormalSkillPerDefRatio+AngerSkillPer*AngerSkillPerRatio+AngerSkillPerDef*AngerSkillPerDefRatio+SuperDamPer*SuperDamPerRatio+SuperDamPerDef*SuperDamPerDefRatio+CurePer*CurePerRatio+CurePerDef*CurePerDefRatio+ShieldPer*ShieldPerRatio+ShieldPerDef*ShieldPerDefRatio+DOTPer*DOTPerRatio+DOTPerDef*DOTPerDefRatio+WeiFinalDamPer*WeiFinalDamPerRatio+WeiFinalDamPerDef*WeiFinalDamPerDefRatio+ShuFinalDamPer*ShuFinalDamPerRatio+ShuFinalDamPerDef*ShuFinalDamPerDefRatio+WuFinalDamPer*WuFinalDamPerRatio+WuFinalDamPerDef*WuFinalDamPerDefRatio+QunFinalDamPer*QunFinalDamPerRatio+QunFinalDamPerDef*QunFinalDamPerDefRatio)/100.0-55000)
    public static double GetBaseAttr(Dictionary<string, double> variables)
    {
        double lvValue = variables["lvValue"];
        double equipValue = variables["equipValue"];
        double bookValue = variables["bookValue"];
        double realmValue = variables["realmValue"];
        double gubaoValue = variables["gubaoValue"];
        double hjgValue = variables["hjgValue"];
        double horseValue = variables["horseValue"];
        double lineupHaloPer = variables["lineupHaloPer"];
        double bookPer = variables["bookPer"];
        double realmPer = variables["realmPer"];
        double gubaoPer = variables["gubaoPer"];
        double hjgPer = variables["hjgPer"];
        double horsePer = variables["horsePer"];
        double lineupInitAddPer = variables["lineupInitAddPer"];
        double lineupLVAddPer = variables["lineupLVAddPer"];
        double lineupBreakLVAddPer = variables["lineupBreakLVAddPer"];
        double lineupStarAddPer = variables["lineupStarAddPer"];
        double inheritPer = variables["inheritPer"];
        double fetterPer = variables["fetterPer"];
        double starTalentPer = variables["starTalentPer"];
        double breakLVPer = variables["breakLVPer"];
        double awakeTalentPer = variables["awakeTalentPer"];
        double heroSelfValue = variables["heroSelfValue"];
        return (lvValue + equipValue + bookValue + realmValue + gubaoValue + hjgValue + horseValue) * (1 + lineupHaloPer + bookPer + realmPer + gubaoPer + hjgPer + horsePer + lineupInitAddPer + lineupLVAddPer + lineupBreakLVAddPer + lineupStarAddPer) * (inheritPer + fetterPer + starTalentPer + breakLVPer + awakeTalentPer) + heroSelfValue;
    }
    public static double GetFightAttr(Dictionary<string, double> variables)
    {
        double lvValue = variables["lvValue"];
        double equipValue = variables["equipValue"];
        double bookValue = variables["bookValue"];
        double realmValue = variables["realmValue"];
        double gubaoValue = variables["gubaoValue"];
        double hjgValue = variables["hjgValue"];
        double horseValue = variables["horseValue"];
        double heroSelfValue = variables["heroSelfValue"];
        double lineupHaloValue = variables["lineupHaloValue"];
        double starTalentValue = variables["starTalentValue"];
        double breakLVValue = variables["breakLVValue"];
        double awakeTalentValue = variables["awakeTalentValue"];
        double fetterValue = variables["fetterValue"];
        return lvValue + equipValue + bookValue + realmValue + gubaoValue + hjgValue + horseValue + (heroSelfValue + lineupHaloValue + starTalentValue + breakLVValue + awakeTalentValue) + fetterValue;
    }
    public static double GetFightPower(Dictionary<string, double> variables)
    {
        double Atk = variables["Atk"];
        double AtkRatio = variables["AtkRatio"];
        double MaxHP = variables["MaxHP"];
        double MaxHPRatio = variables["MaxHPRatio"];
        double Def = variables["Def"];
        double DefRatio = variables["DefRatio"];
        double StunRate = variables["StunRate"];
        double StunRateRatio = variables["StunRateRatio"];
        double SuperHitRate = variables["SuperHitRate"];
        double SuperHitRateRatio = variables["SuperHitRateRatio"];
        double ComboRate = variables["ComboRate"];
        double ComboRateRatio = variables["ComboRateRatio"];
        double MissRate = variables["MissRate"];
        double MissRateRatio = variables["MissRateRatio"];
        double ParryRate = variables["ParryRate"];
        double ParryRateRatio = variables["ParryRateRatio"];
        double SuckHPPer = variables["SuckHPPer"];
        double SuckHPPerRatio = variables["SuckHPPerRatio"];
        double StunRateDef = variables["StunRateDef"];
        double StunRateDefRatio = variables["StunRateDefRatio"];
        double SuperHitRateDef = variables["SuperHitRateDef"];
        double SuperHitRateDefRatio = variables["SuperHitRateDefRatio"];
        double ComboRateDef = variables["ComboRateDef"];
        double ComboRateDefRatio = variables["ComboRateDefRatio"];
        double MissRateDef = variables["MissRateDef"];
        double MissRateDefRatio = variables["MissRateDefRatio"];
        double ParryRateDef = variables["ParryRateDef"];
        double ParryRateDefRatio = variables["ParryRateDefRatio"];
        double SuckHPPerDef = variables["SuckHPPerDef"];
        double SuckHPPerDefRatio = variables["SuckHPPerDefRatio"];
        double FinalDamPer = variables["FinalDamPer"];
        double FinalDamPerRatio = variables["FinalDamPerRatio"];
        double FinalDamPerDef = variables["FinalDamPerDef"];
        double FinalDamPerDefRatio = variables["FinalDamPerDefRatio"];
        double PhyDamPer = variables["PhyDamPer"];
        double PhyDamPerRatio = variables["PhyDamPerRatio"];
        double PhyDamPerDef = variables["PhyDamPerDef"];
        double PhyDamPerDefRatio = variables["PhyDamPerDefRatio"];
        double MagDamPer = variables["MagDamPer"];
        double MagDamPerRatio = variables["MagDamPerRatio"];
        double MagDamPerDef = variables["MagDamPerDef"];
        double MagDamPerDefRatio = variables["MagDamPerDefRatio"];
        double NormalSkillPer = variables["NormalSkillPer"];
        double NormalSkillPerRatio = variables["NormalSkillPerRatio"];
        double NormalSkillPerDef = variables["NormalSkillPerDef"];
        double NormalSkillPerDefRatio = variables["NormalSkillPerDefRatio"];
        double AngerSkillPer = variables["AngerSkillPer"];
        double AngerSkillPerRatio = variables["AngerSkillPerRatio"];
        double AngerSkillPerDef = variables["AngerSkillPerDef"];
        double AngerSkillPerDefRatio = variables["AngerSkillPerDefRatio"];
        double SuperDamPer = variables["SuperDamPer"];
        double SuperDamPerRatio = variables["SuperDamPerRatio"];
        double SuperDamPerDef = variables["SuperDamPerDef"];
        double SuperDamPerDefRatio = variables["SuperDamPerDefRatio"];
        double CurePer = variables["CurePer"];
        double CurePerRatio = variables["CurePerRatio"];
        double CurePerDef = variables["CurePerDef"];
        double CurePerDefRatio = variables["CurePerDefRatio"];
        double ShieldPer = variables["ShieldPer"];
        double ShieldPerRatio = variables["ShieldPerRatio"];
        double ShieldPerDef = variables["ShieldPerDef"];
        double ShieldPerDefRatio = variables["ShieldPerDefRatio"];
        double DOTPer = variables["DOTPer"];
        double DOTPerRatio = variables["DOTPerRatio"];
        double DOTPerDef = variables["DOTPerDef"];
        double DOTPerDefRatio = variables["DOTPerDefRatio"];
        double WeiFinalDamPer = variables["WeiFinalDamPer"];
        double WeiFinalDamPerRatio = variables["WeiFinalDamPerRatio"];
        double WeiFinalDamPerDef = variables["WeiFinalDamPerDef"];
        double WeiFinalDamPerDefRatio = variables["WeiFinalDamPerDefRatio"];
        double ShuFinalDamPer = variables["ShuFinalDamPer"];
        double ShuFinalDamPerRatio = variables["ShuFinalDamPerRatio"];
        double ShuFinalDamPerDef = variables["ShuFinalDamPerDef"];
        double ShuFinalDamPerDefRatio = variables["ShuFinalDamPerDefRatio"];
        double WuFinalDamPer = variables["WuFinalDamPer"];
        double WuFinalDamPerRatio = variables["WuFinalDamPerRatio"];
        double WuFinalDamPerDef = variables["WuFinalDamPerDef"];
        double WuFinalDamPerDefRatio = variables["WuFinalDamPerDefRatio"];
        double QunFinalDamPer = variables["QunFinalDamPer"];
        double QunFinalDamPerRatio = variables["QunFinalDamPerRatio"];
        double QunFinalDamPerDef = variables["QunFinalDamPerDef"];
        double QunFinalDamPerDefRatio = variables["QunFinalDamPerDefRatio"];
        return Atk * AtkRatio + MaxHP * MaxHPRatio + Def * DefRatio + (StunRate * StunRateRatio + SuperHitRate * SuperHitRateRatio + ComboRate * ComboRateRatio + MissRate * MissRateRatio + ParryRate * ParryRateRatio + SuckHPPer * SuckHPPerRatio + StunRateDef * StunRateDefRatio + SuperHitRateDef * SuperHitRateDefRatio + ComboRateDef * ComboRateDefRatio + MissRateDef * MissRateDefRatio + ParryRateDef * ParryRateDefRatio + SuckHPPerDef * SuckHPPerDefRatio + FinalDamPer * FinalDamPerRatio + FinalDamPerDef * FinalDamPerDefRatio + PhyDamPer * PhyDamPerRatio + PhyDamPerDef * PhyDamPerDefRatio + MagDamPer * MagDamPerRatio + MagDamPerDef * MagDamPerDefRatio + NormalSkillPer * NormalSkillPerRatio + NormalSkillPerDef * NormalSkillPerDefRatio + AngerSkillPer * AngerSkillPerRatio + AngerSkillPerDef * AngerSkillPerDefRatio + SuperDamPer * SuperDamPerRatio + SuperDamPerDef * SuperDamPerDefRatio + CurePer * CurePerRatio + CurePerDef * CurePerDefRatio + ShieldPer * ShieldPerRatio + ShieldPerDef * ShieldPerDefRatio + DOTPer * DOTPerRatio + DOTPerDef * DOTPerDefRatio + WeiFinalDamPer * WeiFinalDamPerRatio + WeiFinalDamPerDef * WeiFinalDamPerDefRatio + ShuFinalDamPer * ShuFinalDamPerRatio + ShuFinalDamPerDef * ShuFinalDamPerDefRatio + WuFinalDamPer * WuFinalDamPerRatio + WuFinalDamPerDef * WuFinalDamPerDefRatio + QunFinalDamPer * QunFinalDamPerRatio + QunFinalDamPerDef * QunFinalDamPerDefRatio) / 100.0 - 55000;
    }
    public static double GetSkillsFightPower(Dictionary<string, double> variables)
    {
        double SkillPower = variables["SkillPower"];
        double OfficialLV = variables["OfficialLV"];
        return SkillPower * OfficialLV;
    }
}
Main/System/Main/FightPowerFormula.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 7ccd965ff7cf97e40bc0c620b706bcff
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Main/System/Main/FightPowerManager.cs
@@ -4,7 +4,7 @@
using System.Linq;
using UnityEngine;
using LitJson;
using Spine;
//!单英雄查看战力 只算自己的上阵属性  不算羁绊 总上阵属性  光环
// 战力的计算方式
@@ -20,7 +20,7 @@
    Dictionary<string, double> propertyVariables = new Dictionary<string, double>();
    Dictionary<string, double> fightPowerVariables = new Dictionary<string, double>();  //总战力中的单武将战力
    int useFormulaType = 0;  //公式调用方式0 代码 1公式
    public FightPowerManager()
    {
        // 数值1:基础三维属性计算公式
@@ -53,7 +53,7 @@
        dropIndexCalc = dropindex;
#if UNITY_EDITOR
        Debug.Log("战力:初始化参数 dropIndex:" + dropIndexCalc + " 阵型:" + teamTypeCalc + " ispreview:" + ispreview);
        // Debug.Log("战力:初始化参数 dropIndex:" + dropIndexCalc + " 阵型:" + teamTypeCalc + " ispreview:" + ispreview);
#endif
    }
    #endregion
@@ -74,14 +74,14 @@
    //等级属性
    void RefreshLVAttrs()
    {
        lvAttrs.Clear();
        // lvAttrs.Clear();
        var playerLVConfig = PlayerLVConfig.Get(PlayerDatas.Instance.baseData.LV);
        foreach (var attrType in PlayerPropertyConfig.baseAttrs)
        {
            lvAttrs[attrType] = GetPlayerLVValue(playerLVConfig, attrType);
        }
#if UNITY_EDITOR
        Debug.Log("战力:等级属性 " + JsonMapper.ToJson(lvAttrs));
        // Debug.Log("战力:等级属性 " + JsonMapper.ToJson(lvAttrs));
#endif
    }
@@ -107,7 +107,7 @@
    //官职属性
    void RefreshOfficialAttrs()
    {
        officialAttrs.Clear();
        // officialAttrs.Clear();
        var config = RealmConfig.Get(PlayerDatas.Instance.baseData.realmLevel);
        for (int i = 0; i < config.AddAttrType.Length; i++)
        {
@@ -115,7 +115,7 @@
            officialAttrs[id] = config.AddAttrNum[i];
        }
#if UNITY_EDITOR
        Debug.Log("战力:官职属性 " + JsonMapper.ToJson(officialAttrs));
        // Debug.Log("战力:官职属性 " + JsonMapper.ToJson(officialAttrs));
#endif
    }
@@ -175,7 +175,7 @@
        }
#if UNITY_EDITOR
        Debug.Log("战力:装备属性 " + JsonMapper.ToJson(equipAttrs));
        // Debug.Log("战力:装备属性 " + JsonMapper.ToJson(equipAttrs));
#endif
    }
@@ -187,12 +187,12 @@
        lineUpPerDict = HeroUIManager.Instance.GetLineupPer(teamTypeCalc, isPreviewTeamPower);
#if UNITY_EDITOR
        Debug.Log("战力:上阵属性 " + JsonMapper.ToJson(lineUpPerDict));
        // Debug.Log("战力:上阵属性 " + JsonMapper.ToJson(lineUpPerDict));
#endif
        // 阵容:国家(光环)属性
        countryAttrs = HeroUIManager.Instance.GetCountryAttrs(teamTypeCalc, isPreviewTeamPower);
#if UNITY_EDITOR
        Debug.Log("战力:国家(光环)属性 " + JsonMapper.ToJson(countryAttrs));
        // Debug.Log("战力:国家(光环)属性 " + JsonMapper.ToJson(countryAttrs));
#endif
    }
@@ -223,7 +223,7 @@
    // 单基础属性计算
    public double GetPropertyVaule(int attrType, HeroInfo hero, string formula)
    {
        propertyVariables.Clear();
        // propertyVariables.Clear();
        propertyVariables["lvValue"] = lvAttrs.ContainsKey(attrType) ? lvAttrs[attrType] : 0;
        propertyVariables["equipValue"] = equipAttrs.ContainsKey(attrType) ? equipAttrs[attrType] : 0;
        propertyVariables["bookValue"] = 0;
@@ -263,12 +263,66 @@
#if UNITY_EDITOR
        //排除值为0的属性输出
        var tmpPropertyVariables = propertyVariables.Where(x => x.Value > 0).ToDictionary(x => x.Key, x => x.Value);
        if (!tmpPropertyVariables.IsNullOrEmpty())
            propertyStrForDebug += $"属性ID {attrType} - {JsonMapper.ToJson(tmpPropertyVariables)}";
        // var tmpPropertyVariables = propertyVariables.Where(x => x.Value > 0).ToDictionary(x => x.Key, x => x.Value);
        // if (!tmpPropertyVariables.IsNullOrEmpty())
        //     propertyStrForDebug += $"属性ID {attrType} - {JsonMapper.ToJson(tmpPropertyVariables)}";
#endif
        return JaceCalculator.Calculate(formula, propertyVariables);
    }
    public double GetPropertyVaule(int attrType, HeroInfo hero, int type)
    {
        // propertyVariables.Clear();
        propertyVariables["lvValue"] = lvAttrs.ContainsKey(attrType) ? lvAttrs[attrType] : 0;
        propertyVariables["equipValue"] = equipAttrs.ContainsKey(attrType) ? equipAttrs[attrType] : 0;
        propertyVariables["bookValue"] = 0;
        propertyVariables["bookPer"] = GetBookPer(attrType) / 10000.0f;
        propertyVariables["realmValue"] = officialAttrs.ContainsKey(attrType) ? officialAttrs[attrType] : 0;
        propertyVariables["realmPer"] = GetOfficialPer(attrType) / 10000.0f;
        propertyVariables["gubaoValue"] = 0;
        propertyVariables["gubaoPer"] = 0;
        propertyVariables["hjgValue"] = 0;
        propertyVariables["hjgPer"] = 0;
        propertyVariables["horseValue"] = 0;
        propertyVariables["horsePer"] = 0;
        //!!!单武将战力预览的话需要排除队伍影响战力,只算武将自身的上阵属性
        propertyVariables["lineupInitAddPer"] = GetLineUpPer(attrType, "lineupInitAddPer") / 10000.0f;
        propertyVariables["lineupLVAddPer"] = GetLineUpPer(attrType, "lineupLVAddPer") / 10000.0f;
        propertyVariables["lineupBreakLVAddPer"] = GetLineUpPer(attrType, "lineupBreakLVAddPer") / 10000.0f;
        propertyVariables["lineupStarAddPer"] = GetLineUpPer(attrType, "lineupStarAddPer") / 10000.0f;
        //阵容光环 三围百分比加成
        propertyVariables["lineupHaloValue"] = countryAttrs.ContainsKey(attrType) ? countryAttrs[attrType] : 0;
        propertyVariables["lineupHaloPer"] = GetCountryPer(attrType) / 10000.0f;
        //武将属性
        propertyVariables["inheritPer"] = hero.GetInheritAttrPer(attrType) / 10000.0f;
        propertyVariables["heroSelfValue"] = hero.GetSelfAddValue(attrType);
        propertyVariables["heroSelfPer"] = hero.GetSelfAddPer(attrType) / 10000.0f;
        propertyVariables["starTalentValue"] = hero.GetTalentAttrValue(attrType);
        propertyVariables["starTalentPer"] = hero.GetTalentAttrPer(attrType) / 10000.0f;
        propertyVariables["breakLVValue"] = hero.GetBreakAttrValue(attrType);
        propertyVariables["breakLVPer"] = hero.GetBreakAttrPer(attrType) / 10000.0f;
        propertyVariables["awakeTalentValue"] = hero.GetAwakeAttrValue(attrType);
        propertyVariables["awakeTalentPer"] = hero.GetAwakeAttrPer(attrType) / 10000.0f;
        propertyVariables["fetterValue"] = hero.GetFetterAttrValue(attrType);
        propertyVariables["fetterPer"] = hero.GetFetterAttrPer(attrType) / 10000.0f;
#if UNITY_EDITOR
        //排除值为0的属性输出
        // var tmpPropertyVariables = propertyVariables.Where(x => x.Value > 0).ToDictionary(x => x.Key, x => x.Value);
        // if (!tmpPropertyVariables.IsNullOrEmpty())
        //     propertyStrForDebug += $"属性ID {attrType} - {JsonMapper.ToJson(tmpPropertyVariables)}";
#endif
        if (type == 0)
            return FightPowerFormula.GetBaseAttr(propertyVariables);
        else
            return FightPowerFormula.GetFightAttr(propertyVariables);
    }
    int GetLineUpPer(int attrType, string key)
@@ -325,7 +379,7 @@
    public long CalculatePower()
    {
#if UNITY_EDITOR
        Debug.Log("战力:开始计算");
        // Debug.Log("战力:开始计算");
#endif
        // --- 先计算所有功能的汇总属性 ---
        RefreshLVAttrs();
@@ -359,7 +413,7 @@
        }
#if UNITY_EDITOR
        Debug.Log("战力:计算完毕 " + fightPower);
        // Debug.Log("战力:计算完毕 " + fightPower);
#endif
        return fightPower;
    }
@@ -386,16 +440,22 @@
            }
            if (config.showType == 1)
            {
                if (useFormulaType == 0)
                    fightPowerVariables[config.Parameter] = Math.Round(GetPropertyVaule(config.ID, hero, 0), 3);
                else
                fightPowerVariables[config.Parameter] = Math.Round(GetPropertyVaule(config.ID, hero, propertyFormula), 3);
            }
            else
            {
                if (useFormulaType == 0)
                    fightPowerVariables[config.Parameter] = Math.Round(GetPropertyVaule(config.ID, hero, 1), 3);
                else
                fightPowerVariables[config.Parameter] = Math.Round(GetPropertyVaule(config.ID, hero, fightPropertyFormula), 3);
            }
        }
#if UNITY_EDITOR
        Debug.Log($"战力:武将ID {hero.heroId} 属性信息 {propertyStrForDebug}");
        // Debug.Log($"战力:武将ID {hero.heroId} 属性信息 {propertyStrForDebug}");
#endif
        //属性系数根据官职等级的加成
@@ -443,13 +503,21 @@
        fightPowerVariables["CurePerRatio"] = fightPowerRatioConfig.CurePerRatio;
        fightPowerVariables["CurePerDefRatio"] = fightPowerRatioConfig.CurePerDefRatio;
        long fightPower;
        if (useFormulaType == 0)
        {
            fightPower = (long)FightPowerFormula.GetFightPower(fightPowerVariables);
        }
        else
        {
        long fightPower = (long)JaceCalculator.Calculate(fightPowerFormula, fightPowerVariables);
            fightPower = (long)JaceCalculator.Calculate(fightPowerFormula, fightPowerVariables);
        }
#if UNITY_EDITOR
        //排除值为0的属性输出
        var tmpFightPowerVariables = fightPowerVariables.Where(x => x.Value > 0).ToDictionary(x => x.Key, x => x.Value);
        if (!tmpFightPowerVariables.IsNullOrEmpty())
            Debug.Log($"战力:武将ID {hero.heroId} 属性战力 {fightPower} 属性战力参数 {JsonMapper.ToJson(tmpFightPowerVariables)}");
            // var tmpFightPowerVariables = fightPowerVariables.Where(x => x.Value > 0).ToDictionary(x => x.Key, x => x.Value);
            // if (!tmpFightPowerVariables.IsNullOrEmpty())
            //     Debug.Log($"战力:武将ID {hero.heroId} 属性战力 {fightPower} 属性战力参数 {JsonMapper.ToJson(tmpFightPowerVariables)}");
#endif
        //加上技能战力
@@ -458,12 +526,20 @@
        fightPowerVariables["OfficialLV"] = PlayerDatas.Instance.baseData.realmLevel;
        fightPowerVariables["SkillPower"] = hero.GetSkillsFightPower();
        long skillPower = (long)JaceCalculator.Calculate(skillFightPowerFormula, fightPowerVariables);
        long skillPower;
        if (useFormulaType == 0)
        {
            skillPower = (long)FightPowerFormula.GetSkillsFightPower(fightPowerVariables);
        }
        else
        {
            skillPower = (long)JaceCalculator.Calculate(skillFightPowerFormula, fightPowerVariables);
        }
#if UNITY_EDITOR
        Debug.Log($"战力:武将ID {hero.heroId} 技能战力 {skillPower} 技能参数 {JsonMapper.ToJson(fightPowerVariables)}");
            // Debug.Log($"战力:武将ID {hero.heroId} 技能战力 {skillPower} 技能参数 {JsonMapper.ToJson(fightPowerVariables)}");
        Debug.Log($"战力:武将ID {hero.heroId} 总战力 {fightPower + skillPower}");
            // Debug.Log($"战力:武将ID {hero.heroId} 总战力 {fightPower + skillPower}");
#endif
        return fightPower + skillPower;
@@ -550,15 +626,15 @@
            }
            if (config.showType == 1)
            {
                tmpAttrs[config.ID] = (long)GetPropertyVaule(config.ID, hero, propertyFormula);
                tmpAttrs[config.ID] = (long)GetPropertyVaule(config.ID, hero, 0);
            }
            else
            {
                tmpAttrs[config.ID] = (long)GetPropertyVaule(config.ID, hero, fightPropertyFormula);
                tmpAttrs[config.ID] = (long)GetPropertyVaule(config.ID, hero, 1);
            }
        }
#if UNITY_EDITOR
        Debug.Log($"战力:武将ID {hero.heroId} 属性信息 {propertyStrForDebug}");
        // Debug.Log($"战力:武将ID {hero.heroId} 属性信息 {propertyStrForDebug}");
#endif
        return tmpAttrs;
    }
Main/Utility/GlobalTimeEvent.cs
@@ -6,7 +6,7 @@
public class GlobalTimeEvent : SingletonMonobehaviour<GlobalTimeEvent>
{
    public event Action MS100Event;
    public event Action MSEvent; // 每50ms
    public event Action secondEvent;
    public event Action fiveSecondEvent;
    public event Action minuteEvent;
@@ -34,11 +34,11 @@
    private void Update()
    {
        var ms = Time.time;
        if (ms - msBuf >= 0.1f)
        if (ms - msBuf >= 0.05f)
        {
            if (MS100Event != null)
            if (MSEvent != null)
            {
                MS100Event();
                MSEvent();
            }
            msBuf = ms;
        }
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>
    /// 解析并计算数学表达式
    /// 解析并计算数学表达式(优化版本,减少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));
    }
}