◉RORK LABEN
●EXPO — EAS Observe がネイティブクラッシュも記録(10/07)。SDK 57 は 57.0.21 以降で確認できます●SDK 58 — SDK 58 Beta は 9/15 公開。stable の日付はまだ未確認です●RN 0.88 — React Native 0.88.x の正式リリース予定は 10/12、残り3日●Q&A — expo-widgets が本番ビルドだけ真っ黒になる、という問いが出ています●RORK — 09-29 に GPT-6.1 Sol を追加。Pro・Max プランで利用できます●NEW — クライアントのアプリを作る前に決める、公開アカウントの持ち主●EXPO — EAS Observe がネイティブクラッシュも記録(10/07)。SDK 57 は 57.0.21 以降で確認できます●SDK 58 — SDK 58 Beta は 9/15 公開。stable の日付はまだ未確認です●RN 0.88 — React Native 0.88.x の正式リリース予定は 10/12、残り3日●Q&A — expo-widgets が本番ビルドだけ真っ黒になる、という問いが出ています●RORK — 09-29 に GPT-6.1 Sol を追加。Pro・Max プランで利用できます●NEW — クライアントのアプリを作る前に決める、公開アカウントの持ち主
記事一覧/開発ツール
⬡ 開発ツール/2026-06-24上級

Rork Max の SwiftUI グリッドが画像でカクつくときに効く、スクロール最適化

Rork Max が生成した SwiftUI の画像グリッドがスクロールでカクつく原因を計測し、ImageIO のダウンサンプリング・デコードのバックグラウンド化・セルの安定化で実機のヒッチを減らす実装手順をまとめました。

Rork Max235SwiftUI66パフォーマンス33画像処理4LazyVGrid

✦ プレミアム記事

Rork Max に「壁紙を並べるグリッド画面を作って」と頼むと、数分で動く SwiftUI が返ってきます。シミュレータでは滑らかです。ところが実機に載せて、4K の壁紙を数十枚スクロールさせた瞬間、指の動きにスクロールが付いてこなくなる。私自身、個人開発で運用している壁紙アプリ Beautiful HD Wallpapers のグリッドを Rork Max で組み直したとき、まさにこの状態に出くわしました。

原因は Rork Max の生成が雑だからではありません。生成されたコードは「画像をそのまま表示する」素直な実装で、これはサンプル画像が小さいうちは正しく動きます。問題は、実アプリで扱う画像が生成時の想定より遥かに大きいことです。ここでは、その素直な実装をどこから直すと実機のスクロールが戻るのかを、計測と一緒に追っていきます。

生成直後のグリッドが実機でカクつく理由

Rork Max が最初に出してくるグリッドは、だいたい次のような形をしています。

struct WallpaperGrid: View {
    let items: [Wallpaper]
    private let columns = [GridItem(.adaptive(minimum: 110), spacing: 2)]
 
    var body: some View {
        ScrollView {
            LazyVGrid(columns: columns, spacing: 2) {
                ForEach(items) { item in
                    // 生成直後によくある形。URL からフル解像度をデコードして縮小表示するため、
                    // 大きな画像が並ぶとメインスレッドでのデコードが重なり、スクロールが詰まります。
                    AsyncImage(url: item.fileURL) { image in
                        image.resizable().scaledToFill()
                    } placeholder: {
                        Color(.secondarySystemBackground)
                    }
                    .frame(width: 110, height: 110)
                    .clipped()
                }
            }
        }
    }
}

このコードの何が重いのか。AsyncImage は受け取った画像を「表示サイズに合わせて自動で軽くする」ことはしません。3024×4032 の壁紙であれば、110ポイント四方のセルに収めるためであっても、いったんフル解像度をビットマップに展開します。1枚あたり数十MBのメモリを使い、その展開(デコード)がメインスレッドで起きると、その間フレームが描けず、スクロールが一瞬止まります。これがセルの数だけ連鎖するのが、カクつきの正体です。

公式ドキュメントには「AsyncImage は手軽」とは書かれていますが、「大量の高解像度画像には向かない」とは強調されていません。実際に重い画像を流して初めて分かる落とし穴です。

まず計測する — 体感ではなく数値で

「カクついている気がする」だけで直し始めると、効いたかどうかが分からなくなります。先に計測の足場を作ります。

Xcode の Instruments で Animation Hitches テンプレートを選び、実機で対象のグリッドをスクロールします。見るのは「hitch time ratio(ミリ秒/秒)」です。これは1秒のスクロールあたり、何ミリ秒フレームが遅れたかを表します。Apple の目安では 5 ms/s を超えると体感に出始め、10 ms/s を超えると明確に引っかかります。

症状計測で見える兆候主な原因
スクロール開始時に一瞬固まるTime Profiler でデコード関数がメインスレッドに乗るフル解像度のデコード
速くスクロールするとカクつくhitch time ratio が 10 ms/s 超セルごとの再デコード・再描画
下にスクロールするほど重くなるメモリ使用量が右肩上がりデコード済みビットマップの解放漏れ

私はこの計測を「直す前」「1つ直すごと」に取ることを習慣にしています。後述のダウンサンプリングだけで hitch が大きく下がることが多く、どこまでやれば十分かの判断が数値でつくからです。リリース後も Xcode Organizer の「Hitch Rate」で実ユーザーの値を追えるので、検証用の足場としても使えます。

✦

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

この記事の続きを読む

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

この記事で得られること
✦壁紙のような画像グリッドでスクロールが詰まっていた人が、ヒッチを減らす具体的な実装を今日から試せる
✦フル解像度画像をそのまま読み込む実装を、ImageIO のサムネイル生成で省メモリなものに置き換えられる
✦Instruments の Hitches で hitch time ratio(5 ms/s が体感の目安)を数値で確認し、改善の前後を比較できる
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

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

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

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

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

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

関連記事

⬡ 開発ツール2026-07-18
文字サイズ最大とドイツ語で、生成された画面は静かに詰まる — Rork Max の SwiftUI にレイアウト耐性の検証を通した記録
Rork Max が生成した SwiftUI 画面を疑似ローカライズと最大文字サイズに通し、どこから詰まるかを機械的に洗い出した記録です。ViewThatFits・ScaledMetric・layoutPriority の使いどころと、再生成のたびに回帰を捕まえるスナップショット検証を、実際の数値とともにまとめました。
⬡ 開発ツール2026-05-17
Rork Max の SwiftUI 機能を壁紙アプリ開発で検証した結果 — 実際に動いた機能と手を入れた機能
運用中の壁紙アプリの本番コードを基準に、Rork Max の SwiftUI ネイティブ生成を検証しました。そのまま使えた機能、手を入れた機能、生成を諦めた機能を、動くコードと実機での計測値とともにお伝えします。
⬡ 開発ツール2026-05-12
Rork Max で複数アプリ共通UIライブラリを Swift Package Manager で構築する実践ガイド
複数アプリを運営する個人開発者向けに、Swift Package Managerで共通UIライブラリを構築してRork Max生成コードの重複を排除する手順です。パッケージ構成の設計、テーマシステムとカードコンポーネント、アニメーションプリセットの共通化、テストまで詳解します。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます