RORK LABEN
TOOLING — Rorkの開発者向けリポジトリが動き続けています。rork-xcodeが7月16日、rork-deviceが7月15日、rork-plistが7月13日に更新されましたOPUS46 — RorkでClaude Opus 4.6が稼働しています。Rork MaxはClaude Codeを土台にアプリを組み立てる設計ですSIM — ブラウザ上で動くクラウドのiOSシミュレータを備え、実機へのインストールは1クリック、App Storeへの提出は2クリックと案内されていますMAX — Rork MaxはReact Nativeではなく純粋なSwiftを出力します。iPhone・iPad・Apple Watch・Apple TV・Vision Pro、そしてiMessageまでが射程ですNATIVE — HealthKit、ARKitとLiDAR、NFC、Dynamic Island、Live Activities、Metalによる3D、Core MLのオンデバイス推論まで扱えますSEED — RorkはLeft Lane Capitalが主導する1,500万ドルのシードラウンドを実施し、Peak XVとa16z Speedrunが参加しましたTOOLING — Rorkの開発者向けリポジトリが動き続けています。rork-xcodeが7月16日、rork-deviceが7月15日、rork-plistが7月13日に更新されましたOPUS46 — RorkでClaude Opus 4.6が稼働しています。Rork MaxはClaude Codeを土台にアプリを組み立てる設計ですSIM — ブラウザ上で動くクラウドのiOSシミュレータを備え、実機へのインストールは1クリック、App Storeへの提出は2クリックと案内されていますMAX — Rork MaxはReact Nativeではなく純粋なSwiftを出力します。iPhone・iPad・Apple Watch・Apple TV・Vision Pro、そしてiMessageまでが射程ですNATIVE — HealthKit、ARKitとLiDAR、NFC、Dynamic Island、Live Activities、Metalによる3D、Core MLのオンデバイス推論まで扱えますSEED — RorkはLeft Lane Capitalが主導する1,500万ドルのシードラウンドを実施し、Peak XVとa16z Speedrunが参加しました
記事一覧/アプリ開発
アプリ開発/2026-05-30中級

iOSの壁紙アプリでサムネイル一覧のカクつきを消す — ImageIOダウンサンプリングの実装メモ

大量のサムネイルを並べるとスクロールがカクつき、メモリも膨らむ。原因はメインスレッドでのフルサイズ画像デコードでした。ImageIOによるダウンサンプリングとプリフェッチで、実測でメモリを約80%削減した過程をまとめます。

iOS108Swift48パフォーマンス30UICollectionViewImageIO

プレミアム記事

サムネイルを並べた瞬間にスクロールが詰まる

私は2014年から個人開発を続けていて、壁紙アプリは累計5,000万ダウンロードを超えるまでになりました。長く運用していると、初期のコードがそのまま残っている箇所が必ず出てきます。今回つまずいたのもそこでした。

サムネイルの一覧画面で、画像が数十枚を超えたあたりからスクロールが目に見えてカクつくのです。指を離した後の慣性スクロールが小刻みに引っかかり、端末によってはメモリ警告まで出る。手元のiPhoneで計測すると、一覧を一度開いただけでアプリのメモリ使用量が約480MBまで跳ね上がっていました。スクロール中のフレームレートも40fps前後まで落ち込み、ProMotion対応端末の滑らかさが完全に殺されていました。壁紙という性質上、扱う画像が大きいことは分かっていましたが、サムネイルの表示にここまで食うのは明らかに何かがおかしい。

原因はメインスレッドでのフルサイズデコードだった

コードを追っていくと、原因は二つ重なっていました。

ひとつは、UICollectionViewcellForItemAt の中で画像を同期的にデコードしていたこと。UIImage(contentsOfFile:) は一見すると軽い処理に見えますが、実際にピクセルへ展開(デコード)されるのは画像が描画される瞬間です。つまりスクロールで新しいセルが出てくるたびに、メインスレッド上で重いデコードが走っていたわけです。これがフレーム落ちの直接的な原因でした。

もうひとつは、サムネイル表示なのにフルサイズ画像をそのまま読み込んでいたこと。表示領域はせいぜい一辺200ポイント程度なのに、3000ピクセル四方を超える元画像をメモリ上に展開していました。展開後のビットマップは「幅 × 高さ × 4バイト」で効いてくるので、たとえば3000×3000の画像は1枚で約36MBになります。これを画面ぶん何枚も保持すれば、あっという間に数百MBです。これがメモリ膨張の正体でした。

公式のサンプルでも UIImage(named:)contentsOfFile: がよく登場しますが、一覧表示で大量に扱う場面では、このまま使うと破綻します。公式ドキュメントには「一覧では縮小してから持て」と明示されていないのが、この落とし穴にハマる人が多い理由だと思います。表示に必要なサイズまで「読み込む段階で」縮小しておくのが実務上の正解です。

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

この記事の続きを読む

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

この記事で得られること
cellForItemAt の同期デコードでスクロールが詰まり、メモリが480MBまで膨らむ仕組みを理解できる
CGImageSourceCreateThumbnailAtIndex を使ったダウンサンプリングの実装コードと、各オプションの意味を習得できる
プリフェッチ・NSCache・セル再利用キャンセルまで含めた、メモリを約80%削減して60fpsを保つ構成を再現できる
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

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

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

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

関連記事

アプリ開発2026-07-03
Rork Max アプリで通信の切断と復帰に強くする — NWPathMonitor によるオフライン検知と再送設計
Rork Max のネイティブ Swift アプリで、電波が切れても壊れない通信設計を NWPathMonitor で組み立てます。オフラインの検知、Low Data Mode やモバイル回線の判定、復帰時の自動再送キューまで、動く Swift コードで示します。
アプリ開発2026-07-03
Rork Max アプリでダウンロードをアプリ終了後も続ける — バックグラウンド URLSession の設計と再起動復帰
Rork Max のネイティブ Swift アプリで、アプリがサスペンド・終了されてもダウンロードを OS 側で継続させるバックグラウンド URLSession の設計を解説します。再起動復帰・resumeData・isDiscretionary の実測挙動まで動くコードで示します。
アプリ開発2026-06-16
初回起動の前に壁紙パックを落としておく — Rork Max と Background Assets の使いどころ
コンテンツの多いアプリは、初回起動時に空のグリッドを見せてしまいがちです。アプリ本体とは別枠でコンテンツを先回りして落とす Background Assets を、Rork(Expo)では届かない領域として Rork Max のネイティブ Swift でどう実装するか、運用判断まで含めてまとめます。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →