4

まず、このサイトの皆さん、ありがとうございました... iOSプログラミングの恩恵を受けることは間違いなく役に立ちました。メモリ使用量の多いグラフィックスレンダリングのためにARCのメモリを解放するにはどうすればいいですか?

私の現在の問題:

私は写真の非常に定型化されたバージョンをレンダリングするアプリを持っています。いくつかのCoreImageフィルタを使用しますが、重い画像処理を行うにはCoreGraphicsの束が必要です。

プロキシサイズのレンダリングはうまくいくが、フル解像度の画像をレンダリングすると、メモリ使用量が高いためにクラッシュすることがある。問題は、レンダリング時に複数のフル解像度(3264x2448)のバッファをメモリに確保する必要があることです。私は何をどのようにしてより多くのメモリを解放するのか分からない。 CGImageReleaseのどこにでも一致することに非常に注意してきました。

ARCでは、実際に何かが解放され解放されたかどうかをどのように知ることができますか?オブジェクトをnilに設定しても、実際には何もしません。

これをディスクにストリームすることはできません。

いずれの提案も非常に高く評価されます。

感謝!

+1

私はCoreImageが実際にメモリ豚だったことを知りました。うわー!効率的であると思われるものについては、明らかにそうではないようです。私はパイプラインに5〜6個のシンプルなCoreImageフィルタを設定して、通常の輝度/コントラスト/彩度/色合いの操作を同じ画像の行に加えました。 CoreImageはすべてのオーバーヘッドを低く保ち、イメージを要求するときにのみイメージをレンダリングすることになっていますが、それはかなり豚のようです。それらの単純な操作のために、それはメモリの135メガバイトを使用していた!私はCoreImageのものを缶詰めし、自分自身を書きました、そして、今でも30MBを打つことはありません。レッスンで学んだことは... – pizzafilms

答えて

8

ARCは、このような状況に違いはありません。

自分でreleaseに電話する必要はありません。

非ARCの場合、メモリーが不足している状況では、実際には必要でないプロパティー(必要に応じて再作成できることを意味します)を解放したい場合があります。 ARCの下

- (void)didReceiveMemoryWarning: 
{ 
    [ _myProperty release ]; 

    _myProperty = nil; 

    [ super didReceiveMemoryWarning ]; 
} 

あなたがreleaseを呼び出す必要はありませんを除いて、それは、まったく同じです:

- (void)didReceiveMemoryWarning: 
{ 
    _myProperty = nil; 

    [ super didReceiveMemoryWarning ]; 
} 

nilにあなたのプロパティを設定、ARCの下で、自動的にそれを解放します。
これは本当に何かをします。

それがうまくいかない場合は、別の問題があります。
メモリリークやretain cyclesがないことを確認してください。

最後のものは確かに問題がある...あなたが一度にタイルあなたの画像やその一部にのみ仕事をすべき

+0

Leaks and Allocationsツールを使ってリークを探していますが、漏れはありません。限り何かを設定する限り、私は両方の方法について多くを読んだ。私はそれを撃つだろう。どうも。 – pizzafilms

0

。最終的には全体の出力画像領域をカバーするようにループに

[myContext drawImage:myImage atPoint:P fromRect:tileBounds]; 

PtileBoundsを変更する:あなたは、あなたの CIImageを作成し、呼び出すことによってこれを行うことができます。

+0

ありがとうございますが、CoreGraphicsのぼかしタイプの関数では、タイリングがうまく機能しません。 – pizzafilms

+0

正しく設定しても問題ありません。そのような場合は適切にタイル化されています。 ["ROIメソッドの提供"(http://developer.apple.com/library/mac/#documentation/graphicsimaging/Conceptual/CoreImaging/ci_custom_filters/ci_custom_filters.html#//apple_ref/doc/uid/TP30001185-CH207)を参照してください。 -TPXREF101)。 [この記事](http://lists.apple.com/archives/quartz-dev/2010/Apr/msg00058.html)は、すでに内部的にタイリングされていることを示しています。とにかく、CoreImageが内部的に行うよりスマートな方法でメモリを制御できるように、私はそれを試してみましょう。 – user1118321

+0

CoreImageのぼかしはiPhone上では利用できません(いいです)ので、CoreGraphicsコンテキストを使用する独自のぼかしフィルタを作成しました。エッジなどのためにタイル表示することはできませんが、一発。どうも。 – pizzafilms

2

これは示唆されているように(ただし明示されていません)、これはARCの問題ではありません。

30 MBその解像度のメモリに1つのイメージを保存するメモリ(3264x2448、1ピクセルあたり32ビットを想定)。そして、あなたがメモリに必要なそのサイズのバッファーの数は言うまでもありませんが、それは少なくとも3つのように聞こえます。あなたは基本的に多くのiOSデバイスのためのメモリ制限があります(元のiPadとiPhone 3GSは256MB 合計です。そのうちの3つ目にアクセスすることができます。あなたのアプリに利用可能なメモリは非常に可変です。

ARCはガベージコレクションと似ていません。ちょうどreleaseretainの文がコンパイル時に追加されます。コードを正しく構成していれば、イメージは不要になったら解放されます。あなたがARCをオフにした場合(コンパイルフラグを使用してファイル単位でファイルに対して行うことができます)、同じ結果が表示されることを強く疑っています。

誰かがすでに投稿しているので、これを回避する方法は画像を並べて、一度に小さなサンプルで作業することです。あなたのぼかしアルゴリズムがそれに対処することができないなら、あなたは恐らくそれを書く必要があるでしょう!

関連する問題