2025/03/13 16:56 Forking Chrome to render in a terminal (2023)

ロボ子、今日のニュースはすごいぞ!Chromeをフォークして、ターミナルでレンダリングするブラウザ「Carbonyl」が出たらしいのじゃ!

ターミナルでブラウザですか?それはまたすごい発想ですね。どのように描画しているんですか?

そこが面白いところじゃ!ターミナルは固定グリッドで等幅文字しか表示できないからの。エスケープシーケンスを使って、カーソルの移動や文字色の変更、マウストラッキングをしているらしいぞ。

なるほど、エスケープシーケンスですか。でも、それだと画像とかはどうするんですか?

Unicode文字のU+2584(▄)を使うらしいぞ。セルのアスペクト比が1:2であることを利用して、正方形のピクセルをレンダリングするのじゃ!

そんな方法があるんですね!テキストレンダリングはどうしているんでしょう?

Skiaデバイスを使ってテキストをレンダリングしているみたいじゃ。`drawRect`メソッドと`drawRRect`メソッドにコードを追加して、テキストの背後をクリアしているらしいぞ。ソフトウェアラスタライザーによるテキスト要素の背後の灰色の背景を削除したみたいじゃな。

なるほど。入力はどうなっているんですか?マウス操作とかもできるんですか?

ターミナルエミュレータにマウストラッキングとイベント報告をさせるためのシーケンスを使っているらしいぞ。`TaskRunner`クラスを介してメッセージを渡し、メインスレッドからブラウザメソッドを呼び出すみたいじゃ。

すごいですね!CPU使用率の問題はどう解決したんですか?

最初はCPU使用率が400%と高かったらしいのじゃ。それを解決するために、共有メモリ領域を使用して効率的にレンダリングするようにしたみたいじゃ。`HostDisplayClient`と`SoftwareOutputDevice`を実装し、カスタムの`LayeredWindowUpdater`を管理しているらしいぞ。

共有メモリですか。効率的ですね。プロセス間通信には何を使っているんですか?

Mojoを使っているみたいじゃ。`CarbonylRenderService`インターフェースを定義して、レンダラープロセスからブラウザプロセスにテキストデータを送信しているらしいぞ。`BrowserInterfaceBroker`を使用して、サービスの実装を登録しているみたいじゃな。

Mojoですか。なるほど。レイアウトの問題はどう解決したんでしょう?

`StyleResolver::ResolveStyle`にコードを追加して、すべての要素に等幅フォントを強制的に適用し、レイアウトの問題を修正したみたいじゃ。

なるほど。LoDPIレンダリングも有効化しているんですね。

`Display`クラスでスケーリングを強制的に行い、LoDPIレンダリングを有効化して、レンダリング速度を向上させているみたいじゃ。スケールファクターは1.0 / 7.0に設定しているらしいぞ。

細かいところまで最適化されているんですね。色の変換も最適化されているんですか?

RGBからxterm-256色への変換式を最適化して、高速化しているみたいじゃ。DCS(Device Control Sequence)を使用して、ターミナルがtrue-colorをサポートしているかどうかを検出しているらしいぞ。

すごいですね!ターミナルのタイトルも設定できるんですか?

xtermシーケンスを使用してターミナルウィンドウのタイトルを設定し、現在のページタイトルを表示しているみたいじゃ。`WebContentsObserver::TitleWasSet()`を実装して、タイトルが変更されたときに通知を受け取るようにしているらしいぞ。

本当に色々な工夫がされているんですね。他に何かありますか?

アイドル時のCPU使用率をゼロにし、スクロール時のCPU使用率を約15%に削減したらしいぞ。あと、Rustで開発されているみたいじゃ。

Rustですか。それはまた興味深いですね。ターミナルでブラウザを使うなんて、考えたこともありませんでした。

じゃろ?私もじゃ!しかし、これを使えば、どんな環境でもWebが見れるようになるかもしれんのじゃ!

確かにそうですね。でも、博士、ターミナルでYouTubeを見るのはちょっと大変そうですね。

ふむ、それはそうじゃな。まあ、ターミナルで猫の動画を見る需要があるかどうかは別として…
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。