検索
カテゴリツリー
トップ
  未整理
  iPhoneアプリ開発
      未整理
      画像処理
リンク

CD&DVD Press
プレスやってます!


TECHLOG
メモリの使いすぎで落ちる場合の対策
使用メモリが増えてくると、Level1エラーとかLevel2エラーとかでて、
最終的にLevel3エラーが出るとおちる。

メモリをログに出力するコード
struct task_basic_info t_info;
mach_msg_type_number_t t_info_count = TASK_BASIC_INFO_COUNT;
if( task_info(current_task(), TASK_BASIC_INFO, (task_info_t)&t_info, &t_info_count)!= KERN_SUCCESS )
{
	NSLog(@"%s(): Error in task_info(): %s",
		__FUNCTION__, strerror(errno));
}

//	物理メモリの使用量(byte)
u_int rss = t_info.resident_size;
NSLog(@"RSS: %u Bytes", rss);



◎ UIKitでの対策
[UIImage imageNamed:@"xxx"]

のように画像を確保すると、高速に読み込めるが、システムが不正落ちするまで、メモリに保持し続ける。
一般的にはシステム全体で使うような共用画像を読み込むんだと思う。

なので、ぱらぱらアニメとかを実現するためには、まじめに1行ずつ書いていく。
//	1. リソースから読み込む
NSString* path = @"test.jpg";
NSString* imagePath;
UIImage* img;
imagePath = [
	[NSBundle mainBundle]
	pathForResource: path.stringByDeletingPathExtension
	ofType: path.pathExtension
];
//※ NSStringのstringByDeletingPathExtensionは、パスからファイル名の部分のみを抽出する
//※ pathExtensionは、拡張子の部分のみを抽出する

//	2. UIImageをまじめに作る
img = [ [UIImage alloc] initWithContentsOfFile:imageFile];

//	3. UIImageViewにセットする
[imgView setImage:img];

//	4. 3.で参照カウントが増えるので、リリースしとく
[img release];


◎ cocos2d

CCTextureCacheというクラスで、一度読み込んだテクスチャは保持するが、
解放する処理が見つからない。

画像を一杯使うような部分では、こまめに解放してやるほうがよさそう。
CCTextureCache* cache = [CCTextureCache sharedTextureCache];
[cache removeUnusedTextures];

とする。 参照されていないテクスチャのみを消すため安心。
シーン遷移の時などにもやるとよいかも。

posted by admin at 2010年11月01日