DEV LOG · 制作記

ドット絵1,723枚を個人で描いて
iOSアプリを出した話

2026-08-12 · ゲムログ編集部

ゲムログはインディーゲームとレトロゲームの攻略サイトですが、運営している私自身も個人でアプリを作っています。 冷蔵庫の中身と賞味期限を管理する iOS アプリ NeoKura(ネオクラ) で、食材もレシピも全部ドット絵で描きました。その数 1,723 点。 この記事は、その制作でいちばん時間を取られた「画像が重すぎて実機がカクつく」問題を、 どう調べてどう直したかの記録です。ドット絵の見た目の話と、実装の話が半分ずつ出てきます。

📊 数字で見る制作規模

ドット絵の総数

1,723 点

品目カタログ

1,182 種

レシピ

520 品

自動テスト

1,364 件 / 127 ファイル

ドット絵は食材・調味料・料理・UIアイコンまで全て描き下ろしです。 品目カタログが1,182種あるので、「豚こま」と「豚バラ」で別の絵が要る、という調子で増えていきました。

① 実機で「ギザギザして重い」

開発中はシミュレータで快適に動いていました。ところが実機に入れて、食材がタイル状に並ぶ画面を 勢いよくスクロールすると、ドット絵がギザギザに崩れて、そのうえ動作も重くなる。 最初は描画のレイヤー構成や再利用まわりを疑ったのですが、そこをいくら直しても改善しませんでした。

② 原因はPNGの「色数」だった

画像そのものを調べたところ、書き出していた PNG が 192×192 のトゥルーカラーで、 しかも1枚あたり 6,000〜13,000 色使われていました。

ドット絵風の絵にこの色数は要りません。見た目には数十色しか使っていないのに、 アンチエイリアスや書き出し時の変換で中間色が大量に混ざり、 結果としてPNGの圧縮がほとんど効いていない状態でした。 総容量は 68.4MB(平均 40.6KB/枚)。これが読み込みの詰まりとして表に出ていたわけです。

③ パレット化で 68MB → 18MB

やったことは一つだけで、PNGをパレット化(truecolor+α → PNG-8)しました。 ドット絵は元々「限られた色を並べる」絵なので、パレット方式と相性が良く、見た目を保ったまま容量だけ落ちます。

最適化前の総容量

68.4 MB

平均 40.6 KB / 枚

最適化後の総容量

18.4 MB

平均 10.9 KB / 枚

削減率

-73%

PNGのパレット化のみ

④ 失敗談: 紅生姜が茶色になった

最初、パレット化するときに色数を明示的に指定しました。少ないほど軽くなるからです。 ところがこれをやると、変換に使っていた sharp が絵によっては4bit(16色)まで落としてしまい、 冷やし中華の紅生姜が茶色に変わりました。赤が消えたわけです。

結論

色数は指定せず、品質だけを指定する。あとは変換側に必要な色数を決めさせたほうが、 絵ごとの事情(差し色が効いている絵など)を壊さずに済みました。 容量目標を数値で追いかけると、こういう「絵として致命的だが数値上は正しい」劣化を見落とします。

⑤ ギザギザの正体は「下敷き」だった

最後まで残っていたのが、スクロール中に一瞬出るギザギザです。 これは画像そのものの劣化ではなく、PNGの読み込みが間に合わない間に表示される 16×16 の下敷きでした。 つまり「低解像度のものが一瞬見えている」だけで、画像が軽くなって読み込みが速くなれば自然に見えなくなります。 容量の問題と見た目の問題が、同じ一つの原因から出ていたことになります。

まとめ
  • ドット絵風の絵でも、書き出し方によっては1枚に1万色以上入っていることがある
  • その状態ではPNGの圧縮が効かない。パレット化するだけで-73%になった
  • 色数を数値で絞ると絵として致命的な色が飛ぶことがある。品質指定に留めるほうが安全
  • 「描画が重い」の原因が画像の作り方にあることは十分あり得る

この記事で触れたドット絵を使っているアプリはこちらです。冷蔵庫の中身と賞味期限を管理して、 残っている食材からレシピを引けるようにしています。

関連

ドット絵つながりで、当サイトの攻略記事もどうぞ:

🔥人気記事ランキング
  1. 1Brotato キャラクター最強ティアリスト
  2. 2Dungeon Clawler 最強ビルドガイド
  3. 3Brotato ビルドガイド - キャラクター別の武器・アイテム戦略
  4. 4Everything is Crab 攻略ガイド - 初心者から上級者まで解説
  5. 5Mouthwashing(マウスウォッシング)攻略チャート - 進行ガイド+社員証カード5枚+全18実績

※ 直近28日間の閲覧数をもとに集計