2009-06-26 15 views
0

私はCharactersオブジェクトの配列を持っています(スプライトを拡張します)。配列から要素を再利用する最も良い方法は?

public static var charlist:Array; 

キャラクターが死んだとき、私はそれを示すフラグを設定します。

char.die = true; 

私は新しいプレーヤーをスポーンするときに、このフラグをチェックしてスロットを再利用します。これが問題の原因です。 これを行う最善の方法は何ですか?実際に私は、このアプローチがあります:

char = new Char(); 
/* ... */ 
for (var i:Number = 0; i < Char.charlist.length; i++) { 
    if (Char.charlist[i].death) { 
     Char.charlist[i] = char; 
     return; 
    } 
} 

をしかし、問題は、私はC++から来て、私は、インデックスごとの繰り返しを計算することは無駄であると考えていることです。
私はこれを行うだろうが、私は参照によって項目にアクセスすることはできませんので、これは、AS3では動作しません:

char = new Char(); 
/* ... */ 
for (var i:Number = 0; i < Char.charlist.length; i++) { 
    var char_it:Char = Char.charlist[i]; 
    if (char_it.death) { 
     char_it = char; 
     return; 
    } 
} 

だけ注意を:CHARLISTは、クラスシャアの静的なメンバーです。

アイデアやより良いアプローチがありますか?

ありがとうございます!

答えて

2

「に最適化"バージョンはあまり最適化していないと思います。

あなたのコードはすべての反復で2回のアクセスを実行しません。あなたが死んだCharを見つけたときにだけそれは行います。その後、あなたは帰ってくる。だから大したことではない、と私は思う。

私は、個人的には、再利用アレイスロットが大きな違いになるとは思わない。そして、おそらくそれは低下する可能性があります(ただし、最悪の場合は、コードを避けるとコードが単純になる可能性があります)。 60文字が死んでいる100個の文字があり、フレームごとに実行され、すべてのライブチャーに対して何らかのチェック/アクションを実行するループがあるとします。あなたはライブオブジェクトのリストと死んだオブジェクトのseparteリストを手に入れれば、40を超えるループを作り、それらを再利用する準備ができたら、100文字以上をループします。また、 "死んだリスト"はスタックとして扱うことができるので、charを得るために反復は必要ありません。これを行う

var len:int = Char.charlist.length; 
for (var i:Number = 0; i < len; i++) { 

をこの代わりに

1)は、ループの外リストの長さを取得:

はとにかく、私はあなたが簡単にあなたのコード内で最適化する可能性が2つのことを参照してください。

for (var i:Number = 0; i < Char.charlist.length; i++) { 

コンパイラは、ecmascの後にlengthの呼び出しを最適化しません)。

2)静的なアクセス(charlistの場合)を避けてください。インスタンスアクセスよりもかなり遅いことが知られています。

編集:

あなたの質問を再読み込み、私はそれの一部を誤解実現。 Charオブジェクトを再利用しようとせず、スロットを配列します。それでも、私は配列スロットを再利用する価値があるとは思わない(Actionscriptの配列は固定されていない)。パフォーマンスに役立つものは、Charオブジェクト自体を再利用しているものです。スプライトを変更するのは、新しいスプライトを作成するよりも一般的に安いです。 これを管理するには、新しいオブジェクトを作成するのではなく、必要なときに1つを取り戻し、「元気に戻す」オブジェクトをプールすることができます。

このオブジェクトプールに関するポスト会談(ブログ自体は特に、パフォーマンスとデータ構造のトピックは、ActionScriptのもののための良い情報源であり、見てみる価値がある):私は来る

http://lab.polygonal.de/2008/06/18/using-object-pools/

+0

グレートドキュメント、そのプロジェクトに戻って、私はこの情報をチェックアウトします。 – Veehmot

0

arrayの代わりにリストを使用して、リストから死んだものをリストから削除し、必要に応じて新しいリストを追加するのはなぜでしょうか?
スロットを再利用するのに十分な理由はありますか?
最適化しようとしているのは何ですか?

0

目的のキャラクタをスプライスして新しいキャラクタを配列にプッシュできない理由はありますか?

var characters:Array = ["leo", "raph", "don", "mike"]; 
characters.splice(1, 1); 
trace(characters); 
characters.push("splinter"); 
trace(characters); 

(記憶タイプによって一貫している場合は、非常に高速)あなたが参照、チェックアウトのAS3のDictionaryオブジェクト、あるいはフラッシュ10のベクトルによってストレージを探しているなら:

http://www.gskinner.com/blog/archives/2006/07/as3_dictionary.html

関連する問題