GNOMEのGIF読み込み処理改善
「GNOME」のGIF読み込み処理が改善され、CPUとメモリー使用量の削減が行われました。GNOMEソフトウェアとSnapアプリのプロモーション
「GNOMEソフトウェア(Ubuntuソフトウェア)」では、Snapアプリのプロモーションを行い、どのようなアプリなのかをユーザーに紹介する機能があります。ここでの話は、アプリのスクリーンショットのことです。
アプリのスクリーンショットはアプリの提供者(パブリッシャー)が作成し、「GNOMEソフトウェア」を通じてユーザーにスクリーンショットを提供します。
スクリーンショットは静止画像よりも動きのある画像のほうが、アプリの内容をより良くユーザーに伝えることができます。
動きのある画像とは、アニメーションGIF画像のことです。
CPUとメモリー使用量
アニメーションGIFは複数のフレームで構成され、各フレームを描画することでアニメーションを実現します。パブリッシャーが提供するスクリーンショットの中には巨大なアニメーションGIF画像があり、このような画像を「GNOMEソフトウェア」で表示すると、CPU及びメモリーの使用量が非常に大きくなるという問題があります。
しかし同じアニメーションGIF画像を「Firefox」で表示しても問題なく描画されます。
巨大なアニメーションGIF画像
問題が起きるアニメーションGIF画像は、以下の特徴を持っていました。- GIF画像のファイルサイズ:13MB
- フレーム数:625フレーム
- 解像度:1790 x 1060ピクセル
このアニメーションGIF画像は、圧縮された映像ストリームをアニメーションGIFに変換したような作りであり、ロスレス圧縮(可逆圧縮)で圧縮されていました。
GNOMEソフトウェアと画像の描画
「GNOMEソフトウェア」は「GTK+」で開発されており、画像の描画は「gdk-pixbuf」を利用して描画しています。「gdk-pixbuf」のGIF読み込み処理を確認すると、すべてのフレームをメモリー上に展開する処理になっていました。
つまり上記の例では、「625 x 1790 x 1060 x 4バイト ≒ 4.4GB」のメモリーを消費します。
そしてソースコードのコメントに実装状況をうまく表現したコメントが見つかりました。
/* The below reflects the "use hell of a lot of RAM" philosophy of coding */
「以下はメモリーを富豪的に使用する実装方針を反映している。」といったところでしょうか。
そもそもこのような巨大なアニメーションGIF画像は想定されていないのでしょう。
また上記の画像はFullHD並の解像度ですし、アニメーションGIF画像より動画フォーマットによるストリーミング配信のほうが良いようにも思います。
修正へ
既存の機能に影響が出ないように(リグレッションしない様に)修正及びテストが行われました。またこの修正作業の中で別の問題も見つかり、その問題の修正も行われました。
修正は既存のコードを新しいコードで書き直したほうが簡単でしたが、「Ubuntu 16.04」及び「Ubuntu 18.04 LTS」へのバックポートも配慮し、既存コードの修正に留められています。