« ひさりぶりにVJやるでしよー。 | Home | 力也兄貴 »

Nov 142003

メモリの開放

今Flashで大量の画像を扱う仕組みのものを作っているのですけど、画像を一枚表示させるごとにメモリ使用量が3MBずつ追加されていく。フレームにID換算したイメージを配置してattachしたmcを制御していたのだけど、attachのMCが上手く引き継がれず追加されているのか?とデバッガで調べるが特に増加しているパラメーターもオブジェクトも無し。一応attachをやめ、マニュアルでMC配置で処理してみるもやっぱり画像を表示させるごとに3MBメモリ使用量が増加する。じゃあ逆にその画像自体をMC化してattachで置換するとメモリも置換してくれないのか?と試してもそれも駄目。
どうもスクリーンキャプチャの容量で何かしら表示された画像データをメモリにストックさせているような感じ。ということで、じゃあ画像のクオリティを下げてみたが、消費メモリの増加サイズは変わらず3MB。じゃあそれは表示サイズに依存するのか?ということで単純に表示率を縮小してみる。しかしそれでも3MB増加。それならと小さいサイズのイメージを取り込んで同様の検証を行ってみると、メモリの消費率が減少。
どうも表示領域のキャプチャではなく、SWF内部に保持する元々の画像のサイズに依存してキャプチャが行われているくさい。(ってか改めて考えるとラスタ的処理ではなくベクター的な処理構造なので当然だなと・・)

ということで今のところ結論としては

・Flash内で画像を表示させるとそれはメモリにストックされる。
・その際のメモリ消費量は元々Flashに取り込んでいる画像の領域に依存する。
・インスタンス名で置換はできず、ライブラリ内のデータ名で区別されるためメモリの置換が行えない。

というと感じ。最初にLoadされた時点でメモリに格納されるのだと思っていたけど、そうじゃなく表示されたタイミングでメモリに格納されるのね・・・。

ただMACなどのメモリ割り当てに必要になってくるメモリ量とは別のメモリ領域のようなので、それに伴い再生ソフトのメモリ割り当てを増やすということではない感じがする。(MACでの各プロセスにおけるメモリ消費が見えないので良くわからないけど・・・)

ま、これからブロードバンド化すすんで、Flash進化して大容量コンテンツが増加していく中で、こんなメモリ管理だと、こういった部分がネックになってくる時期もでてくるのだろうな・・(多分こういう部分をディレクターはきちんと処理できる気もするけど、触ったこと無いのでわかりません)

なにかこの辺Flashで上手くメモリを開放したりする術を知っている人いましたら教えてください。(これを書いている途中で思いついたけど変数でdelete するように一度MCをパージさせればいけるのか?試してみよう・・・)

駄目ですた・・・Σr(‘Д‘n)

6 Comments

camcamtimeの時は同様の問題に当たって結局単純に同じMCにLoadmovieしたりUnloadMovieしたりを繰り返したらうまく動いた。ただしこの場合はJPEGじゃなくてSWFだけど。あとMAC版はリリースしてないからよくわかんない。マックのFlashPlayerはクソだという評判なので、動作するかどうかはわからんです。ver7になってMac版プレーヤもだいぶ良くなったらしい。

貴重な情報ありがとうございます。
camcamtimeとか尋常じゃなさそうですよね・・movieだし・・・。
ちょっと検証してみます。
ただスクリーンセイバーだとloadMovie使えないんですよね・・・(winだと外部読み込み可能なんだけど、macだと無理なんでし・・・)似たようなところでattachでなんとか?と思ってトライしたんだけど改善されませんでした。
ちとloadMovieもあわせて検証してみまふ。

なんちゅうかmacのメモリ割り当てって便利なんだか不便なんだか・・

player7からクロスドメインのセキュリティ設定が変わったから、プロジェクタからの外部ファイル読み込みもちゃんと設定したら可能かと思うよ。わかんないけど。

System.security.allowDomain

とかを見てみると多分いろいろ書いてる。わかんないけど。

あと、最新のスクリーンセーバ生成ソフトは関連ファイルもパッケージして同一ディレクトリに展開する機能もついてるやつが何個かある(たとえばScreenTime v2)から、インストール時に外部ファイルも一緒に置いて、ローカル内でLoadMovieするというのもひとつの手かもしんない。これだと速い。

あ、基本ネット経由ではやらないんですね。でローカル外部ファイルで読み込みってwindowsでは上手くいくんですけど、macだとなんか上手くいかなくて仕方がないので全部FLAの中に取り込んでいるのです。
ただMACでの外部ファイル取り込み部分でなにか見落としが無かったかもう一度チェックしますです。ちなみにscreenTimev2でし。

さて、loadMovieで置換することでメモリキャッシュの増加を抑える方向で解決したのですが、じゃあなんでこれを最初からやらんかったのか?という話になるとScreen time v2 のwindowsで外部ファイル読み込み設定の際に何故か読み込みエラーになるデータがあることと、windowsとmacで外部ファイルの取り扱いの仕様が違っていたことに気づかなかったという2点です。
1番目の方は最初外部ファイルの上限数があるのか?とか誤解していたのですが、なんかよくわからないファイルフォーマットの問題があるっぽい。変換ツールで一気にJPEG変換とかしていたのですが、いくつか読み込みエラーになるファイルが存在していたんで、それを一つ一つ調べていって、Photoshopで再度書き出しをおこなったら読み込めました。(しかし何が原因かわからないので、一つ一つエラーが出るかどうか確かめるしかないというかなり精神的苦痛を伴う作業・・・w)
2つ目はwindowsだとファイルレベルでの埋め込みを行うのに対して、macだとフォルダ単位で埋め込みを行う。という部分。これはマニュアルとかにもなにも説明がなかったので良くわからない部分だったのだけど、早い話が外部ファイルを取り込む仕様にした場合、winとmacではloadMovieなどの外部ファイル参照先を変更する必要がある。ということ。

同じソフトだったら同じように作ってくれとかちょっと思ったけど・・・・。

ということでユーザーにメモリ負荷をかけることなく実装できることになりました。ゆーごさんほんとヒントありがとございました。また今度遊びにいきますよwさみしそうだし。

Leave a comment

Search and Archives