ANTIGRAVITY LABEN
記事一覧/連携・プラグイン
連携・プラグイン/2026-06-09上級

壁紙アプリの画像配信を解像度バケット方式で組み直す — Antigravity エージェントに変換と検証を任せた運用設計

端末解像度が増えるたびに壁紙アプリの配信は重くなります。1枚の原画を全端末へ配る方式をやめ、解像度バケット+WebP/AVIF+エッジリダイレクトに組み直し、変換と検証を Antigravity エージェントに任せた運用設計を、実際のコードと閾値ごと残しました。

Antigravity275Cloudflare3画像配信AdMob11個人開発73

プレミアム記事

アーティスト・クリエイターの廣川政樹です。累計5,000万ダウンロードの壁紙アプリを個人で運営していますが、いちばん地味に効いてくるコストは「端末解像度が毎年少しずつ増えること」でした。iPhone Air と 17 Pro が加わった更新のとき、配信側のログを見て手が止まりました。同じ1枚の原画を、横幅が 1080px の端末にも 1320px の端末にも、まったく同じ巨大な PNG のまま配っていたのです。

壁紙は1枚あたりの画素数が大きく、しかもユーザーは何十枚もスワイプして眺めます。原画をそのまま返す設計だと、表示には使われない余白の画素まで毎回転送することになります。端末が3〜4種類だった頃は誤差でしたが、対応解像度が二桁に乗った瞬間、転送量とサムネイル表示の体感速度がじわじわ悪化していました。この記事は、その配信層を解像度バケット方式へ組み直し、面倒な変換と検証を Antigravity のエージェントに任せるまでの運用記録です。

端末解像度がばらけると、配信は静かに破綻する

最初に正直に書いておきますと、破綻は派手なクラッシュとして現れません。レビューに「重い」と書かれるわけでもなく、Crashlytics にも出ません。代わりに、サムネイル一覧のスクロールがほんの少しカクつき、AdMob のインタースティシャルが表示される前のロード時間が延び、低速回線のユーザーが2枚目で離脱します。数字としては、壁紙詳細画面の平均表示時間が 0.9 秒から 1.4 秒へ伸びていました。

原因を分解すると単純でした。私のアプリは原画を 2160px 幅で持っていて、それを全端末に配っていました。横 1080px の端末では、受け取った画素のちょうど半分を捨てて表示していたことになります。捨てる画素のために、毎回およそ倍のバイト数を転送していたわけです。端末の種類が増えるほど「ちょうど合う1枚」と「実際に配っている1枚」の差は広がり、平均すると無駄が積み上がっていきます。

宮大工だった祖父は、寸法の合わない材をそのまま使うことをしませんでした。少し削れば収まる、ではなく、その場所のために木取りをするのが当たり前という人でした。画像配信もそれと同じで、端末ごとに「その画面のために用意した1枚」を返すべきだと、ログを眺めながら改めて思いました。問題は、手作業で全解像度ぶんのバリアントを作るのは現実的ではないという一点でした。

1枚の原画を全解像度へ配るのをやめる — バケット設計

端末ごとに専用の画像を持つと言っても、世の中の解像度を1px刻みで用意するのは無駄です。実機の横幅は 1080 / 1170 / 1206 / 1290 / 1320 のように離散的に分布していて、しかも壁紙は数px の差なら拡大縮小しても破綻しません。そこで、横幅を8段の「バケット」へ丸めることにしました。

// resolution-buckets.ts
// 端末の論理幅(px)を、配信する画像幅のバケットへ丸める。
// 上下の端末を1つのバケットに寄せ、変種数を抑えるのが狙い。
export const BUCKETS = [828, 1080, 1170, 1242, 1290, 1320, 1440, 1620] as const;
 
export function pickBucket(deviceWidthPx: number): number {
  // 端末幅以上で最も近いバケットを選ぶ(縮小はしても拡大はしない)。
  for (const w of BUCKETS) {
    if (w >= deviceWidthPx) return w;
  }
  return BUCKETS[BUCKETS.length - 1];
}

ここで一つ判断があります。端末幅より「大きい側」の最も近いバケットを選ぶようにしました。小さい画像を引き伸ばすと壁紙はぼやけますが、少し大きい画像を縮小する分にはきれいに収まるからです。原画は依然 2160px で1枚だけ持ち、そこから各バケットの WebP と AVIF を派生させます。原本が1つなので、新しい端末が出てバケットを1段足したくなっても、再生成すれば追従できます。

バケットを8段に決めた根拠は、手元の DAU 上位 99% の端末をカバーするのに必要な刻みを実機分布から逆算したからです。9段目を足しても恩恵を受けるユーザーは 0.4% ほどで、変種が1段増えるとストレージと生成時間が無視できない比率で増えます。私は「上位99%を8段で」を基準線に置きました。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
解像度バケットを8段に丸め、原画1枚から WebP/AVIF を生成して転送量を約42%削減した実装手順
端末に最適な1枚だけを返すエッジリダイレクトの Before/After コードと、Accept ヘッダの扱い
エージェントが生成したバリアントを本番へ流す前に止める、アスペクト比・ファイルサイズ・色域の検証ゲート
Stripe による安全な決済 · いつでもキャンセル可能
シェア

お読みいただきありがとうございます

Antigravity Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

連携・プラグイン2026-05-24
Antigravity Background Agent に AdMob と Remote Config の差分を6週間レビューさせた所感
壁紙アプリの収益保守で AdMob と Firebase Remote Config の設定がじわじわとずれていく問題に対し、Antigravity Background Agent に週次の差分レビューを任せて6週間運用した実例と、学んだ運用境界線をまとめます。
連携・プラグイン2026-05-23
Apple Search Ads Campaign Management API × Antigravity Agent でキーワード入札を自律調整する実装メモ
ASA Campaign Management API と Antigravity のサブエージェントを組み合わせ、個人開発の壁紙アプリでキーワード入札を自律調整した実装記録。JWT認証、ROAS/CPIに基づくポリシー、Crashlytics連動の安全弁まで。
連携・プラグイン2026-05-30
Antigravity エージェントで AdMob メディエーションの fill rate を診断する — eCPM だけ追って見落とした収益を取り戻す実装メモ
AdMob メディエーションの収益が伸び悩む原因の多くは eCPM ではなく fill rate にあります。Antigravity のエージェントに BigQuery エクスポートと Firebase の指標を読ませ、ネットワーク別の充填率低下を自動で切り分ける診断パイプラインの実装を、個人開発の実数値とともにまとめます。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →