From 371dcc28f5cce6cd2e1ce44959404a36a97b6280 Mon Sep 17 00:00:00 2001 From: Harry Hopkinson Date: Thu, 22 May 2025 21:04:14 +0100 Subject: [PATCH 1/3] More efficiently search viewports --- src/openrct2/audio/Audio.cpp | 5 +++-- src/openrct2/interface/Window.cpp | 12 ++++++++++++ src/openrct2/interface/Window.h | 1 + 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/openrct2/audio/Audio.cpp b/src/openrct2/audio/Audio.cpp index 9505c952ab..5badeb3ba9 100644 --- a/src/openrct2/audio/Audio.cpp +++ b/src/openrct2/audio/Audio.cpp @@ -159,8 +159,9 @@ namespace OpenRCT2::Audio uint8_t rotation = GetCurrentRotation(); auto pos2 = Translate3DTo2DWithZ(rotation, location); - Viewport* viewport = nullptr; - while ((viewport = WindowGetPreviousViewport(viewport)) != nullptr) + // Get all active viewports + auto viewports = WindowGetActiveViewports(); + for (auto* viewport : viewports) { if (viewport->flags & VIEWPORT_FLAG_SOUND_ON) { diff --git a/src/openrct2/interface/Window.cpp b/src/openrct2/interface/Window.cpp index e5892c29d2..68294e908c 100644 --- a/src/openrct2/interface/Window.cpp +++ b/src/openrct2/interface/Window.cpp @@ -916,6 +916,18 @@ static constexpr float kWindowScrollLocations[][2] = { }); } + std::vector WindowGetActiveViewports() + { + std::vector viewports; + WindowVisitEach([&viewports](WindowBase* w) { + if (w->viewport != nullptr && !(w->flags & WF_DEAD)) + { + viewports.push_back(w->viewport); + } + }); + return viewports; + } + Viewport* WindowGetPreviousViewport(Viewport* current) { bool foundPrevious = (current == nullptr); diff --git a/src/openrct2/interface/Window.h b/src/openrct2/interface/Window.h index 57ecd6b433..8e3bce33f6 100644 --- a/src/openrct2/interface/Window.h +++ b/src/openrct2/interface/Window.h @@ -333,6 +333,7 @@ namespace OpenRCT2 void TextinputCancel(); + std::vector WindowGetActiveViewports(); Viewport* WindowGetPreviousViewport(Viewport* current); void WindowInitAll(); From 994cc858e8319768c24a14e65fff477bbab49229 Mon Sep 17 00:00:00 2001 From: Harry Hopkinson Date: Fri, 23 May 2025 12:59:55 +0100 Subject: [PATCH 2/3] More efficiently search viewports for playing Audio --- distribution/changelog.txt | 1 + src/openrct2/audio/Audio.cpp | 15 +++++++-------- src/openrct2/interface/Viewport.cpp | 5 +++++ src/openrct2/interface/Viewport.h | 2 ++ src/openrct2/interface/Window.cpp | 12 ------------ src/openrct2/interface/Window.h | 1 - 6 files changed, 15 insertions(+), 21 deletions(-) diff --git a/distribution/changelog.txt b/distribution/changelog.txt index 13e45e81ab..b2142e1ed3 100644 --- a/distribution/changelog.txt +++ b/distribution/changelog.txt @@ -11,6 +11,7 @@ - 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. - Change: [#24342] g2.dat is now split into g2.dat and fonts.dat. - Change: [#24362] The Windows installer now prevents installing to the same folder as RollerCoaster Tycoon 2 or Classic. diff --git a/src/openrct2/audio/Audio.cpp b/src/openrct2/audio/Audio.cpp index 5badeb3ba9..fa6db36456 100644 --- a/src/openrct2/audio/Audio.cpp +++ b/src/openrct2/audio/Audio.cpp @@ -159,20 +159,19 @@ namespace OpenRCT2::Audio uint8_t rotation = GetCurrentRotation(); auto pos2 = Translate3DTo2DWithZ(rotation, location); - // Get all active viewports - auto viewports = WindowGetActiveViewports(); - for (auto* viewport : viewports) + const auto& activeViewports = GetAllViewports(); + for (const auto& viewport : activeViewports) { - if (viewport->flags & VIEWPORT_FLAG_SOUND_ON) + if (viewport.flags & VIEWPORT_FLAG_SOUND_ON) { - int16_t vx = pos2.x - viewport->viewPos.x; - params.pan = viewport->pos.x + viewport->zoom.ApplyInversedTo(vx); + int16_t vx = pos2.x - viewport.viewPos.x; + params.pan = viewport.pos.x + viewport.zoom.ApplyInversedTo(vx); auto sampleModifier = obj->GetSampleModifier(sampleIndex); - auto viewModifier = ((viewport->zoom.ApplyTo(-1024) - 1) * (1 << volumeDown)) + 1; + auto viewModifier = ((viewport.zoom.ApplyTo(-1024) - 1) * (1 << volumeDown)) + 1; params.volume = sampleModifier + viewModifier; - if (!viewport->Contains(pos2) || params.volume < -10000) + if (!viewport.Contains(pos2) || params.volume < -10000) { params.in_range = false; return params; diff --git a/src/openrct2/interface/Viewport.cpp b/src/openrct2/interface/Viewport.cpp index e9421d88ae..92961b1dbf 100644 --- a/src/openrct2/interface/Viewport.cpp +++ b/src/openrct2/interface/Viewport.cpp @@ -1717,6 +1717,11 @@ namespace OpenRCT2 return IsSpriteInteractedWithPaletteSet(rt, imageId, coords, paletteMap, imageType); } + const std::list& GetAllViewports() + { + return _viewports; + } + /** * * rct2: 0x0068862C diff --git a/src/openrct2/interface/Viewport.h b/src/openrct2/interface/Viewport.h index 6d4c27df29..1dfa3e3133 100644 --- a/src/openrct2/interface/Viewport.h +++ b/src/openrct2/interface/Viewport.h @@ -183,6 +183,8 @@ namespace OpenRCT2 void ViewportCreate(WindowBase* w, const ScreenCoordsXY& screenCoords, int32_t width, int32_t height, const Focus& focus); void ViewportRemove(Viewport* viewport); + const std::list& GetAllViewports(); + void ViewportsInvalidate(int32_t x, int32_t y, int32_t z0, int32_t z1, ZoomLevel maxZoom); void ViewportsInvalidate(const CoordsXYZ& pos, int32_t width, int32_t minHeight, int32_t maxHeight, ZoomLevel maxZoom); void ViewportsInvalidate(const ScreenRect& screenRect, ZoomLevel maxZoom = ZoomLevel{ -1 }); diff --git a/src/openrct2/interface/Window.cpp b/src/openrct2/interface/Window.cpp index 68294e908c..e5892c29d2 100644 --- a/src/openrct2/interface/Window.cpp +++ b/src/openrct2/interface/Window.cpp @@ -916,18 +916,6 @@ static constexpr float kWindowScrollLocations[][2] = { }); } - std::vector WindowGetActiveViewports() - { - std::vector viewports; - WindowVisitEach([&viewports](WindowBase* w) { - if (w->viewport != nullptr && !(w->flags & WF_DEAD)) - { - viewports.push_back(w->viewport); - } - }); - return viewports; - } - Viewport* WindowGetPreviousViewport(Viewport* current) { bool foundPrevious = (current == nullptr); diff --git a/src/openrct2/interface/Window.h b/src/openrct2/interface/Window.h index 8e3bce33f6..57ecd6b433 100644 --- a/src/openrct2/interface/Window.h +++ b/src/openrct2/interface/Window.h @@ -333,7 +333,6 @@ namespace OpenRCT2 void TextinputCancel(); - std::vector WindowGetActiveViewports(); Viewport* WindowGetPreviousViewport(Viewport* current); void WindowInitAll(); From 2b19320db3128abed5d42811f48b3798bd9cbe7f Mon Sep 17 00:00:00 2001 From: Harry-Hopkinson Date: Tue, 27 May 2025 18:26:08 +0000 Subject: [PATCH 3/3] Remove unused function (WindowGetPreviousViewport) --- src/openrct2/interface/Window.cpp | 23 ----------------------- src/openrct2/interface/Window.h | 1 - 2 files changed, 24 deletions(-) diff --git a/src/openrct2/interface/Window.cpp b/src/openrct2/interface/Window.cpp index e5892c29d2..e0c59c7f6d 100644 --- a/src/openrct2/interface/Window.cpp +++ b/src/openrct2/interface/Window.cpp @@ -916,29 +916,6 @@ static constexpr float kWindowScrollLocations[][2] = { }); } - Viewport* WindowGetPreviousViewport(Viewport* current) - { - bool foundPrevious = (current == nullptr); - for (auto it = g_window_list.rbegin(); it != g_window_list.rend(); it++) - { - auto& w = **it; - if (w.flags & WF_DEAD) - continue; - if (w.viewport != nullptr) - { - if (foundPrevious) - { - return w.viewport; - } - if (w.viewport == current) - { - foundPrevious = true; - } - } - } - return nullptr; - } - void WindowInitAll() { auto* windowMgr = Ui::GetWindowManager(); diff --git a/src/openrct2/interface/Window.h b/src/openrct2/interface/Window.h index 57ecd6b433..233a18bab0 100644 --- a/src/openrct2/interface/Window.h +++ b/src/openrct2/interface/Window.h @@ -333,7 +333,6 @@ namespace OpenRCT2 void TextinputCancel(); - Viewport* WindowGetPreviousViewport(Viewport* current); void WindowInitAll(); void WindowFollowSprite(WindowBase& w, EntityId spriteIndex);