1

91枚の画像の画像をキャッシュしたい。そして、すべての画像は約50MBです。たくさんのメモリが使い果たされているようです。

私のコードはここにあります。効率的なメモリのための最良の方法は何ですか?

lG2Image[0] = [[UIImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"background" ofType:@"png"]];
lG2Image[1] = [[UIImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"myimage1" ofType:@"png"]];
lG2Image[2] = [[UIImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"myimage2" ofType:@"png"]];
...


UIImageView* tmp;

for (int i=0; i<91; i++) {
    tmp = [[UIImageView alloc] initWithImage:lG2Image[i]];
    [_window addSubview:tmp];
    [tmp removeFromSuperview];
    tmp = nil;
}
4

2 に答える 2

0

再利用できUIImageViewます。

iPhone の画面サイズは固定です。つまり、表示される領域は固定されています。たとえば、表示可能な画面に 3 つの画像を表示する場合は、3 つUIImageViewの s を作成するだけで、ビューが移動したときに、現在表示されているビューの位置に従って新しい画像をロードでき、表示されていない画像を解放できます。

を使用すると、このLazyTableImagesUITableViewを見ることができます。

于 2012-07-22T09:01:00.067 に答える
0

2 つのオプションがあります。オプション 1、単純にゲームの画像要素を「必要に応じて」ロードします。これが 2D ゲームの場合は、要素が画面に表示されようとしているときに要素をロードします。オプション 2、画像データを BGRA 形式の生のピクセル ファイルに解凍し、[NSData dataWithContentsOfMappedFile] と CGDataProviderCreateWithData() を CGImageCreate() と共に使用して、UIImage としてラップする CGImageRef を作成します。2 番目のアプローチは非常に低レベルですが、リソースにアクセスするたびに画像の内容を再度解析する必要がなくなります (解凍された画像データは既にファイルに格納されています)。また、Apple は CoreGraphics が 2D 画像を読み取る方法を最適化し、メモリの内容全体がグラフィック メモリにコピーされるのではなく、メイン メモリにとどまるようにしました。つまり、この方法で大量の画像をロードできるということです。できれば、最初にオプション #1 を試してみます。メモリ内のすべてを同時に必要とすることはないでしょう。ただし、オプション 2 では、iOS アプリケーションがファイルからマップできる約 700 メガバイトの作業メモリが得られます。これは、通常のメモリとして割り当てることができるよりもはるかに多くなります。

于 2013-06-21T04:50:01.993 に答える