ページがバックグラウンド状態のときはタイムラインを更新しないようにする
Summary
長時間のバックグラウンド処理から復帰したとき新規ノートが大量に表示されるのは、「Misskey重い」と言われる原因のひとつかと思われる。
ページがバックグラウンド状態のときはページのスクロールが中間であるときと同じような処理にすればいいと思う。
#6384 の代替
~~Related to #6041~~
#6041 は関係ない
c2-2使ってるから忘れてるけどこれって実装されてなかったっけ…
プールしているノートや通知は、Vueが起動しないのでノートや通知の削除とかノート内のリアクションの増加とかは見逃してしまうことになっているわね。
これはバックグラウンドに限らず、下にいるときにも起きている。 https://github.com/misskey-dev/misskey/pull/6388#issuecomment-652892829
つまり #6388 のように単純にキューに追加するべきではない
NotesPoolみたいなクラスを作って管理するべきなのかなと
https://github.com/misskey-dev/misskey/pull/6388#issuecomment-678316026
#7910 と同じアイデア
(キューについても管理することを考えると、ノートや通知などの個々のSFCではなく、pagination.vueからノートなどの管理クラスを呼び出してやる必要がありそう?)
(ノートだけの処理をpagination.vueでやるのは煩雑な気もするけどpagination.vueのキューは仕方ないか)
今の実装だとページがバックグラウンドでもノートはタイムラインに追加されていく
それがそうではないようです。
長時間放置されているとブラウザはDOMの変更をキューに積んでいくらしく、結果的にタブに移動したときにたくさんのDOMの変更が一度に発生することになります。
https://github.com/misskey-dev/misskey/pull/6388#issuecomment-631397074
ちゃんとバックグラウンドで更新されている
(FirefoxのおかげなのかVue3になってからなのかは知らない)
このPRを適用すると、ページがバックグラウンドだとノートが追加されないので、ページ復帰したときに大量のノートが追加されて重くなりそう
https://github.com/misskey-dev/misskey/pull/6388#issuecomment-631397074
p1.a9z.devで試してみたところ、 #8209 があるとアニメーションがあるのでたしかに重くなる
バックグラウンドになってある程度時間が経ったらWebSocketは切断してしまって、復帰したらタイムラインをAPIから読み直すので良さそう
こちら引き取ってもよいですか
対処法が
バックグラウンドになってある程度時間が経ったらWebSocketは切断してしまって、復帰したらタイムラインをAPIから読み直すので良さそう
ならMkTimelineで切断・復帰と tlComponent.pagingComponent?.reload(); をvisibility切り替えと連動させる。
それか、
https://github.com/misskey-dev/misskey/issues/6041
より、音を出し続けるならMkPaginationでpretend()がunshiftIems()ではなくprependQueue()を呼ぶようにする
のどちらかと思っています。
後者で良さそう
ただvisibilitychange visibleになってタイムラインに流し込むときにアニメーションが動くととても重たくなるので気をつけてほしいです
わかりました!