Rendering
UI開発の世界は、主に2つの支配的なパラダイムで構成されています: 保持モードと即時モード。ほとんどの従来のGUIライブラリは、保持されたモードパラダイムの下で動作します。ただし、 ratatui
は、TUI開発のための即時モードレンダリングアプローチを採用しています。
これにより、 ratatui
は、使用する場合のGUIフレームワークとは異なります。
即時モードレンダリングとは何ですか?
即時モードレンダリングは、UIがすべてのフレームを再現されるUIパラダイムです。固定されたUIウィジェットを作成して状態を更新する代わりに、現在のアプリケーション状態に基づいて、すべてのフレームでUIをゼロから「描画」します。
一言で言えば:
- 保持モード: UIを一度セットアップし、ウィジェットを作成し、後でプロパティを変更するか、イベントを処理します。- 即時モード: アプリケーション状態に基づいて、すべてのフレームをUIを再描画します。メモリに永続的なウィジェットオブジェクトはありません。
ratatui
では、すべてのフレームがUIを新たに描画します。
loop { terminal.draw(|f| { if state.condition { f.render_widget(SomeWidget::new(), layout); } else { f.render_widget(AnotherWidget::new(), layout); } })?;}
即時モード レンダリング パラダイムを初めて使用する場合は、この記事 と付随する YouTube ビデオを読む価値があります。
IMGUI
に関するこの 4 分間の講演も、これと関連しています。
即時モードレンダリングの利点
- シンプルさ: 永続的なウィジェット状態がなければ、UIロジックはアプリケーション状態を直接反映します。それらを同期したり、過去のウィジェット状態について心配する必要はありません。
- 柔軟性: 何も石に設定されていないため、UIレイアウトやロジックをいつでも変更できます。条件付きでウィジェットを非表示にしたいですか?何らかの条件に基づいて描かないでください。
即時モードレンダリングの短所
-
レンダリングループ管理: 即時モードレンダリングでは、トリガーレンダリングの責任はプログラマーにあります。すべてのビジュアルアップデートでは、
Backend.draw()
への呼び出しが必要です。したがって、レンダリングスレッドが不注意にブロックされている場合、UIはスレッドが再開するまで更新されません。ratatui
ライブラリは、特にウィジェットが「バックエンド」にレンダリングされる方法のみを処理します (CrosstermBackend
) 。バックエンドは、外部クレート (crossterm
) を使用して実際にターミナルに描画します。 -
イベントループオーケストレーション: 「レンダリングループ」の管理とともに、開発者は「イベントループ」の処理も責任を負います。これには、ジョブのサードパーティライブラリを決定することが含まれます。
crossterm
は、キー入力を処理するための人気のあるクレートであり、リポジトリとオンラインで使用方法について多くの例を見つけることができます。tokio
の使用に興味がある場合は、crossterm
はasync
イベントストリームもサポートします。 -
アーキテクチャの設計上の考慮事項:
ratatui
を使用して、箱から出して、大規模なアプリケーションの整理にはほとんど役に立ちません。最終的に、構造と規律に関する決定は、開発者が原則に基づいています。ただし、開始するのに役立つ[テンプレート]を提供します。