ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Flash Action Scriptコミュの変数の値を時限爆弾敵にnullにする関数

  • mixiチェック
  • このエントリーをはてなブックマークに追加
お疲れ様です。
初歩的な質問かもしれませんが、宜しくお願いします。


変数の値を自動的にnullにする関数が作りたいのですが
下記のように書いては見たものの、変数にnullが代入できません。

やりたいこととしては
(1)ガベージコレクション時にメモリを確保したいのです。

そのために下記のような関数を作りたいと考えています。

(1)設定時間後に指定変数にnullを代入したい。
(2)引数には複数の変数を自由に指定したい。



var num01:Number = 1000;
var num02:Number = 3000;

xNull(2,[num01,num02]);

function xNull(time:uint,ObjList:Array){
var duringTime = time*1000;
var timer = new Timer(duringTime,1);
timer.addEventListener(TimerEvent.TIMER_COMPLETE,xNull2);
timer.start();

function xNull2(evt:Event){
ObjList.map(xNull3);
}

}


function xNull3(item:Number,index:uint,arr:Array){
item = null
trace(num01,num02);
return item;
}

コメント(7)

一度にすべてをやろうとされているようです。
http://www.fumiononaka.com/TechNotes/NGWords.html#I

時間の設定や関数などより前に、ご自分で何をされようとしているのか、できるのかをまず確かめられた方がよいでしょう。

var num01:Number = 1000;
num01 = null;
trace(num01);
Fumio様

いつもありがとうございます。
またもや大ボケな質問をしてしまいました。

まずやりたいことは
(1)変数:Object = null;
にすることだということを確認しました。

その後下記を試してみたのですが

var num01:Object = 1000;

xNull(num01);

function xNull(obj:Object){
obj = null;
trace(num01,obj);
}

これでは obj の値がnullになるだけでnum01の値は変化しません。
落ち着いて考えるとそうですよね。

引数に指定したオブジェクトにnullを突っ込むに、よい方法(考え方)はありますでしょうか?

よろしくお願いします。
>> 2: コトバタクミさん
> (1)変数:Object = null;
_____
オブジェクトでないとnullにできないという点は、そのとおりです。ただ、データ型の指定だけObjectにしても、本質は変わりません。Number型だとnullにできないのは、しても意味がないからです。

ガベージコレクションは、参照渡しのデータに対して働く機能です。数値は値渡しですので、その値の参照を複数の変数などから持合うことはありません。たとえば、その変数に別の数値を上書きすれば、前の値はメモリから消えます。

参考:「DisplayObjectContainer.removeChild()メソッド」
http://www.fumiononaka.com/TechNotes/Flash/FN0705002.html

もし数秒で不要になるような数値をもつ変数が膨大にあるのでしたら、そのスクリプティングのデザインを再検討された方がよいように思われます。
Fumio様

ありがとうございます。

今現在少々大きな画像をアニメーションをさせる2分ほどのループムービーを作っております。
僕の作り方が雑だったようで、メモリの使用量ががどんどんと増えていってしまっています。

一台のコンピューターで5,6台のモニターに別の要素の映像が再生されております。

極力メモリの消費量を抑えたいので、Tweensyなどの使用したオブジェクトをnullにしたところ
一定の時間?検証時には2,3分ほどでメモリが使用が大きく減ることが確認できました。

基本Objectの変数をnullに出来れば希望通りなのですが

ただ、画像データをたくさん使うため時限爆弾的なクラスを作ってから
次の製作に当たろうとしていたところ、一筋縄には行かないことが分かりました。

やはり、1つ1つnullを入れて行くべきなのでしょうか。。。

あと、質問ばかりですみませんが
どこかのサイトでremoveChildしただけではガベージコレクションの対象にならないと呼んだことがあるのですが、removeChildしておけば大丈夫なのでしょうか?





>> コトバタクミさん
> 基本Objectの変数をnullに出来れば希望通りなのですが
_____
任意のオブジェクトの変数名を関数に指定して、nullに設定することは一応できます。

var num01:Array = [1000];
trace(num01);
xNull(this, "num01");
trace(num01);
function xNull(obj:Object, name_str:String):void {
 obj[name_str] = null;
}

ただ、これは始末屋を雇って、外から問答無用でオブジェクトを消していくやり方です。けれど、拡張性や応用性に優れるのは、オブジェクトをつくるときに、いつ使命を終えるのか定め、そのときに参照を破棄するよう予め決めておく方法でしょう。

> どこかのサイトでremoveChildしただけではガベージコレクションの対象にならないと呼んだことがあるのですが、removeChildしておけば大丈夫なのでしょうか?
_____
大丈夫ではありません。>> 4: 引用の[訳者注*4]をお読みください。
Fumio様

ありがとうございます!!

先ほど会社から帰り、ご支持いただいたスクリプトをFlashに入れて
「おおっーーー!!!」
っと言いながら拍手してしまいました。

いつもはnullと言う文字がエラーで帰ってきて悩まされていたのに
nullみてこんなに喜ぶとは思いませんでした。。。。。

なんとか明日より実装していきたいと思います!

生意気ですが、やはりスクリプトは頭の柔軟さだと感じました。

ありがとうございました!

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

Flash Action Script 更新情報

Flash Action Scriptのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。