From b082bb0d5086591632a91ea6410eec82fa198fde Mon Sep 17 00:00:00 2001 From: "K.I.R.O" <236710061+vinney491-dotcom@users.noreply.github.com> Date: Thu, 23 Jul 2026 00:47:07 -0500 Subject: [PATCH] perf(social): cap feed length to stop long browsing sessions going choppy --- .../Apps/Aethergram/AethergramApp.cs | 4 ++++ src/Aetherphone/Apps/Chirper/ChirperApp.cs | 5 +++++ src/Aetherphone/Core/Social/FeedLane.cs | 20 +++++++++++++++++++ .../Core/Social/SocialFeedStore.cs | 4 ++++ 4 files changed, 33 insertions(+) diff --git a/src/Aetherphone/Apps/Aethergram/AethergramApp.cs b/src/Aetherphone/Apps/Aethergram/AethergramApp.cs index 45da6731c..05dcf3f19 100644 --- a/src/Aetherphone/Apps/Aethergram/AethergramApp.cs +++ b/src/Aetherphone/Apps/Aethergram/AethergramApp.cs @@ -485,6 +485,10 @@ private void DrawFeedList(Rect listRect, SocialFeedScope scope) var snapshot = store.Feed(scope); using (AppSurface.Begin(listRect)) { + if (ImGui.GetScrollY() < 1f) + { + store.TrimFeed(scope, SocialFeedStore.FeedCap); + } stories.DrawTray(theme); if (snapshot.Length == 0) { diff --git a/src/Aetherphone/Apps/Chirper/ChirperApp.cs b/src/Aetherphone/Apps/Chirper/ChirperApp.cs index 2dc085ba7..6e29709cc 100644 --- a/src/Aetherphone/Apps/Chirper/ChirperApp.cs +++ b/src/Aetherphone/Apps/Chirper/ChirperApp.cs @@ -279,6 +279,11 @@ private void DrawFeedList(Rect listRect, SocialFeedScope scope) var snapshot = store.Feed(scope); using (AppSurface.Begin(listRect)) { + if (ImGui.GetScrollY() < 1f) + { + store.TrimFeed(scope, SocialFeedStore.FeedCap); + + } if (snapshot.Length == 0) { var message = store.IsLoading(scope) ? Loc.T(L.Common.Loading) : diff --git a/src/Aetherphone/Core/Social/FeedLane.cs b/src/Aetherphone/Core/Social/FeedLane.cs index 45ec70abe..0848ffe08 100644 --- a/src/Aetherphone/Core/Social/FeedLane.cs +++ b/src/Aetherphone/Core/Social/FeedLane.cs @@ -60,6 +60,26 @@ public void ApplyMore(TPost[] incoming, string? nextCursor) } } + public void Trim(int max) + { + if (max <= 0) + { + return; + } + + lock (gate) + { + if (items.Length <= max) + { + return; + } + + var trimmed = new TPost[max]; + Array.Copy(items, trimmed, max); + items = trimmed; + } + } + public void Clear() { lock (gate) diff --git a/src/Aetherphone/Core/Social/SocialFeedStore.cs b/src/Aetherphone/Core/Social/SocialFeedStore.cs index df87d2f68..8570d419e 100644 --- a/src/Aetherphone/Core/Social/SocialFeedStore.cs +++ b/src/Aetherphone/Core/Social/SocialFeedStore.cs @@ -105,6 +105,10 @@ private void OnSessionChanged() public bool LoadingMore(SocialFeedScope scope) => Lane(scope).LoadingMore; + public const int FeedCap = 300; + + public void TrimFeed(SocialFeedScope scope, int max) => Lane(scope).Trim(max); + private FeedLane Lane(SocialFeedScope scope) => scope == SocialFeedScope.ForYou ? forYouLane : followingLane;