Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Combine Shroud.(Add|Remove)Source into UpdateSource #21403

Open
anvilvapre opened this issue Apr 14, 2024 · 2 comments
Open

Combine Shroud.(Add|Remove)Source into UpdateSource #21403

anvilvapre opened this issue Apr 14, 2024 · 2 comments

Comments

@anvilvapre
Copy link
Contributor

anvilvapre commented Apr 14, 2024

Profiling shows that rougly 2-3% of time is spent updating Shroud. They are hotspots next to running move activitied.

RemoveSource and AddSource and are typically called in sequence. Remove removes the source from a hashmap and Add directly adds it again after.

Proposal to add UpdateSourceCells method in AffectsShroud and similar traits to take advantage of this method.

Benefit:

  • No unnessarry checking/adding/removing of sources from the internal shroud hash map for each player shroud for each moved source.

Some profile results of a 16x16 replay:

         - 77.62% void [OpenRA.Game] OpenRA.Game::LogicTick()[OptimizedTier1]                                                                                 ▒
            - 77.61% void [OpenRA.Game] OpenRA.Game::InnerLogicTick(class OpenRA.Network.OrderManager)[OptimizedTier1]                                        ▒
               - 68.70% instance void [OpenRA.Game] OpenRA.World::Tick()[Optimized]                                                                           ▒
                  - 33.01% instance void [OpenRA.Game] OpenRA.Actor::Tick()[Optimized]                                                                        ▒
                     - 28.11% class OpenRA.Activities.Activity [OpenRA.Game] OpenRA.Traits.ActivityUtils::RunActivity(class OpenRA.Actor,class OpenRA.Activiti▒
                        - 28.05% instance class OpenRA.Activities.Activity [OpenRA.Game] OpenRA.Activities.Activity::TickOuter(class OpenRA.Actor)[OptimizedTi▒
                           - 11.04% instance bool [OpenRA.Game] OpenRA.Activities.Activity::TickChild(class OpenRA.Actor)[OptimizedTier1]                     ▒
                              - 10.96% class OpenRA.Activities.Activity [OpenRA.Game] OpenRA.Traits.ActivityUtils::RunActivity(class OpenRA.Actor,class OpenRA▒
                                 - 10.94% instance class OpenRA.Activities.Activity [OpenRA.Game] OpenRA.Activities.Activity::TickOuter(class OpenRA.Actor)[Op▒
                                    - 7.90% instance bool [OpenRA.Game] OpenRA.Activities.Activity::TickChild(class OpenRA.Actor)[OptimizedTier1]             ▒
                                       - 7.87% class OpenRA.Activities.Activity [OpenRA.Game] OpenRA.Traits.ActivityUtils::RunActivity(class OpenRA.Actor,clas▒
                                          - 7.84% instance class OpenRA.Activities.Activity [OpenRA.Game] OpenRA.Activities.Activity::TickOuter(class OpenRA.A▒
                                             - 3.40% instance bool [OpenRA.Game] OpenRA.Activities.Activity::TickChild(class OpenRA.Actor)[OptimizedTier1]    ▒
                                                - 3.38% class OpenRA.Activities.Activity [OpenRA.Game] OpenRA.Traits.ActivityUtils::RunActivity(class OpenRA.A▒
                                                   - 3.37% instance class OpenRA.Activities.Activity [OpenRA.Game] OpenRA.Activities.Activity::TickOuter(class▒
                                                      - 3.14% instance bool [OpenRA.Mods.Common] OpenRA.Mods.Common.Activities.Move+MovePart::Tick(class [Open▒
                                                         - 2.54% instance void [OpenRA.Mods.Common] OpenRA.Mods.Common.Traits.Mobile::SetCenterPosition(class ▒
                                                            - 2.44% instance void [OpenRA.Mods.Common] OpenRA.Mods.Common.Traits.AffectsShroud::OpenRA.Mods.Co▒
->                                                               - 2.37% instance void [OpenRA.Mods.Common] OpenRA.Mods.Common.Traits.AffectsShroud::UpdateShrou▒
                                                                    1.10% instance void [OpenRA.Game] OpenRA.Traits.Shroud::RemoveSource(object)[Optimized]   ▒
                                                                  + 0.65% instance valuetype [OpenRA.Game]OpenRA.PPos[] [OpenRA.Mods.Common] OpenRA.Mods.Commo▒
                                                                    0.56% instance void [OpenRA.Game] OpenRA.Traits.Shroud::AddSource(object,valuetype OpenRA.▒
                                             + 3.01% instance bool [OpenRA.Mods.Common] OpenRA.Mods.Common.Activities.MoveOntoAndTurn::Tick(class [OpenRA.Game▒
                                             + 0.72% instance bool [OpenRA.Mods.Common] OpenRA.Mods.Common.Activities.Fly::Tick(class [OpenRA.Game]OpenRA.Acto▒
                                    - 1.24% instance bool [OpenRA.Mods.Common] OpenRA.Mods.Common.Activities.Move+MovePart::Tick(class [OpenRA.Game]OpenRA.Act▒
                                       - 1.05% instance void [OpenRA.Mods.Common] OpenRA.Mods.Common.Traits.Mobile::SetCenterPosition(class [OpenRA.Game]OpenR▒
                                          - 1.00% instance void [OpenRA.Mods.Common] OpenRA.Mods.Common.Traits.AffectsShroud::OpenRA.Mods.Common.Traits.INotif▒
                                               0.98% instance void [OpenRA.Mods.Common] OpenRA.Mods.Common.Traits.AffectsShroud::UpdateShroudCells(class [Open▒
                                    - 0.88% instance bool [OpenRA.Mods.Common] OpenRA.Mods.Common.Activities.MoveAdjacentTo::Tick(class [OpenRA.Game]OpenRA.Ac▒
                                       - 0.80% instance bool [OpenRA.Game] OpenRA.Activities.Activity::TickChild(class OpenRA.Actor)[OptimizedTier1]          ▒
                                          - 0.80% class OpenRA.Activities.Activity [OpenRA.Game] OpenRA.Traits.ActivityUtils::RunActivity(class OpenRA.Actor,c▒
                                               0.80% instance class OpenRA.Activities.Activity [OpenRA.Game] OpenRA.Activities.Activity::TickOuter(class OpenR▒
                           - 9.42% instance bool [OpenRA.Mods.Common] OpenRA.Mods.Common.Activities.AttackMoveActivity::Tick(class [OpenRA.Game]OpenRA.Actor)[▒
                              - 7.40% instance bool [OpenRA.Game] OpenRA.Activities.Activity::TickChild(class OpenRA.Actor)[OptimizedTier1]                   ▒
                                 - 7.39% class OpenRA.Activities.Activity [OpenRA.Game] OpenRA.Traits.ActivityUtils::RunActivity(class OpenRA.Actor,class Open▒
                                    - 7.36% instance class OpenRA.Activities.Activity [OpenRA.Game] OpenRA.Activities.Activity::TickOuter(class OpenRA.Actor)[▒
                                       - 4.79% instance bool [OpenRA.Game] OpenRA.Activities.Activity::TickChild(class OpenRA.Actor)[OptimizedTier1]          ▒
                                          - 4.76% class OpenRA.Activities.Activity [OpenRA.Game] OpenRA.Traits.ActivityUtils::RunActivity(class OpenRA.Actor,c▒
                                             - 4.75% instance class OpenRA.Activities.Activity [OpenRA.Game] OpenRA.Activities.Activity::TickOuter(class OpenR▒
                                                - 3.86% instance bool [OpenRA.Mods.Common] OpenRA.Mods.Common.Activities.Move+MovePart::Tick(class [OpenRA.Gam▒
                                                   - 3.12% instance void [OpenRA.Mods.Common] OpenRA.Mods.Common.Traits.Mobile::SetCenterPosition(class [OpenR▒
                                                      - 2.97% instance void [OpenRA.Mods.Common] OpenRA.Mods.Common.Traits.AffectsShroud::OpenRA.Mods.Common.T▒
                                                         - 2.90% instance void [OpenRA.Mods.Common] OpenRA.Mods.Common.Traits.AffectsShroud::UpdateShroudCells▒
->                                                              1.34% instance void [OpenRA.Game] OpenRA.Traits.Shroud::RemoveSource(object)[Optimized]
@abcdefg30
Copy link
Member

The source should only be removed and re-added when the position of the actor changes (afaik we already do that), and in that case we do need to since the revealed area changes.

@anvilvapre
Copy link
Contributor Author

Here it doesn't. Results in full removal and addition.

RemoveCellsFromPlayerShroud(self, p);
AddCellsToPlayerShroud(self, p, cells);

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

No branches or pull requests

2 participants