Skip to content

fix(nicojk): バッファが残留しメモリを過剰に使う問題を修正 - #39

Open
ci7lus wants to merge 1 commit into
mainfrom
fix/jk-memory-too-used
Open

ci7lus wants to merge 1 commit into
mainfrom
fix/jk-memory-too-used

Conversation

@ci7lus

@ci7lus ci7lus commented Oct 3, 2026 •

Copy link
Copy Markdown
Owner

Sourceryによる概要

新たに利用可能になったコメントログの区間を正しく処理しながら、NicoJKのコメント再生で古いバッファーやレンダラーリソースが保持され続ける問題を防止します。

バグ修正:

  • ライブ更新やレンダラーの再構築中に、コメントバッファー、仮想化の測定キャッシュ、レンダラーリソースが蓄積するのを防止。
  • 現在の分が利用可能になった後にコメントログの区間を再試行するようにし、不完全なデータを繰り返し取得する問題を解消。

機能強化:

  • コメントレンダラーのライフサイクル管理を一元化し、キャンバス、タイマー、リスナー、グラフィックスリソースを安全に破棄。
  • 録画コメントの準備完了処理とライブコメントの重複排除を改善。

テスト:

  • ライブコメントバッファーのサイズ制限、仮想化キャッシュの整理、レンダラーリソースの破棄、キャンバスのフォールバック処理のクリーンアップ、遅延されたコメントログ再試行のテストカバレッジを追加。
Original summary in English

Summary by Sourcery

Prevent NicoJK comment playback from retaining stale buffers and renderer resources while handling newly available comment-log intervals correctly.

Bug Fixes:

  • Prevent comment buffers, virtualization measurement caches, and renderer resources from accumulating during live updates and renderer rebuilds.
  • Retry comment-log intervals after the current minute becomes available instead of repeatedly fetching incomplete data.

Enhancements:

  • Centralize comment renderer lifecycle management and safely dispose canvases, timers, listeners, and graphics resources.
  • Improve recorded-comment readiness handling and live-comment deduplication.

Tests:

  • Add coverage for bounded live-comment buffers, virtualization cache pruning, renderer resource disposal, canvas fallback cleanup, and deferred comment-log retries.

@ci7lus ci7lus added bug Something isn't working nicojk labels Oct 3, 2026
@sourcery-ai

sourcery-ai Bot commented Oct 3, 2026 •

Copy link
Copy Markdown

レビュアーガイド

コメントレンダラーのリソースを明示的に破棄し、ライブコメントと仮想化キャッシュのサイズに上限を設け、後続の再試行をスケジュールする際に、まだ確定していない現在の分を kakolog が繰り返し取得することを防止することで、過剰なメモリ使用量を解消します。

コメントレンダラーのライフサイクルクリーンアップのシーケンス図

sequenceDiagram
    participant OverlayPage
    participant CommentRenderer
    participant NiconiComments
    participant Canvas

    OverlayPage->>CommentRenderer: new CommentRenderer(container, initialComments, format)
    CommentRenderer->>NiconiComments: new NiconiComments(canvas, comments, options)
    OverlayPage->>CommentRenderer: addComments(...comments)
    OverlayPage->>CommentRenderer: destroy()
    CommentRenderer->>NiconiComments: destroy()
    CommentRenderer->>Canvas: remove and release dimensions
Loading

kakolog における現在の分の遅延再試行のシーケンス図

sequenceDiagram
    participant KakologManager
    participant NiconicoAPI
    participant MiyouAPI
    participant RetryScheduler

    KakologManager->>NiconicoAPI: fetch comments for chunk
    KakologManager->>MiyouAPI: fetch comments for chunk
    KakologManager->>KakologManager: set deferredOffsets when chunk reaches current minute
    KakologManager->>RetryScheduler: hasPendingInitialSourceFetch()
    RetryScheduler->>KakologManager: fetchWithLimit()
    KakologManager->>KakologManager: isDeferredOffsetWaiting(state, offset)
    KakologManager->>NiconicoAPI: retry after deferredUntil
Loading

コメントバッファと計測キャッシュのサイズ制限のフロー図

flowchart TD
    Comments[Live comments] --> Pending[getPendingLiveComments]
    Processed[processedIds] --> Pending
    Pending --> Render[Render only unprocessed comments]
    Comments --> Prune[pruneCommentMeasurementCache]
    Prune --> Cache[Retain measurements for visible comment row keys]
    Cache --> Virtualizer[TanStack Virtualizer]
Loading

ファイル単位の変更

変更 詳細 ファイル
レンダラーの再構築時に、コメントレンダラーのリソースとキャンバスを解放する。
  • サードパーティ製レンダラーを、キャンバスの所有権を明示し、冪等的に破棄できるようにラップする。
  • 表示モード、タイミング、または記録済みデータが変更されたときに、レンダラーを破棄して再作成する。
  • WebGL のクリーンアップと、ライブラリの 2D フォールバックキャンバスを、失敗時のパスも含めて処理する。
  • GL リソース、リスナー、タイマー、テクスチャ、フォールバックのクリーンアップを対象とした、ブラウザのスタンドインテストを追加する。
src/plugins/nicojk/comment-renderer.ts
src/plugins/nicojk/components/OverlayPage.tsx
tests/nicojk-comment-renderer.test.ts
コメントが UI から離れた後も保持されるライブコメントと仮想化パネルのメモリに上限を設ける。
  • 保留中のコメントをフィルタリングする前に、ライブバッファに存在しなくなった処理済みのライブ ID を削除する。
  • 安定したコメント行キーを一元化する。
  • 表示されなくなったコメントについて、TanStack Virtual の計測済みサイズエントリを削除する。
  • 長時間稼働するフィルタリング済みストリームと、ローリング方式の仮想化リストを対象とした回帰テストを追加する。
src/plugins/nicojk/comment-buffer.ts
src/plugins/nicojk/components/OverlayPage.tsx
src/plugins/nicojk/components/PanelPage.tsx
tests/nicojk-comment-buffer.test.ts
現在の未完了の分に対する kakolog リクエストを延期し、データが利用可能になった後に再試行する。
  • チャンクごとの延期された再試行時刻を、完了済みの取得状態とは別に追跡する。
  • リクエストの終了時刻を現在の分までに制限しつつ、後で取得するために延期されたチャンクを保持する。
  • 再試行時刻になるまで延期されたチャンクをスキップし、再試行可能になった場合にのみ保留中として公開する。
  • 部分的な結果を保持し、後続の再試行で取得したコメントを統合する。
src/plugins/nicojk/kakolog-manager.ts
src/plugins/nicojk/App.tsx
tests/nicojk-kakolog-manager.test.ts

ヒントとコマンド

Sourcery の操作

  • 新しいレビューを開始する: プルリクエストに @sourcery-ai review とコメントします。
  • ディスカッションを続ける: Sourcery のレビューコメントに直接返信します。
  • レビューコメントから GitHub Issue を作成する: レビューコメントに返信して、Sourcery に Issue の作成を依頼します。レビューコメントに @sourcery-ai issue と返信して作成することもできます。
  • プルリクエストのタイトルを生成する: プルリクエストのタイトル内の任意の場所に @sourcery-ai と記述すると、いつでもタイトルを生成できます。プルリクエストに @sourcery-ai title とコメントして、タイトルをいつでも(再)生成することもできます。
  • プルリクエストの概要を生成する: プルリクエスト本文内の、概要を生成したい位置に @sourcery-ai summary と記述すると、その位置でいつでも PR の概要を生成できます。プルリクエストに @sourcery-ai summary とコメントして、概要をいつでも(再)生成することもできます。
  • レビュアーガイドを生成する: プルリクエストに @sourcery-ai guide とコメントして、レビュアーガイドをいつでも(再)生成できます。
  • Sourcery のコメントをすべて解決する: プルリクエストに @sourcery-ai resolve とコメントすると、Sourcery のコメントをすべて解決できます。すべてのコメントに対応済みで、これ以上表示したくない場合に便利です。
  • Sourcery のレビューをすべて却下する: プルリクエストに @sourcery-ai dismiss とコメントすると、既存の Sourcery のレビューをすべて却下できます。新しいレビューを最初から始めたい場合に特に便利です。新しいレビューを開始するには、忘れずに @sourcery-ai review とコメントしてください。

エクスペリエンスのカスタマイズ

ダッシュボード にアクセスして、次の操作を行えます。

  • Sourcery が生成するプルリクエストの概要、レビュアーガイドなどのレビュー機能を有効または無効にする。
  • レビュー言語を変更する。
  • カスタムレビュー指示を追加、削除、編集する。
  • その他のレビュー設定を調整する。

ヘルプを利用する

Original review guide in English

Reviewer's Guide

Fixes excessive memory usage by explicitly disposing comment renderer resources, bounding live-comment and virtualization caches, and preventing kakolog from repeatedly fetching the not-yet-finalized current minute while scheduling a later retry.

Sequence diagram for comment renderer lifecycle cleanup

sequenceDiagram
    participant OverlayPage
    participant CommentRenderer
    participant NiconiComments
    participant Canvas

    OverlayPage->>CommentRenderer: new CommentRenderer(container, initialComments, format)
    CommentRenderer->>NiconiComments: new NiconiComments(canvas, comments, options)
    OverlayPage->>CommentRenderer: addComments(...comments)
    OverlayPage->>CommentRenderer: destroy()
    CommentRenderer->>NiconiComments: destroy()
    CommentRenderer->>Canvas: remove and release dimensions
Loading

Sequence diagram for deferred kakolog current-minute retry

sequenceDiagram
    participant KakologManager
    participant NiconicoAPI
    participant MiyouAPI
    participant RetryScheduler

    KakologManager->>NiconicoAPI: fetch comments for chunk
    KakologManager->>MiyouAPI: fetch comments for chunk
    KakologManager->>KakologManager: set deferredOffsets when chunk reaches current minute
    KakologManager->>RetryScheduler: hasPendingInitialSourceFetch()
    RetryScheduler->>KakologManager: fetchWithLimit()
    KakologManager->>KakologManager: isDeferredOffsetWaiting(state, offset)
    KakologManager->>NiconicoAPI: retry after deferredUntil
Loading

Flow diagram for bounded comment buffer and measurement cache

flowchart TD
    Comments[Live comments] --> Pending[getPendingLiveComments]
    Processed[processedIds] --> Pending
    Pending --> Render[Render only unprocessed comments]
    Comments --> Prune[pruneCommentMeasurementCache]
    Prune --> Cache[Retain measurements for visible comment row keys]
    Cache --> Virtualizer[TanStack Virtualizer]
Loading

File-Level Changes

Change Details Files
Release comment renderer resources and canvases across renderer rebuilds.
  • Wrap the third-party renderer with explicit canvas ownership and idempotent destruction.
  • Destroy and recreate renderers when display mode, timing, or recorded data changes.
  • Handle WebGL cleanup and the library’s 2D fallback canvas, including failure paths.
  • Add browser stand-in tests for GL resources, listeners, timers, textures, and fallback cleanup.
src/plugins/nicojk/comment-renderer.ts
src/plugins/nicojk/components/OverlayPage.tsx
tests/nicojk-comment-renderer.test.ts
Bound live-comment and virtualized-panel memory retained after comments leave the UI.
  • Remove processed live IDs no longer present in the live buffer before filtering pending comments.
  • Centralize stable comment row keys.
  • Prune TanStack Virtual measured-size entries for comments no longer displayed.
  • Add regression tests covering long-running filtered streams and rolling virtualized lists.
src/plugins/nicojk/comment-buffer.ts
src/plugins/nicojk/components/OverlayPage.tsx
src/plugins/nicojk/components/PanelPage.tsx
tests/nicojk-comment-buffer.test.ts
Defer kakolog requests for the currently incomplete minute and retry them after the data becomes available.
  • Track per-chunk deferred retry times separately from completed fetch state.
  • Clip request end times to the current minute while retaining deferred chunks for later retrieval.
  • Skip deferred chunks until their retry time and expose them as pending only when retry is due.
  • Preserve partial results and merge comments obtained on the subsequent retry.
src/plugins/nicojk/kakolog-manager.ts
src/plugins/nicojk/App.tsx
tests/nicojk-kakolog-manager.test.ts

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

こんにちは。変更内容を確認しましたが、とても良い仕上がりです!

Sourcery による評価

承認しました。


Sourcery はオープンソース向けに無料です。レビューを気に入っていただけましたら、共有をご検討ください ✨
Original comment in English

Hey - I've reviewed your changes and they look great!

Sourcery assessment

Approved.


Sourcery is free for open source - if you like our reviews please consider sharing them ✨

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working nicojk

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant