Nibnibは、RP2350のようなマイクロコントローラ上で画像をディスプレイするという特定のハードウェア制約に対する実験的な解決策として開発されました。このようなデバイスでは、処理予算は非常に厳しく、1ピクセルあたり約6サイクルしかありません。この予算では、ピクセルのフェッチ、パレットのルックアップ、およびラインバッファへのストアを実行するだけで精一杯であり、複雑なデコンプレッションロジックのための余地はほとんどありません。この要件を満たすため、Nibnibはエンコーディングの複雑さよりも、決定論的で単純なデコーディングプロセスを優先しています。

このフォーマットは、入力の1バイトから2つのピクセルを同時にデコードすることで、4bpp(bits per pixel)の圧縮率を達成します。絶対的な色を保存する標準的なパレット画像とは異なり、Nibnibは色のデルタ(差分)のパレットを使用します。このアプローチにより、画像内の「ソフト」な領域の品質が大幅に向上します。デコーディングの仕組みは、パレットからデルタ値を取得し、それを前回のデコード済みピクセルの倍増版に加算することです。この操作により、下位16ビットが左側のピクセルを表す2つの16bpp(RGB 565形式)ピクセルが得られます。デコーディングは単純な加算とビットシフト操作であるため、制約のあるハードウェア上でのリアルタイム表示に必要な極めて高速な実行が可能です。

Nibnibデコーディングアルゴリズムのロジックを示す図
Nibnibフォーマットで使用される決定論的なペアベースのデコーディングプロセスを示す図。github.com

この図は、デルタ値を前回のピクセルの倍増版に加算する特定のデコーディングメカニズムを説明しています。

この高いデコンプレッション速度は、高度に非対称なエンコーディングプロセスの代償として得られるものです。デコーディングはほぼ瞬時に完了する一方で、エンコーダーは元の画像の高品質な複製を見つけるために、可能なエンコード済み画像の空間を複雑に探索する必要があります。この探索には、最適なパレットと最良のコードワードの両方を選択することが含まれ、エンコーダーはデコーダーよりも数桁遅くなります。現在、貪欲法(greedy search)アルゴリズムを使用すると、鋭いエッジの右側にアーティファクトが生じることがあります。さらに、パレットはまだ特定の入力画像に基づいて適応的に選択されておらず、これが将来の品質向上のための主要な領域となっています。このフォーマットは長期的なアーカイブを目的としたものではありませんが、高性能で低電力な視覚出力のためにデコーダーと密接に統合されるよう設計されています。

貪欲法アルゴリズムによるアーティファクトを示すサンプル画像
鋭いエッジの右側にアーティファクトが見られる、Nibnibでエンコードされた画像の例。github.com

この画像は、第3段落で言及されている貪欲法アルゴリズムの現在の制限を例証しています。

より高品質なNibnibエンコーディングを示すサンプル画像
目に見えるアーティファクトが少ない、より高品質なエンコーディングを示すサンプル画像。github.com

この画像は、アーティファクトの多いバージョンと比較するためのものであり、フォーマットのエンコーディングプロセスの可能性を示しています。