0

Flash に 100 フレームの MovieClip があります。各フレームには、プロジェクトで使用する必要がある特定のアイコンが含まれています。gotoAndStopアイコンを表示する必要がある場所、およびそのアイコンを表示する特定のフレームに対して、このアイコン MovieClip のインスタンスを作成します。

1 つのムービークリップに 100 個のアイコンを保存すると、ムービークリップのインスタンスを作成するたびにすべてのアイコンがメモリに作成されますか? 各アイコンをライブラリに保存し、必要なアイコンのみをアタッチした場合、すべてのアイコンを含むこのムービークリップを作成するよりもメモリの消費量が少なくなりますか?

4

3 に答える 3

2

あなたの質問に答えるには: アイコンのあるフレームに移動すると、Flash はそのアイコンの新しいインスタンスを作成します。そのフレームを離れると、リスナーであるメソッドがアイコンまたはその中のどこかにある addEvenListener を使用するなど、インスタンスを何らかの方法で強制的にメモリに保持しない限り、Flash はそのアイコンをガベージ コレクションの対象にします。

goToAndStop と新しいインスタンスのほうがメモリ使用量が多くなる可能性が高いと思います。goToAndStop() で問題が発生していない場合は、あるアイコンから別のアイコンに切り替えるたびに新しいアイコンをインスタンス化することで、追加の問題が発生する可能性はほとんどありません。答えた他の人々は、すべてのアイコンを(何らかの方法で)1回だけインスタンス化し、そのアイコンを使用するたびに同じアイコンを使用することで、使用するCPUサイクルが少なくなることはまったく正しいです。ただし、すべてのアイコン (現在使用していないものも含む) が常にメモリ内にあるため、全体的なメモリ フットプリントは高くなります。

それぞれを一度だけインスタンス化するルートに進みたい場合は、最初に使用されたときにのみ各アイコンをインスタンス化する遅延読み込みを使用することをお勧めします。これを行う 1 つの方法は、既存のものを使用して、特定のアイコンを初めて使用するときにフレームにアクセスし、その後 BitmapData またはアイコン自体への参照を保存して再利用することです。もう 1 つの方法は、swc を作成して同様のパターンを使用することです。

アイコンMCのさまざまなコピーを大量に使用していないように聞こえるため、これには静的変数BTWは必要ありません。その場合でも、依存性注入によって、持っているアイコンを参照するように処理した方がよいでしょう。

ただし、おそらくファイルサイズと実際のメモリ使用量について質問していると思います。その質問に対する答えは、fla で使用されるすべてのアセットは、MovieClip、SWC、またはフレーム N の Actionscript 用にエクスポートがオンになっているライブラリにあるかどうかに関係なく、swf にコンパイルされるということです。

わかった、オッパイある、推し これやって
みて、「推し」を検証。

  1. フレーム 1 にキーフレームを持つ swf を作成します。
  2. そこに円を描きます。
  3. フレーム 10 に別のキーフレームを配置します。正方形を描きます。
  4. [発行設定] で、[サイズ レポートの生成] をオンにします。

これで、フレーム 10 でコンパイルされたアセットがまだダウンロードされていなくても、この swf がフレーム 1 に円を表示できることがわかりました (または知っておく必要があります)。では、フレーム 10 がダウンロードされる前に正方形をメモリにロードできる方法はありますか? ヒント: 答えはノーです。

ここで、次のことを自問してみてください。Macromedia は、上記で作成したムービー用に Flash が生成したメインのドキュメント クラスである MC が明らかにうまく処理できる、遅延読み込みができない特別なバージョンの MC を作成したと思いますか?

Macromedia のエンジニアは、後から考えると非常にばかげているように見える多くのことを行いましたが、それほど無能ではありません。

于 2013-04-13T21:44:26.673 に答える
1

100 フレームの MovieClip に含まれる各アイコンが画像である場合、アクション スクリプト用にその画像を簡単にエクスポートして、必要な画像のみにアクセスできます。

もう 1 つのアイデアは、各アイコン フレームをシンボルとして静的配列 (インデックスでアイコンにアクセスする場合) または辞書 (名前で取得する場合) に格納する静的クラスを作成することです。

例えば

package{

    import flash.display.Bitmap;

    public class Icons{

        public static const assets:Vector.<Bitmap> = Vector.<Bitmap>([new Icon01ASExportName(),//instance bitmaps once
                                                                      new Icon02ASExportName(),//reuse them later multiple times
                                                                      ...
                                                                      new Icon99ASExportName()]);
    }

}

もう 1 つの方法は、SpriteSheet を一度生成してファイルとして保存し、実行時にcopyPixels()でメイン スプライトシートの右の長方形からアイコンを貼り付けることです。スプライト シートを生成するために使用できる複数のツールがあります。

実行時にスプライトシートを生成する方法もあります。

Lee Brimelow によるスプライト シートと BitmapData に関する適切に説明されたビデオ チュートリアル: スプライト シートとブリッティング -パート1、2、および3

于 2013-04-13T20:54:12.520 に答える
1

アイコンがビットマップの場合、各ムービークリップは同じデータを共有します。メモリの増加は、ムービークリップの内容ではなく、ムービークリップの増加によるものです (これは問題にはなりません)。

アイコンがビットマップでない場合 (他のムービークリップ、シェイプ、ボタンなど)、すべてが複製されるため、ムービークリップが追加されるにつれてメモリ使用量が大幅に増加します。

もう 1 つの考慮事項は、画面上の多数のムービークリップは、単純なオブジェクトよりも FPS に大きな影響を与えるため、ビットマップを使用している場合でも、ムービークリップではなくアイコン自体を追加することを検討することをお勧めします。

于 2013-04-13T19:48:37.767 に答える