RORK LABEN
FUNDING — RorkがLeft Lane Capital主導で$15Mのシードを調達。Peak XV・True Ventures・Goodwater・a16z Speedrunが参加しましたENGINE — Rork MaxはClaude CodeとClaude Opus 4.6で駆動。X で800万超のビューを集め、2週間で年間売上を倍増させましたSWIFT — Rork MaxはWebで初めてSwiftアプリを生成できるビルダーで、Apple伝統のXcodeを置き換える位置づけですPRODUCT — Rork MaxはiPhone・iPad・Apple Watch・Apple TV・Vision Pro・iMessageまでApple全域に対応しますCLASSIC — 通常のRorkはReact Native(Expo)で、英語の説明だけからiOS/Androidアプリを生成しストア配信できますPRICING — 無料で始められ、有料は月25ドル〜。Rork Maxは月200ドルですFUNDING — RorkがLeft Lane Capital主導で$15Mのシードを調達。Peak XV・True Ventures・Goodwater・a16z Speedrunが参加しましたENGINE — Rork MaxはClaude CodeとClaude Opus 4.6で駆動。X で800万超のビューを集め、2週間で年間売上を倍増させましたSWIFT — Rork MaxはWebで初めてSwiftアプリを生成できるビルダーで、Apple伝統のXcodeを置き換える位置づけですPRODUCT — Rork MaxはiPhone・iPad・Apple Watch・Apple TV・Vision Pro・iMessageまでApple全域に対応しますCLASSIC — 通常のRorkはReact Native(Expo)で、英語の説明だけからiOS/Androidアプリを生成しストア配信できますPRICING — 無料で始められ、有料は月25ドル〜。Rork Maxは月200ドルです
記事一覧/開発ツール
開発ツール/2026-06-24上級

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

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

Rork Max185SwiftUI54パフォーマンス25画像処理2LazyVGrid

プレミアム記事

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/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

開発ツール2026-06-24
発熱と省電力モードに合わせて、重い処理を静かに落とす設計
ProcessInfo の thermalState と省電力モードを監視し、発熱時やバッテリー残量が少ないときに重い処理を段階的に落とす実装を、Swift のコードとともに整理します。
開発ツール2026-05-10
Rork Max + Swift Charts でアプリにグラフを実装する手順と、データ点が増えると重くなる原因
Rork Max が生成する SwiftUI コードに Swift Charts を組み込む流れと、1,000 点を超えたあたりからカクつき始める原因、そして実機で滑らかに描画させるための間引きとアニメーション制御の実装パターンを共有します。
開発ツール2026-06-24
電話・イヤホン抜き・他アプリ再生に強い、音声アプリの中断ハンドリング
AVAudioSession の中断通知とルート変更通知を正しく扱い、電話やイヤホン抜き差しで再生が破綻しない音声アプリを、Swift の実装コードとともに整理します。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →