Temporary Fix, cuz I've not much time. This should work for all the people having problems. Below zip file contains: Latest Tyrael Latest STABLE HB MAD with 523 references, v1.1.8 Updated & Fixed bgbuddy & lag. Should work fine, if not report back
So using that version above, with Tyrael @ 200TPS (no framelock), and MAD's framelock turned on, it's still the same. [AsyncKey] RotationSelector takes 25216 ms and 37 ms client lag 32:369 - HP: 100% - Mana: 100% - Druid - 0y - 100% hp - Swiftmend [CGSpellBook::CastSpell] Override ID: 18562, KnownIndex: 66 46:306 - HP: 100% - Mana: 100% - Paladin - 19y - 100% hp - Rejuvenation [CGSpellBook::CastSpell] Override ID: 774, KnownIndex: 61 [AsyncKey] RotationSelector takes 31482 ms and 37 ms client lag .. When I stop the bot after it seems to hang, it gives this error; Exception in TraceLine:Thread was being aborted. - at System.Threading.WaitHandle.WaitOneNative(SafeHandle waitableSafeHandle, UInt32 millisecondsTimeout, Boolean hasThreadAffinity, Boolean exitContext) at System.Threading.WaitHandle.InternalWaitOne(SafeHandle waitableSafeHandle, Int64 millisecondsTimeout, Boolean hasThreadAffinity, Boolean exitContext) at System.Threading.WaitHandle.WaitOne(Int32 millisecondsTimeout, Boolean exitContext) at Styx.MemoryManagement.Executor.Execute(Int32 fromId) at Styx.WoWInternals.World.GameWorld.(WoWPoint , WoWPoint , Single , CGWorldFrameHitFlags , WoWPoint& ) - mscorlib .. With Tyrael framelock on; [AsyncKey] RotationSelector takes 1021 ms and 39 ms client lag. Out of combat; [AsyncKey] RotationSelector takes 599 ms and 38 ms client lag [AsyncKey] RotationSelector takes 605 ms and 38 ms client lag [AsyncKey] RotationSelector takes 643 ms and 38 ms client lag
nothing seems to work for me as well, doing terrace LFR atm and... Well yeah, everything just seems broken no matter how I set it up going back to 1.0.5
Nope, it's the same, casts the odd heal every so often, but like once per 10-30 seconds when Tyrael's framelock isn't enabled.
So it seems that a lot of people have problems with the new release. Tomorrow i'll run a comparison between v1.1.8 and 1.05 and merge them. My sincere apologies, I suggest reverting back to a earlier working version for use untill then. Kind regards, Mirabis
i have the 1.0.5 and ill upload it as im having the same problems - tried diffrent versions but heals are somehow NOT as good as the 1.0.5! it works best, stable, in raids/dungeons! tho pvp isnt good at all in old 1.0.5 .. so im hoping for a mix of the old MAD and 1.0.5 with pvp support in future version/s Keep up the good work Mirabis!
can you tell witch svn number version 1.05 could be ? if i update now it tells me 131 EDIT, ah found it > 57
I've been debbuging 1.1.8 all day. I ran a profiler (dotTrace) on HB and now understand what is happening. Lags in HealRotationComp come from using IEnumerable. Since it's lazily evaluated, the where clauses are calculated about a zillion times in iteration heavy functions like the "Clusters" ones (instead of being evaluated once before calling them). If I just add toList() before passing unit lists to any Clusters function and wrap the rotation part in a framelock, it runs at a steady 50ms (in 25 players raid, instead of 2 secs). I think it shouldn't be too hard to get under 20ms, and keep a high framerate for high playability. In AcquireTargets, MAD.Healable seems pretty slow, so I pre-calculate the unit list before passing it to GetHealTarget, GetCleanseAsapTarget, etc... NearbyUnFriendlyUnits is recalulated for each player => I calculate it once at the begining. I disabled TargetIsHealer, TargetIsTank because these where also slow. With these changes AcquireTargets takes 200ms, down from 600ms. Buidling initial player list => 60ms GetHealTarget => 80ms DispellASAP => 50ms I didn't investigate targeting performance further, but i guess it's also some IEnumerable unit lists that are evaluated many times per rotation. I can still perceive downtime between spells, but it's not as bad as before. That's all for tonight !
Skype chat a few days ago I was already testing and doing so , the last 3 days. I've ran DoTtrace myself multiple times and found that my IsPartyOrRaidMember /IsTank / IsHealer/ IsEnemy/ Pet Healing were slow and i was double checking so much stuff. Have secretly been working on a populate lists-> divide -> pull from that method If ur interested in pulling those changes into the release, add me on skype we'll get it rolling. I guess this is what u meant: PHP: #region GetUnits public static List<WoWPlayer> NearbyPartyPlayers = new List<WoWPlayer>(); public static List<WoWUnit> NearbyPartyUnits = new List<WoWUnit>(); public static List<WoWUnit> NearbyUnFriendlyUnits = new List<WoWUnit>(); public static List<WoWPlayer> NearbyUnFriendlyPlayers = new List<WoWPlayer>(); public static List<WoWUnit> NearbyUnits = new List<WoWUnit>(); public static List<WoWPlayer> NearbyPlayers = new List<WoWPlayer>(); public static Composite FillInitialList { get { return new Action(delegate { //Clear Lists NearbyPartyPlayers.Clear(); NearbyPartyUnits.Clear(); NearbyUnFriendlyUnits.Clear(); NearbyUnFriendlyPlayers.Clear(); NearbyUnits.Clear(); NearbyPlayers.Clear(); IEnumerable<WoWUnit> units = ObjectManager.GetObjectsOfType<WoWUnit>(true, true).Where( p => (ValidUnit(p) && !Blacklist.Contains(p.Guid,BlacklistFlags.All) && p.DistanceSqr <= 40 * 40)); if (!MADSettings2.Instance.EnableFramelock) { foreach (WoWUnit unit in units) { //Just fill NearbyUnits.Add(unit); //Only Enemies if (IsEnemy(unit)) { //Enemy Units NearbyUnFriendlyUnits.Add(unit); //Cast to WoWPlayer var player = unit.ToPlayer(); if (player == null) continue; //Add to Players NearbyUnFriendlyPlayers.Add(player); NearbyPlayers.Add(player); } //If Not enemy, only take party members else if (IsMyPartyRaidMember(unit)) { //Pets & Players in party NearbyPartyUnits.Add(unit); var player = unit.ToPlayer(); if (player == null) continue; //Players in party NearbyPartyPlayers.Add(player); NearbyPlayers.Add(player); } } } else using (StyxWoW.Memory.AcquireFrame()) { foreach (WoWUnit unit in units) { //Just fill NearbyUnits.Add(unit); //Only Enemies if (IsEnemy(unit)) { //Enemy Units NearbyUnFriendlyUnits.Add(unit); //Cast to WoWPlayer var player = unit.ToPlayer(); if (player == null) continue; //Add to Players NearbyUnFriendlyPlayers.Add(player); } //If Not enemy, only take party members else if (IsMyPartyRaidMember(unit)) { //Pets & Players in party NearbyPartyUnits.Add(unit); var player = unit.ToPlayer(); if (player == null) continue; //Players in party NearbyPartyPlayers.Add(player); } } } return RunStatus.Failure; }); } } If so, it'll be released somewhere tomorrrow mid day after i'm done testing etc. Ty for ur input tho Dungeon: Code: [/B][TreePerformance] Elapsed Time to traverse RotationSelector: 118 ms (19 ms client lag) More info tomorrow on progress, t's 05:11 I'm going too bed...
I'm leaving until new year's eve, so I won't be too much help. For me, adding toList() before passing unit list to clustering functions yields the biggest improvement. I also removed some calls that I believe are duplicate. See View attachment MADCombat.cs . Here is a timing recap from 25 player raiding: Execution time for each part of targeting, List is kinda like your FillInitialList function Execution time from the begining of PVE rotation Now, according to the dotTrace logs, the most time eating functions are the numerous calls to GetAllAuras, through GetDebuffs etc... Every time HB does a ReadProcessMemory. I don't know how hard it would to cache auras for all players at the begining of the rotation. Well, finally getting the CC to queue spells before the GCD expires would be nice ps: What is your kype ?
Miraveux. I took a look into ur edited version, like ur way u printElapsed for speed checks ;p Never actually gave it a try to bench every spell itself to see hoggers ;/