1

60 個の画像をレンダリングしていますが、メモリ警告が表示されます。以下の私のコードへのより良いアプローチはありますか?

- (void)change{
    for (int aniCount = 1; aniCount < 60; aniCount++) {
        if ([UIScreen mainScreen].bounds.size.height == 568) {
           self.renderString = [NSString stringWithFormat: @"%i_5.png", aniCount + 1];
           self.imageView.image = [UIImage imageNamed:@"1_5.png"];
        }else{
            self.renderString =  [NSString stringWithFormat: @"%i.png", aniCount + 1];
        }
        // here is the code to pre-render the image
        UIImage *frameImage = [UIImage imageNamed:self.renderString];
        UIGraphicsBeginImageContext(frameImage.size);
        CGRect rect = CGRectMake(0, 0, frameImage.size.width, frameImage.size.height);
        [frameImage drawInRect:rect];
        UIImage *renderedImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();

        [self.menuanimationImages addObject:renderedImage];
    }

    self.imageView.animationImages = [NSArray arrayWithArray: self.menuanimationImages];
 }

このメソッドは私の- (void)viewDidLoad

アプリ画面の例: https://www.youtube.com/watch?v=2f80UcLhOW8

4

1 に答える 1

2

画面解像度のチェックから、これらが全画面画像であると推測できますか? もしそうなら、60 個の画像でフルスクリーン アニメーションを実行するには、途方もない量のメモリが必要であり、メモリの警告が表示されても不思議ではありません。各画像を で使用するUIImageView場合、1 ピクセルあたり少なくとも 4 バイトが必要です。

4 インチ画面の非網膜画像の場合、60 個のフルスクリーン画像には約 42 MB が必要です。これらが網膜画像 (解像度が 2 倍) の場合、166 mb にジャンプします。考慮するときに PNG ファイルのサイズを見ないでください。 PNG ファイルはある程度圧縮されていますが、アプリで使用すると圧縮が解除されるため、使用されるメモリの量。

通常、フルスクリーン画像を多く使用してアニメーション化することは望ましくありません。おそらく、UIKit アニメーションまたは Core Animation (または他の同様のテクノロジ) を使用して、ビューをプログラムでアニメーション化することを検討することをお勧めします。または、実際に画像のシーケンスを使用する必要がある場合は、アニメーション化された部分を画面の小さな部分に制限できるかどうかを確認してください。これにより、使用する画像が小さくなり、必要なメモリがはるかに少なくなります。

アニメーションがどのように見えるかを知らずに言うのは難しい. アニメーションについて説明していただければ (または画面のスナップショットを 1 つか 2 つ見せていただければ)、メモリをあまり使用しない方法を提案できると思います。


あなたのコメントで、望ましい万華鏡効果を特徴とするビデオへのリンクを共有しました。いくつかの考え:

  1. 最初に、万華鏡のような効果をプログラムでレンダリングする方法に焦点を当てます。ここでの複雑さを考えると、この万華鏡のような効果をレンダリングするための「OpenGL ES」アプローチを研究することにつながるかもしれません。いくつかの既存の実装に出くわす可能性さえあります。

  2. CIKaleidoscopeCore Image フィルターがありCITriangleKaleidoscope、探している効果を生成するのに役立つ可能性があることに気付きました (これら 2 つのフィルターの詳細については、 Core Image Filter Referenceを参照してください)。それらがここで完全に正しいとは思いませんが、チェックアウトしてください。

  3. 万華鏡をプログラムでレンダリングする上記の試みに失敗した場合、少なくとも、万華鏡効果が水平方向と垂直方向の両方で対称であるように見えることを考えると、現在の実装のメモリ要件を 4 分の 1 に減らすことができると思います。したがって、理論的には、左上象限の一連の画像を作成し、他の 3 つを同じ画像の変換としてレンダリングすることができます。

  4. または、フル スクリーン ビデオを作成し、メディア プレーヤー フレームワークを使用して再生することもできます。

フルスクリーン画像のシーケンスを介してアニメーションを作成する前に、おそらくこれらの一連の調査を使い果たしたでしょう。フルスクリーン画像は、この種の問題に対処するためのメモリ効率の悪い方法であり、ほぼ確実に問題に直面する可能性があります. また、iPad でアプリを表示することを検討したり、より長いシーケンスを検討したりする場合は、一連のフルスクリーン画像のアプローチはまったく受け入れられない可能性があります.

于 2014-02-07T17:36:18.573 に答える