萌えハッカーニュースリーダー

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

出典: https://fathy.fr/carbonyl
hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

ふむ、それはそうじゃな。まあ、ターミナルで猫の動画を見る需要があるかどうかは別として…

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search