カテゴリー
未分類

メモリの開放

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

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

というと感じ。最初にLoadされた時点でメモリに格納されるのだと思っていたけど、そうじゃなく表示されたタイミングでメモリに格納されるのね・・・。
ただなどのメモリ割り当てに必要になってくるメモリ量とは別のメモリ領域のようなので、それに伴い再生ソフトのメモリ割り当てを増やすということではない感じがする。(MACでの各プロセスにおけるメモリ消費がので良くわからないけど・・・)
ま、これからブロード化すすんで、Flash進化して大容量コンテンツが増加していく中で、こんなメモリだと、こういった部分がネックになってくる時期もでてくるのだろうな・・(多分こういう部分をディレクターはきちんと処理できる気もするけど、触ったこと無いのでわかりません)
なにかこの辺Flashで上手くメモリを開放したりする術を知っている人いましたら教えてください。(これをいている途中で思いついたけど変数でdelete するように一度MCをパージさせればいけるのか?試してみよう・・・)


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

「メモリの開放」への6件の返信

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さみしそうだし。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です