フォーラム一覧 - トピック一覧 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 MyRenderer.mxml |
| 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内で破棄されたはずのオブジェクトを 参照し続けてしまっている可能性がありますね... 「trace」にデバッグポイントを設定すると リストのスクロールをするたびに止まります。 しかも、一度表示した"行"までも再インスタンスかしてますね。 (マジっすか...) ってことは、itemRendererではヘビーなコンポーネントは 使用できないってことになりますね...w |
| Pepe | 投稿日時: 2006-11-14 16:27 |
モデレータ ![]() ![]() 登録日: 2006-1-10 居住地: 千葉県市川市南部(浦安との境) 投稿: 1206 |
Re: Listのアイテムレンダラが使用したメモリを開放するにはどうしたらよいのでしょうか Flex 2.0.1 では大丈夫かも ^_^;
少なくとも引用: リストの"行"を表示するたびに ただちょっと気になる微妙な動きをしてるけど... |
| 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 |
| 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 » | |
| スレッド表示 | 新しいものから | 前のトピック | 次のトピック | トップ |
| 投稿するにはまず登録を | |