Skip to main content

Module image_budget

Module image_budget 

Source
Expand description

画像取得・デコードの予算判定(描画をブロックしないため)。

仕様と実測は spec/webfont_loading.md を参照(フォントと同じ方針)。

§なぜ必要か

【2026-07-30 実測】ネットワークが健全になった結果、 .hero の背景写真(3,724,477 バイト)を実際に取得するようになり、 描画が 120 秒たっても終わらなくなった。 それまで表示できていたのは取得が失敗して先へ進めていたため。

§判定は「圧縮サイズ」ではなく「展開後の画素数」で行う

woff2 で同じ轍を踏んだ。102KB の woff2 が Brotli 展開で OOM した。 圧縮形式は展開後のサイズが桁違いになりうるので、 可能なら展開後の大きさを見る。JPEG は SOF マーカーから幅と高さを読める。

グローバル状態にもハードウェアにも依存しない純粋ロジックのみ。

Enums§

ImageDecision
判定結果。
SkipReason
諦める理由。黙って無視せず記録するために型で持つ。

Constants§

MAX_IMAGE_BYTES
取得を許容する最大バイト数(画素数が読めない形式向けの保険)。
MAX_PIXELS
デコードを許容する最大画素数。 1 画素 4 バイトなので 2M 画素で 8MB のバッファになる。

Functions§

decide_by_bytes
大きさが不明な段階で、圧縮サイズだけから判断する。
decide_by_dimensions
展開後の大きさが分かっている画像を受け入れてよいか。
describe
諦めた理由を人が読める文字列にする(ログ用)。
jpeg_dimensions
JPEG の SOF マーカーから (幅, 高さ) を読む。
pixel_count
幅×高さから画素数を求める。オーバーフローしない。