フォーラム一覧   -   トピック一覧
   Flex Builder 2.0
     Listのアイテムレンダラが使用したメモリを開放するにはどうしたらよいのでしょうか
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 トピック
nori
投稿日時: 2006-11-13 21:08
お馴染みさん
登録日: 2006-8-17
居住地: 東京都渋谷区
投稿: 20
Listのアイテムレンダラが使用したメモリを開放するにはどうしたらよいのでしょうか
画像を並べたリストを作りたいと思いImageをアイテムレンダラに指定したListを作成したのですが、
スクロールする度に使用メモリがどんどん増えていってしまい、画像が開放されている気配がありません。

小さい画像だとほとんど気づかないですが、
大きい画像を使いWindowsタスクマネージャの
パフォーマンスのグラフを見ると使用メモリが
増えていくのがよく分かります。
(4000x3000ピクセル、670KByteのJPEGファイルで試しています)

Listの表示アイテムから外れたアイテムは自動的に開放される
ものだと思っていましたが、実際に開放されるように
するにはどこかで明示的に開放を指示する必要があるのでしょうか。

何か存知の方いらっしゃいましたらご助言いただけないでしょうか。

試したソースは下記のとおりです。
よろしくお願いします。



main.mxml

<?xml version="1.0" encoding="utf-8"?>
<mx:Application 
	xmlns:mx="http://www.adobe.com/2006/mxml" 
	layout="absolute"
	creationComplete="onCreationComplete()">
	
	<mx:Script>
	<![CDATA[
		import mx.collections.ArrayCollection;
		[Bindable] private var m_dp:ArrayCollection	= new ArrayCollection();
	
		private function onCreationComplete():void
		{
			var src:Array = [
				{source: "resource/bigImg1.jpg"},
				{source: "resource/bigImg2.jpg"},
				{source: "resource/bigImg1.jpg"},
				{source: "resource/bigImg2.jpg"},
				{source: "resource/bigImg1.jpg"},
				{source: "resource/bigImg2.jpg"},
				{source: "resource/bigImg1.jpg"},
				{source: "resource/bigImg2.jpg"},
				{source: "resource/bigImg1.jpg"},
				{source: "resource/bigImg2.jpg"}, 
			];
			m_dp	= new ArrayCollection(src);
		}
	]]>
	</mx:Script>
	
	<mx:List itemRenderer="MyRenderer" dataProvider="{m_dp}" width="300" />
	
</mx:Application>



MyRenderer.mxml

<?xml version="1.0" encoding="utf-8"?>
<mx:Image xmlns:mx="http://www.adobe.com/2006/mxml" source="{data.source}" >
</mx:Image>
n-kawai
投稿日時: 2006-11-14 13:57
ご主人様
登録日: 2006-1-16
居住地:
投稿: 206
Re: Listのアイテムレンダラが使用したメモリを開放するにはどうしたらよいのでしょうか
試してみました。
スクロールUp&Downを繰り返すと、面白いようにメモリ使用量が
増えていきます。

IE6+FP9.0.16です。
Firefox2+FP9.0.21.75でも、最初はメモリが減るような挙動が
ありましたが、しつこくやっていたらメモリ使用量が増えました。

致命的バグのような気がします。フォトサイト作れない
まずは、「小人」さんがバグレポートを報告するかも...

# リソース解放の制御をコードで指定する方法があるかは
# 時間があれば調べて...

-----
Listではないですが、Adobeさんのサンプルアプリ(フォト系)で
同じようにスクロールさせましたが、メモリの増減はありますが、
増え続けることは無いようです。
使い方の問題なのか
Pepe
投稿日時: 2006-11-14 14:38
モデレータ
登録日: 2006-1-10
居住地: 千葉県市川市南部(浦安との境)
投稿: 1206
Re: Listのアイテムレンダラが使用したメモリを開放するにはどうしたらよいのでしょうか
試していないのであれですが
ガベージコレクトの前提として
"どのオブジェクトからも参照されていない"があります。
なので、例えListから表示されなくなったとしても
dataProviderがそのオブジェクトを参照している限りは
オブジェクトが使用しているメモリは開放されない
(= キャッシュされる)と思います。

つまり、画像をListなどにitemRenderer経由で
表示するとitemRendererで生成されたインスタンスは
dataProviderに参照されたままになり、メモリ開放=
ガベージコレクト対象にはならず、かつ、ビットマップキャッシュ
されると思います。

もしかしたら、List、もしくは、Imageクラスの
ビットマップキャッシュ設定をオフにしてメモリ使用量を
抑えられるかもしれません。ただ、Image、かつ、
外部リソースなので通常のレンダリングキャッシュと
動きが違う気がしますが....

試してないです、おいらの推測です m(__)m
Pepe
投稿日時: 2006-11-14 15:29
モデレータ
登録日: 2006-1-10
居住地: 千葉県市川市南部(浦安との境)
投稿: 1206
Re: Listのアイテムレンダラが使用したメモリを開放するにはどうしたらよいのでしょうか
ちょっと、今確認したら表示するたんびに

 インスタンス生成 ⇒ レンダリング

してるっぽいですね、う〜ん....(;一_一)

nori
投稿日時: 2006-11-14 15:38
お馴染みさん
登録日: 2006-8-17
居住地: 東京都渋谷区
投稿: 20
Re: Listのアイテムレンダラが使用したメモリを開放するにはどうしたらよいのでしょうか
n-kawaiさん、pepeさん、レスありがとうございます。


> Firefox2+FP9.0.21.75でも、最初はメモリが減るような挙動が
> ありましたが、しつこくやっていたらメモリ使用量が増えました。
>

IEでは全く開放されている様子は見られませんが、
Firefoxでは使用メモリが減ったり増えたりしているので
一応開放を試みたりしているようですね。
Firefoxに限りデータプロバイダを設定しなおすと
一旦メモリが開放されたような動きをしています。

私の環境ですが
 IE6.0.29+FP9.0.16
 Firefox2.0+FP9.0.16
になっています。



> もしかしたら、List、もしくは、Imageクラスの
> ビットマップキャッシュ設定をオフにしてメモリ使用量を
> 抑えられるかもしれません。
>

ListとImageにそれぞれ

 cacheAsBitmap="false"
 cachePolicy="off"

を設定して、使用メモリが積もったところでデータプロバイダを
開放(nullをセット)してみたのですが開放されませんでした

やはりFlashのバグということで修正待ちでしょうか…
Pepe
投稿日時: 2006-11-14 16:15
モデレータ
登録日: 2006-1-10
居住地: 千葉県市川市南部(浦安との境)
投稿: 1206
Re: Listのアイテムレンダラが使用したメモリを開放するにはどうしたらよいのでしょうか
やっぱし、

リストの"行"を表示するたびに

 インスタンス生成 ⇒ イメージをロード(autoLoad が true) ⇒ レンダリング

をしていますね。

なので、リストの表示から外れたオブジェクトは
ガベージコレクト行きになるはずです。

ただし、ガベージのパージングのタイミングが
どこにも記載されていないので分からないのですが、
もし、どこまでやってもメモリ開放されないのであれば
FlexFramework内で破棄されたはずのオブジェクトを
参照し続けてしまっている可能性がありますね...



<?xml version="1.0" encoding="utf-8"?>
<mx:Image xmlns:mx="http://www.adobe.com/2006/mxml" source="{data.source}" autoLoad="false" >
  <mx:creationComplete>
    <![CDATA[
      trace(this.source);
    ]]>
  </mx:creationComplete>
</mx:Image>


「trace」にデバッグポイントを設定すると
リストのスクロールをするたびに止まります。
しかも、一度表示した"行"までも再インスタンスかしてますね。
(マジっすか...)
ってことは、itemRendererではヘビーなコンポーネントは
使用できないってことになりますね...w
Pepe
投稿日時: 2006-11-14 16:27
モデレータ
登録日: 2006-1-10
居住地: 千葉県市川市南部(浦安との境)
投稿: 1206
Re: Listのアイテムレンダラが使用したメモリを開放するにはどうしたらよいのでしょうか
Flex 2.0.1 では大丈夫かも ^_^;
少なくとも引用:
リストの"行"を表示するたびに
 インスタンス生成 ⇒ イメージをロード(autoLoad が true) ⇒ レンダリング
はしないです。
ただちょっと気になる微妙な動きをしてるけど...
nori
投稿日時: 2006-11-15 13:29
お馴染みさん
登録日: 2006-8-17
居住地: 東京都渋谷区
投稿: 20
Re: Listのアイテムレンダラが使用したメモリを開放するにはどうしたらよいのでしょうか
pepeさん、いろいろ調べていただいてありがとうございます。


> Flex 2.0.1 では大丈夫かも ^_^;
>

2.0.1ではメモリが開放されない問題を回避できるということですか?
私のFlexのバージョンは 2.0.1147081 なのですが方法があるのでしょうか
dsh
投稿日時: 2006-11-15 14:24
ご主人様
登録日: 2006-3-29
居住地: 東京
投稿: 237
Re: Listのアイテムレンダラが使用したメモリを開放するにはどうしたらよいのでしょうか
noriさん、はじめまして。

引用:
画像を並べたリストを作りたいと思いImageをアイテムレンダラに指定したListを作成したのですが、
スクロールする度に使用メモリがどんどん増えていってしまい、画像が開放されている気配がありません。


実は私も似たような仕組みに対して、お客さんから「Flash Player 9のメモリ使用量が一向に減らない」と報告を受け調べた事があります。

Grant Skinner氏のこのblogエントリによると、Flash Player 9のガベージコレクションの仕組みは、「Deferred Reference Counting (DRC) 」と「mark & sweep」の組み合わせです。
http://www.gskinner.com/blog/archives/2006/06/as3_resource_ma.html

「Deferred」なので、ガベージコレクションは「遅れて」起きます。
プログラマは一切メモリが開放されるタイミングをコントロールできず、
それがいつかはFlash Player 9が決めるということです。

これは、見かけ上はFlash Playerの"メモリリーク"のように見えますが、"仕様"ということになるようですね。
いつメモリを開放するかは全く分からないしコントロールできない訳なので(もしかしたら、沢山メモリがあるマシン環境では、本当に空きメモリが少なくなるまで開放しないのかも…)。

私の場合、試しにムービーの再生後10分位待ってみたらメモリ使用量が減りました。
#ただ、観察はしてみたものの、
#GCの挙動のクセなどは良く分かりませんでした。

また、こちらのエントリには、
Flash PlayerにフルGCを行わせるためのハックとして、
以下のようなコードが掲載されていました。
http://www.gskinner.com/blog/archives/2006/08/as3_resource_ma_2.html

try {
   new LocalConnection().connect('foo');
   new LocalConnection().connect('foo');
} catch (e:*) {}
// the GC will perform a full mark/sweep on the second call.

Pepe
投稿日時: 2006-11-15 14:35
モデレータ
登録日: 2006-1-10
居住地: 千葉県市川市南部(浦安との境)
投稿: 1206
Re: Listのアイテムレンダラが使用したメモリを開放するにはどうしたらよいのでしょうか
引用:
私のFlexのバージョンは 2.0.1147081 なのですが方法があるのでしょうか

それは【FlexBuilder 2】のバージョンではないでしょうか...??

ちなみに【FlexFramework 2】のバージョンは下記フォルダの
${Flex2インストールルート}\Flex SDK 2\frameworks\source\mx\core
【Version.as】の中に記載されていますよ (^^♪

さらにちなみに、【mxmlc.exe】などのバージョンは
コマンドプロンプトから
# mxmlc -version
で、表示されます。


引用:
2.0.1ではメモリが開放されない問題を回避できるということですか?

まだ試してないので、やってみます...m(__)m


さらにさらにちなみに【Flex 2.0.1】はLabsにアップされている
Mac版FlexBuilder2 Betaに搭載されているだけで
まだ正式版はリリースされていましぇん、残念ながら m(__)m
来年の"早め"にはリリースしたいと
誰かが言っていたような、言っていなかったような... ^_^;
(1) 2 »
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を