Skip to content

Games: Entities: GetProcProperties: Early exit if source has no proc properties#200

Open
luigi311 wants to merge 1 commit intoCrypto137:masterfrom
luigi311:get_proc_properties_early
Open

Games: Entities: GetProcProperties: Early exit if source has no proc properties#200
luigi311 wants to merge 1 commit intoCrypto137:masterfrom
luigi311:get_proc_properties_early

Conversation

@luigi311
Copy link
Copy Markdown

@luigi311 luigi311 commented Apr 3, 2026

Adds early exit condition on GetProcProperties to reduce property copies when there is no need. this was tested by going through the opening missions on two new accounts up until you get the xp orb from ultron.

Samples Before

GetProcProperties: 353060486 / 2.53406e+10 samples = 1.39%

  -- Callers (who calls GetProcProperties) --
  110391085  instance void [MHServerEmu.Games] MHServerEmu.Games.Entities.WorldEntity::TryActivateOnHitProcs
  44401259  instance void [MHServerEmu.Games] MHServerEmu.Games.Entities.WorldEntity::TryActivateOnPowerUseProcs
  37007696  instance void [MHServerEmu.Games] MHServerEmu.Games.Entities.WorldEntity::TryActivateOnOverlapBeginProcs
  34467937  instance void [MHServerEmu.Games] MHServerEmu.Games.Entities.WorldEntity::TryActivateOnGotDamagedProcs
  19813077  instance void [MHServerEmu.Games] MHServerEmu.Games.Entities.WorldEntity::TryActivateOnCollideProcs
  16168543  instance bool [MHServerEmu.Games] MHServerEmu.Games.Entities.WorldEntity::TryActivateOnHealthProcs
  15664152  instance void [MHServerEmu.Games] MHServerEmu.Games.Entities.WorldEntity::TryActivateOnEnduranceProcs
  15344306  instance void [MHServerEmu.Games] MHServerEmu.Games.Entities.WorldEntity::TryActivateOnGotAttackedProcs
  13125695  instance bool [MHServerEmu.Games] MHServerEmu.Games.Entities.WorldEntity::UpdateProcEffectPowers
  13109834  instance void [MHServerEmu.Games] MHServerEmu.Games.Entities.WorldEntity::TryActivateOnPetHitProcs
  11873254  instance void [MHServerEmu.Games] MHServerEmu.Games.Entities.WorldEntity::TryActivateOnMovementStartedProcs
   5527564  instance void [MHServerEmu.Games] MHServerEmu.Games.Entities.WorldEntity::TryActivateOnNegStatusAppliedProcs
   3880989  instance void [MHServerEmu.Games] MHServerEmu.Games.Entities.WorldEntity::TryActivateOnMovementStoppedProcs
   3865968  instance void [MHServerEmu.Games] MHServerEmu.Games.Entities.WorldEntity::TryActivateOnKillProcs
   2443843  instance void [MHServerEmu.Games] MHServerEmu.Games.Entities.WorldEntity::TryActivateOnConditionStackCountProcs
   1745078  instance void [MHServerEmu.Games] MHServerEmu.Games.Entities.WorldEntity::TryActivateOnOutCombatProcs
   1623083  instance void [MHServerEmu.Games] MHServerEmu.Games.Entities.WorldEntity::TryActivateOnConditionEndProcs
   1103501  instance void [MHServerEmu.Games] MHServerEmu.Games.Entities.WorldEntity::TryActivateOnInCombatProcs
    935855  instance bool [MHServerEmu.Games] MHServerEmu.Games.Entities.ConditionCollection::AddCondition
    567767  instance void [MHServerEmu.Games] MHServerEmu.Games.Entities.WorldEntity::TryActivateOnDeathProcs

Samples After

 GetProcProperties: 346457941 / 3.27409e+10 samples = 1.06%

  -- Callers (who calls GetProcProperties) --
  114940016  instance void [MHServerEmu.Games] MHServerEmu.Games.Entities.WorldEntity::TryActivateOnHitProcs
  44622421  instance void [MHServerEmu.Games] MHServerEmu.Games.Entities.WorldEntity::TryActivateOnPowerUseProcs
  33857202  instance void [MHServerEmu.Games] MHServerEmu.Games.Entities.WorldEntity::TryActivateOnOverlapBeginProcs
  28022373  instance void [MHServerEmu.Games] MHServerEmu.Games.Entities.WorldEntity::TryActivateOnGotDamagedProcs
  24976770  instance void [MHServerEmu.Games] MHServerEmu.Games.Entities.WorldEntity::TryActivateOnCollideProcs
  14851653  instance void [MHServerEmu.Games] MHServerEmu.Games.Entities.WorldEntity::TryActivateOnPetHitProcs
  13729236  instance void [MHServerEmu.Games] MHServerEmu.Games.Entities.WorldEntity::TryActivateOnMissileHitProcs
  13450991  instance void [MHServerEmu.Games] MHServerEmu.Games.Entities.WorldEntity::TryActivateOnEnduranceProcs
  12952874  instance bool [MHServerEmu.Games] MHServerEmu.Games.Entities.WorldEntity::UpdateProcEffectPowers
  11845630  instance bool [MHServerEmu.Games] MHServerEmu.Games.Entities.WorldEntity::TryActivateOnHealthProcs
  10074518  instance void [MHServerEmu.Games] MHServerEmu.Games.Entities.WorldEntity::TryActivateOnGotAttackedProcs
   7432259  instance void [MHServerEmu.Games] MHServerEmu.Games.Entities.WorldEntity::TryActivateOnMovementStoppedProcs
   4962673  instance void [MHServerEmu.Games] MHServerEmu.Games.Entities.WorldEntity::TryActivateOnConditionEndProcs
   4021968  instance void [MHServerEmu.Games] MHServerEmu.Games.Entities.WorldEntity::TryActivateOnMovementStartedProcs
   1900814  instance void [MHServerEmu.Games] MHServerEmu.Games.Entities.WorldEntity::TryActivateOnNegStatusAppliedProcs
   1429315  instance void [MHServerEmu.Games] MHServerEmu.Games.Entities.WorldEntity::TryActivateOnConditionStackCountProcs
   1408711  instance void [MHServerEmu.Games] MHServerEmu.Games.Entities.WorldEntity::TryActivateOnKillProcs
    832008  instance void [MHServerEmu.Games] MHServerEmu.Games.Entities.WorldEntity::TryActivateOnDeathProcs
    617880  instance void [MHServerEmu.Games] MHServerEmu.Games.Entities.Agent::OnOverlapBegin
    528629  instance void [MHServerEmu.Games] MHServerEmu.Games.Entities.WorldEntity::TryActivateOnInCombatProcs

…perties

Signed-off-by: Luis Garcia <git@luigi311.com>
@Crypto137
Copy link
Copy Markdown
Owner

ObjectPoolManager.Instance.Get() doesn't allocate new instances outside of the initial call for a game thread contrary to what the comment you added to GetProcProperties() says. With this in mind, the performance benefit of these changes become potentially not worth the extra complexity being introduced.

Please do a benchmark, ideally using BenchmarkDotNet, to demonstrate whether there is a meaningful performance benefit to these changes.

If there is evidence that these changes have a meaningful benefit worth the tradeoff, instead of introducing a HasPropertyInRange() method to PropertyCollection I would prefer to keep it all contained in GetProcProperties().

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants