RP2350で1ピクセル6サイクルの壁を破る、JITビットマップ文字描画
JIT bitmap text rendering for microcontrollers

Raph Levienが、80年代風ホームコンピュータをRP2350で再構築するvic-2350向けに、文字列ごとに最適化コードをその場で生成するJIT方式のビットマップ文字描画を開発した。ビームと競争する走査線レンダラでは1ピクセル約6サイクルという厳しい予算があり、Rustでは届かないためARMアセンブリで実装。フォントを32ビット単位に詰め、グリフの重複まで検出して1140バイトを960バイトに削減している。
グリフが別のグリフに完全に含まれる場合、それを別途パックする必要はない。意外な例もいくつかある。たとえば「l」は「U」の左側であり、「0」は「()」の間の空白を詰めたものと同一だ。
HNでの議論
22- drfuchs
関連する先行研究としては、1996年に出願された特許US-6377261-B1「Compiling glyphs into instructions for imaging for execution on a general purpose computer」を参照されたい。基本的なアイデアは、各文字を「Load Immediate」/「Shift」/「OR to Memory」命令のシーケンスに変換するというもので、フォントのビットマップを保存したものからフェッチする必要がなくなり、ピクセルは生成されたマシンコード内のImmediateデータに暗黙的に含まれる。さらに、文字のある行が前の行と同じ場合には、Load Immediateすら不要になるなど、凝った最適化も可能だ。この方式は、当時Macintosh用のFrameMakerで使われており、Gus Fernandez(彼は追加の最適化に夢中になった)によって実装された。
- karmakaze
これは本当に素晴らしいプロジェクトだ。多くのレトロコンピュータは高性能すぎて、大きなフレームバッファを使えるため、プログラミングしても昔のようにハードウェアに近い感覚がなく、もっと親密だった頃の感じがしない。
この実装は、私の初期の2つの経験を思い出させる。Atari 8ビットでのディスプレイリストのプログラミングと、HP PCL 5eインタプリタ(短いラスターバンドバッファ付き)だ。VCS/2600の128バイトビームレーシングにはあまり深入りしなかったが、自作ゲームやデモ用にディスプレイリスト割り込みのオンザフライコーディングはかなりやった。Atari Anticのディスプレイリストシステムは本当に素晴らしいと思った(Amigaも手がけたJay Minerに感謝)。その後、OS/2 Presentation ManagerやJava FXまで、似たようなものはあまり見かけなかった。
PCLインタプリタは、数百行の循環バッファを使う点でおそらく最も近い形だった。それはyソートされたオブジェクトに「レンダリング」され、後でレンダリング/ラスタライズする必要があった。各オブジェクトは最大255ピクセル(0.85インチ)の高さに切り取られ、まだY - buffer_heightをレンダリングしているラップアラウンドスキャンラインをビームが通過するまで描画できないため、逆順のmax-y順序付けが使われた。
- codazoda
私はBASIC32という、マイコン向けのレトロなBASICインタプリタを構築している。一度フラッシュすれば、たくさんの新しいプロジェクトを簡単に作れるようにするためだ。
作者のアプローチで犠牲になるのは「読み取り」だ。画面は書き込み専用になる。読み取りを必要とする関数はほんの少ししかない。ピクセルの現在の色を取得したり、フラッドフィルやペイントのような操作をしたりする程度だ。
BASICのレトロな感じを目指していたので、これらをサポートしたかった。そこでフレームバッファを選んだ。技術的にはそれほどクールではない。RP2350では、RAMがしばしばKB単位に制限されているため、低解像度と低ビットレートが必要になる。
4MBや8MBのRAMを搭載したESP32-S3のバリエーションにステップアップすれば、フレームバッファはずっと簡単になる。