Skip to content

Prevent some unnecessary window invalidations #24433

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

Merged

Conversation

mixiate
Copy link
Contributor

@mixiate mixiate commented May 17, 2025

This prevents some unnecessary window invalidations.

  • Removes two unnecessary OnResize calls. One was called on every window every frame, the other on every window with a viewport every frame. OnResize is now called only when the window changes size. This prevents many pointless window updates, including several that always invalidated and recreated viewports. Some windows unintentionally relied on these calls so some things had to be fixed at the same time.
  • The ride construction window had all of it's widget enabling and disabling in the OnResize function for some reason, and it only worked correctly because it happened to be called elsewhere on every frame. You can see it glitch on the first frame of opening.
  • Scenery window invalidated every frame. This also fixes a glitch on the first frame that the window was opened due to it setting the height to 0 on open. It relied on one of those OnResize calls at the end of the frame to fix it.
  • New ride window invalidated every frame.
  • Clear scenery, water and land tools invalidated every frame due to a function that invalidated every window with toggleable buttons. The clear scenery window was overriding Invalidate so it didn't work properly. That function was supposed to be an OnPrepareDraw call, like the other tool windows that contain equivalent code.
  • Ride window was invalidated constantly by the ride ratings, I changed it to only invalidate the ratings tab when it was necessary to do so.
  • The inventions window always invalidated the whole window. It already seems to invalidate correctly otherwise so I removed that.
  • The park entrance window main tab no longer invalidates every frame.
  • The extra viewport no longer invalidates every frame. This also fixes underground view not working with it, and a problem with the initial window size that was later fixed in the OnResize call.
  • This also fixes an issue with viewport invalidation offsetting the position every loop iteration. Most windows with viewports invalidated every frame but you could see invalidation issues on the guest and staff windows for example.
  • The path window doesn't invalidate every frame in land mode.

I've done my best to make sure that this doesn't break anything, but it could do with some extra testing. The majority of windows were already invalidating their elements properly, but then invalidate was mistakenly called every frame and made it all pointless.

@ZehMatt ZehMatt added the testing required PR needs to be tested before it is merged. label May 17, 2025
@mixiate mixiate marked this pull request as draft May 18, 2025 04:53
@mixiate mixiate force-pushed the prevent-unnecessary-window-invalidations branch from 6113774 to d1c660e Compare May 18, 2025 05:42
@mixiate mixiate marked this pull request as ready for review May 18, 2025 06:09
@Gymnasiast Gymnasiast requested a review from AaronVanGeffen May 18, 2025 09:35
Copy link
Member

@AaronVanGeffen AaronVanGeffen left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

From code review, these all look like really nice cleanups. Great work!

I'd like to test each of the windows involved before we merge this, but can't do so right now.

Copy link
Member

@AaronVanGeffen AaronVanGeffen left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The scenery window appears to no longer fully update its scrollbar when switching between its expanded and collapsed states. This leads to an unexpected small scrollbar 'thumb' in the expanded state (when more content is being shown).

Tested windows

  • ClearScenery
  • EditorInventionsList
  • NewRide
  • Park
  • Ride
  • RideConstruction
  • Scenery
  • Staff
  • Viewport

@mixiate
Copy link
Contributor Author

mixiate commented May 18, 2025

The scenery window scroll bar should be fixed, it now calls the same things when changing size that OnResize used to be calling.

Copy link
Member

@tupaschoal tupaschoal left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I did some very light testing and found no issues. I added some comments.
Very nice investigation work in any case

@@ -107,14 +107,11 @@ namespace OpenRCT2::Ui::Windows
if (mainWindow == nullptr)
return;

if (viewport != nullptr && viewport->flags != mainWindow->viewport->flags)
if (viewport != nullptr && viewport->flags != (mainWindow->viewport->flags | VIEWPORT_FLAG_INDEPEDENT_ROTATION))
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

When this is merged we should create a good first issue to have someone fix the typo on INDEPEDENT

Copy link
Member

@ZehMatt ZehMatt left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tested and good on my end, also nice code cleanup.

Copy link
Member

@AaronVanGeffen AaronVanGeffen left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All looks good to me. Nice work!

Tested windows

  • ClearScenery
  • EditorInventionsList
  • Footpath
  • NewRide
  • Park
  • Ride
  • RideConstruction
  • Scenery
  • Staff
  • Viewport

@AaronVanGeffen AaronVanGeffen removed the testing required PR needs to be tested before it is merged. label May 22, 2025
@ZehMatt ZehMatt added this to the v0.4.23 milestone May 22, 2025
@ZehMatt ZehMatt added the changelog This issue/PR deserves a changelog entry. label May 22, 2025
@mixiate mixiate force-pushed the prevent-unnecessary-window-invalidations branch from c042e28 to c394712 Compare May 22, 2025 20:07
@ZehMatt ZehMatt enabled auto-merge May 22, 2025 20:10
@ZehMatt ZehMatt merged commit d56dbb6 into OpenRCT2:develop May 22, 2025
23 checks passed
tupaschoal added a commit that referenced this pull request Jun 7, 2025
- Feature: [#22476] “Time since last inspection” statistic is available in the rides window.
- Feature: [#24313] [Plugin] Add API for setting a ride vehicle’s sprite to a smoke plume.
- Improved: [#24345] Vehicle fallback sprites are less likely to glitch with the track.
- Improved: [#24362, #24491] The Windows installer is now translated as well.
- Improved: [#24364] Improve the fallback vehicle sprites for Zero G Rolls, and allow small ones to be built without cheats if the fallbacks are available.
- Improved: [#24368] Clicking the in-game update notication now leads to a more user-friendly download page.
- Improved: [#24400] Ride list in preservation window is now sorted alphabetically.
- Improved: [#24409] Steam installs of RCT Classic are now detected automatically.
- Improved: [#24413] Better performance when moving the viewport on Windows and Linux platforms.
- Improved: [#24417] Improve the fallback vehicle sprites for Dive Loops.
- Improved: [#24433] The ride, new ride, scenery, path, viewport, park and tool windows no longer redraw every frame if they have not changed.
- Improved: [#24467] Apply tweening only to on-screen entities when not zoomed out for better performance with uncapped FPS.
- Improved: [#24474] More efficiently search viewports when playing Audio.
- Improved: [#24479] More descriptive error messages for `set` commands in the in-game console.
- Improved: [#24563] The Linux .desktop file will now request the more powerful dedicated GPU on hybrid graphics systems.
- Change: [#24342, #24484] g2.dat is now split into g2.dat, fonts.dat and tracks.dat.
- Change: [#24362] The Windows installer now prevents installing to the same folder as RollerCoaster Tycoon 2 or Classic.
- Change: [#24418] Small & Large Zero G Rolls can now be built on the LIM Launched RC without cheats if vehicle sprites are available.
- Fix: [#5269] Font bugs when using the Russian release of RCT2 as the base game.
- Fix: [#11071, #22958] The virtual floor does not always draw correctly.
- Fix: [#18220] Some custom RCT1 scenarios are detected as competition DLC scenarios.
- Fix: [#20095] UCES Halloween - Cemetery Ridge scenario has mismatched entrance/exit on haunted house.
- Fix: [#20158] Custom animated scenery .DATs with frame offsets draw a random sprite at the end of their animation.
- Fix: [#22628] Potential crash while rebuilding the scenario index.
- Fix: [#23289] Dodgems and Flying Saucer cars can spawn on top of each other when the ride is opened.
- Fix: [#24332] Banner font renders differently when using RCT Classic as the base game.
- Fix: [#24343] Large gently sloped turns are buildable without cheats when the vehicles do not have sprites for them.
- Fix: [#24346] Possible crash during line drawing in OpenGL mode.
- Fix: [#24353] ‘Show dirty visuals’ is off by one pixel and does not work correctly with higher framerates.
- Fix: [#24362] When upgrading from an older version on Windows, old versions of official objects are not always removed.
- Fix: [#24366] Zero G Rolls have some incorrect vehicle yaw rotations.
- Fix: [#24371] Fix divide by zero in the scenery window when there is no scenery.
- Fix: [#24378] Prevent ride and stall statistics from overflowing.
- Fix: [#24388] Shortcut keys are not localised based on the user’s language settings.
- Fix: [#24403] Park fences draw underneath and through opaque water.
- Fix: [#24406] The network status window uses an undefined string for its title.
- Fix: [#24444] In the object load error window, the guide text overlaps when the title bar is enlarged.
- Fix: [#24446] [Plugin] Fix regression breaking the track iterator on specific track pieces.
- Fix: [#24447] Shortcut list is not refreshed when changing language.
- Fix: [#24448] Shortcuts involving the Caps Lock key are wrongly localised to NumPad Dot.
- Fix: [#24464] Window and viewport visibility is not calculated correctly causing minor performance issues.
- Fix: [#24488] Objects are not always redrawn immediately when they are reloaded from the Object Selection window.
- Fix: [#24544] RCT1 Maze designs with wooden walls are not imported correctly.
- Fix: [#24567] Long flat-to-steep wooden mine support sprites don't connect to flat supports exactly.
tupaschoal added a commit that referenced this pull request Jun 7, 2025
- Feature: [#22476] “Time since last inspection” statistic is available in the rides window.
- Feature: [#24313] [Plugin] Add API for setting a ride vehicle’s sprite to a smoke plume.
- Improved: [#24345] Vehicle fallback sprites are less likely to glitch with the track.
- Improved: [#24362, #24491] The Windows installer is now translated as well.
- Improved: [#24364] Improve the fallback vehicle sprites for Zero G Rolls, and allow small ones to be built without cheats if the fallbacks are available.
- Improved: [#24368] Clicking the in-game update notication now leads to a more user-friendly download page.
- Improved: [#24400] Ride list in preservation window is now sorted alphabetically.
- Improved: [#24409] Steam installs of RCT Classic are now detected automatically.
- Improved: [#24413] Better performance when moving the viewport on Windows and Linux platforms.
- Improved: [#24417] Improve the fallback vehicle sprites for Dive Loops.
- Improved: [#24433] The ride, new ride, scenery, path, viewport, park and tool windows no longer redraw every frame if they have not changed.
- Improved: [#24467] Apply tweening only to on-screen entities when not zoomed out for better performance with uncapped FPS.
- Improved: [#24474] More efficiently search viewports when playing Audio.
- Improved: [#24479] More descriptive error messages for `set` commands in the in-game console.
- Improved: [#24563] The Linux .desktop file will now request the more powerful dedicated GPU on hybrid graphics systems.
- Change: [#24342, #24484] g2.dat is now split into g2.dat, fonts.dat and tracks.dat.
- Change: [#24362] The Windows installer now prevents installing to the same folder as RollerCoaster Tycoon 2 or Classic.
- Change: [#24418] Small & Large Zero G Rolls can now be built on the LIM Launched RC without cheats if vehicle sprites are available.
- Fix: [#5269] Font bugs when using the Russian release of RCT2 as the base game.
- Fix: [#11071, #22958] The virtual floor does not always draw correctly.
- Fix: [#18220] Some custom RCT1 scenarios are detected as competition DLC scenarios.
- Fix: [#20095] UCES Halloween - Cemetery Ridge scenario has mismatched entrance/exit on haunted house.
- Fix: [#20158] Custom animated scenery .DATs with frame offsets draw a random sprite at the end of their animation.
- Fix: [#22628] Potential crash while rebuilding the scenario index.
- Fix: [#23289] Dodgems and Flying Saucer cars can spawn on top of each other when the ride is opened.
- Fix: [#24332] Banner font renders differently when using RCT Classic as the base game.
- Fix: [#24343] Large gently sloped turns are buildable without cheats when the vehicles do not have sprites for them.
- Fix: [#24346] Possible crash during line drawing in OpenGL mode.
- Fix: [#24353] ‘Show dirty visuals’ is off by one pixel and does not work correctly with higher framerates.
- Fix: [#24362] When upgrading from an older version on Windows, old versions of official objects are not always removed.
- Fix: [#24366] Zero G Rolls have some incorrect vehicle yaw rotations.
- Fix: [#24371] Fix divide by zero in the scenery window when there is no scenery.
- Fix: [#24378] Prevent ride and stall statistics from overflowing.
- Fix: [#24388] Shortcut keys are not localised based on the user’s language settings.
- Fix: [#24403] Park fences draw underneath and through opaque water.
- Fix: [#24406] The network status window uses an undefined string for its title.
- Fix: [#24444] In the object load error window, the guide text overlaps when the title bar is enlarged.
- Fix: [#24446] [Plugin] Fix regression breaking the track iterator on specific track pieces.
- Fix: [#24447] Shortcut list is not refreshed when changing language.
- Fix: [#24448] Shortcuts involving the Caps Lock key are wrongly localised to NumPad Dot.
- Fix: [#24464] Window and viewport visibility is not calculated correctly causing minor performance issues.
- Fix: [#24488] Objects are not always redrawn immediately when they are reloaded from the Object Selection window.
- Fix: [#24544] RCT1 Maze designs with wooden walls are not imported correctly.
- Fix: [#24567] Long flat-to-steep wooden mine support sprites don't connect to flat supports exactly.
CorySanin added a commit to CorySanin/OpenRCT2 that referenced this pull request Jun 22, 2025
v0.4.23

Release v0.4.23

- Feature: [OpenRCT2#22476] “Time since last inspection” statistic is available in the rides window.
- Feature: [OpenRCT2#24313] [Plugin] Add API for setting a ride vehicle’s sprite to a smoke plume.
- Improved: [OpenRCT2#24345] Vehicle fallback sprites are less likely to glitch with the track.
- Improved: [OpenRCT2#24362, OpenRCT2#24491] The Windows installer is now translated as well.
- Improved: [OpenRCT2#24364] Improve the fallback vehicle sprites for Zero G Rolls, and allow small ones to be built without cheats if the fallbacks are available.
- Improved: [OpenRCT2#24368] Clicking the in-game update notication now leads to a more user-friendly download page.
- Improved: [OpenRCT2#24400] Ride list in preservation window is now sorted alphabetically.
- Improved: [OpenRCT2#24409] Steam installs of RCT Classic are now detected automatically.
- Improved: [OpenRCT2#24413] Better performance when moving the viewport on Windows and Linux platforms.
- Improved: [OpenRCT2#24417] Improve the fallback vehicle sprites for Dive Loops.
- Improved: [OpenRCT2#24433] The ride, new ride, scenery, path, viewport, park and tool windows no longer redraw every frame if they have not changed.
- Improved: [OpenRCT2#24467] Apply tweening only to on-screen entities when not zoomed out for better performance with uncapped FPS.
- Improved: [OpenRCT2#24474] More efficiently search viewports when playing Audio.
- Improved: [OpenRCT2#24479] More descriptive error messages for `set` commands in the in-game console.
- Improved: [OpenRCT2#24563] The Linux .desktop file will now request the more powerful dedicated GPU on hybrid graphics systems.
- Change: [OpenRCT2#24342, OpenRCT2#24484] g2.dat is now split into g2.dat, fonts.dat and tracks.dat.
- Change: [OpenRCT2#24362] The Windows installer now prevents installing to the same folder as RollerCoaster Tycoon 2 or Classic.
- Change: [OpenRCT2#24418] Small & Large Zero G Rolls can now be built on the LIM Launched RC without cheats if vehicle sprites are available.
- Fix: [OpenRCT2#5269] Font bugs when using the Russian release of RCT2 as the base game.
- Fix: [OpenRCT2#11071, OpenRCT2#22958] The virtual floor does not always draw correctly.
- Fix: [OpenRCT2#18220] Some custom RCT1 scenarios are detected as competition DLC scenarios.
- Fix: [OpenRCT2#20095] UCES Halloween - Cemetery Ridge scenario has mismatched entrance/exit on haunted house.
- Fix: [OpenRCT2#20158] Custom animated scenery .DATs with frame offsets draw a random sprite at the end of their animation.
- Fix: [OpenRCT2#22628] Potential crash while rebuilding the scenario index.
- Fix: [OpenRCT2#23289] Dodgems and Flying Saucer cars can spawn on top of each other when the ride is opened.
- Fix: [OpenRCT2#24332] Banner font renders differently when using RCT Classic as the base game.
- Fix: [OpenRCT2#24343] Large gently sloped turns are buildable without cheats when the vehicles do not have sprites for them.
- Fix: [OpenRCT2#24346] Possible crash during line drawing in OpenGL mode.
- Fix: [OpenRCT2#24353] ‘Show dirty visuals’ is off by one pixel and does not work correctly with higher framerates.
- Fix: [OpenRCT2#24362] When upgrading from an older version on Windows, old versions of official objects are not always removed.
- Fix: [OpenRCT2#24366] Zero G Rolls have some incorrect vehicle yaw rotations.
- Fix: [OpenRCT2#24371] Fix divide by zero in the scenery window when there is no scenery.
- Fix: [OpenRCT2#24378] Prevent ride and stall statistics from overflowing.
- Fix: [OpenRCT2#24388] Shortcut keys are not localised based on the user’s language settings.
- Fix: [OpenRCT2#24403] Park fences draw underneath and through opaque water.
- Fix: [OpenRCT2#24406] The network status window uses an undefined string for its title.
- Fix: [OpenRCT2#24444] In the object load error window, the guide text overlaps when the title bar is enlarged.
- Fix: [OpenRCT2#24446] [Plugin] Fix regression breaking the track iterator on specific track pieces.
- Fix: [OpenRCT2#24447] Shortcut list is not refreshed when changing language.
- Fix: [OpenRCT2#24448] Shortcuts involving the Caps Lock key are wrongly localised to NumPad Dot.
- Fix: [OpenRCT2#24464] Window and viewport visibility is not calculated correctly causing minor performance issues.
- Fix: [OpenRCT2#24488] Objects are not always redrawn immediately when they are reloaded from the Object Selection window.
- Fix: [OpenRCT2#24544] RCT1 Maze designs with wooden walls are not imported correctly.
- Fix: [OpenRCT2#24567] Long flat-to-steep wooden mine support sprites don't connect to flat supports exactly.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
changelog This issue/PR deserves a changelog entry.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants