2009-08-01 10 views
1

私が書いたクラスがあり、それはもっと大きくなるはずです。それは何も拡張しておらず、ほとんど進んでいないか、または私は思ったが、それぞれが 100k の100バイト(back2dosありがとう)の下でただちに取り上げている。私は、オブジェクトがAS3でどれくらいのメモリを占めるかに本当に何が影響するのかをよく理解していないと思います。AS3:オブジェクトのメモリサイズを最適化する

誰かが助けてくれるかもしれない主題についての読書を指し示すことができ、あるいはこれについて考える方法についてのいくつかの洞察を説明することができます、それはすばらしいでしょう。

私はこれまで多くのオブジェクトをメモリに残しておきたいと思いましたが、これまでのことができると思っていましたが、このサイズで作成するか、オブジェクトプーリング技術を使用する必要があります。

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

編集:私は順序でこれを持っているが、私は完全を期すためにここに掲載のコードを維持しています。クラスは元のバージョンから大幅に変更されています。他のファイルを参照していた値は、他の誰かのためにコードを実行できるように静的になっています(理論的には...)。

私の状況は分類されていますが、クラスとメモリの情報については、参考にしておきます。

この場合、クラスには15の変数があります。私は、単一のStringとint、Numbers、Booleansの束だけを使用しています。また、ポイントは保存されませんが、コンストラクタのPointもインポートされます。テストでは、グローバルなXML参照やPointクラスがなくても、それはまだ〜84kです。 7つの変数のゲッターと、コンストラクターに加えて2つのメソッドがあります。すべてが20行未満です(私は非常にまばらなコーディングスタイルを持っています)。

参考のために言及したが、一般化して自由に感じるクラス:

package 
{ 
    public class AObject 
    { 
     private var _counter:int; 
     private var _frames:int; 
     private var _speed:int; 

     private var _currentState:String; 
     private var _currentFrame:int; 

     private var _offset:int; 
     private var _endFrame:int; 

     private var _type:int; 
     private var _object:int; 
     private var _state:int; 

     private var _x:Number; 
     private var _y:Number; 

     private var _w:int; 
     private var _h:int; 

     private var _update:Boolean; 

     public function AObject(targetX : int, targetY : int, state : int, object : int, type : int) 
     {  

      _x = targetX; 
      _y = targetY; 

      _type = type; 
      _object = object; 
      _state = state; 
      _counter = 0; 
      _w = 32; 
      _h = 32 
      _update = true; 
      setState(state); 
     } 

     public function setState(state:int) : void 
     { 
      _currentState = "bob"; 
      var frameCounter : int = 0; 
      var stateCounter : int = state - 1; 
      while (state > 0) 
      { 
       frameCounter += 4; 
       --stateCounter; 
      } 
      _offset = frameCounter; 
      _currentFrame = _offset; 
      _speed = 10; 
      _frames = 4; 
      _endFrame = _offset + _frames - 1; 
     } 

     public function get state() : int 
     { 
      return _state; 
     } 

     public function animate() : Boolean 
     { 
      if (count()) 
      { 
       if(_currentFrame < _endFrame) 
       { 
        ++_currentFrame; 
       } 
       else 
       { 
        _currentFrame = _offset;  
       } 
       _speed = 10; 
       return true; 
      } 
      else 
      { 
       return false; 
      } 
     } 

     private var adder: Number = 0; 

     private function count():Boolean 
     { 
      _counter++; 
      if (_counter == _speed) 
      { 
       _counter = 0; 
       return true; 
      } 
      else 
      { 
       return false; 
      } 
     } 

     public function get x():int 
     { 
      return _x; 
     } 

     public function get y():int 
     { 
      return _y; 
     } 

     public function get type():int 
     { 
      return _type; 
     } 

     public function get object():int 
     { 
      return _object; 
     } 

     public function get currentFrame():int 
     { 
      return _currentFrame; 
     } 

     public function get w():int 
     { 
      return _w; 
     } 

     public function get h():int 
     { 
      return _h; 
     } 
    } 
} 

答えて

3

私は驚いていますが、これがすべてでコンパイル...私はフレックスSDKでコンパイルしようとすると、それは巨大な衝突を作成しますどのクラスの基本クラスでもあるクラスObjectを組み込み、トレース出力がオーバーフローします。

0以外の状態の値を渡すと無限ループになります

while (state > 0) 
{ 
     frameCounter += 4; 
     --stateCounter; 
} 

これらのオブジェクトは、名前の変更および状態のために0を渡すしないように注意を取った後、私はテストを実行しました...とても大きいです本当に奇妙なよう:

package { 
    import flash.display.Sprite; 
    import flash.sampler.getSize; 
    import flash.system.System; 
    public class Main extends Sprite { 
     public function Main():void { 
      const count:int = 100000; 
      var start:uint = System.totalMemory; 
      var a:Array = []; 
      for (var i:int = 0; i < count; i++) { 
       a.push(new MyObject(1, 2, 0, 4, 5)); 
      } 
      var mem:uint = System.totalMemory - start - getSize(a); 
      trace("total of "+mem+" B for "+count+" objects, aprox. avg. size per object: "+(mem/count)); 
     }  
    } 
} 

それが得られます。

total of 10982744 B for 100000 objects, aprox. avg. size per object: 109.82744 

だから実際のサイズは4(ブールの場合)+ 4 * 11(intの場合)+ 4(文字列への参照の場合)+ 8 * 3(3つの浮動小数点あなたはcountのどこかにadderを持っています+空のクラス(traitsオブジェクトへの参照+何か他のもの)については合計8 8バイトを与えます。帽子あなたが得る場合は、getSizeオブジェクト...しかし、getSizeは、あなたのオブジェクトが参照する文字列や他のオブジェクトのサイズを無視して、オブジェクト自体のサイズ(ここで計算されたもの)を与えるだけであることに注意してください...

そう、変更は、問題が

greetz

back2dos ...どこかでなければなりません

+0

よりも、置かれ得ると考えているように、私は、あなたが実際に最終としてクラスを宣言することにより、いくつかのメモリの増加を取得すると信じて、それは私の正確ではありませんコード。私はそれを変えた。私はまた、他のファイルに依存しているいくつかの変数をここで固定値に変更しました。この変数は、あなたが見る奇妙さの多くを占めています。 Flexプロファイラを実行すると、実行時に約12000になります。私は、メモリモニタがkbを追跡しているので、使用されているメモリがKb no bであると仮定していたと思います。うーん...私は物事が整っていると思うので、私はこの場合に私が見ていたものを誤解していた。私をまっすぐにしてくれてありがとう。私はコードが変更されていることに注意するために投稿を更新しました。 – grey

0

あなたが本当にスペースを節約したい場合は、することができますのために上位/下位ビットを符号なし整数を使用し、使用して偽のショートパンツあるものか別のものか。

intsは本質的に4バイトなので、2^8未満のものにそのintを再利用できます。

width height 
0xFFFF + 0xFFFF 

offset endframe 
0xFFFF + 0xFFFF 

このしかし、あなたが何かを何かを書いたり、読みたい時に幅書くことや高さは、あなたが持っているだろうとして、醜い取得へ:醜い

writing: 
size = (width & 0x0000FFFF) << 16 | (height & 0x0000FFFF); 

reading: 
get width():uint { return (size & 0xFFFF0000) >> 16 }; 

。とにかくゲッターを使用しているので、計算速度が問題ではないと仮定すると、内部バイト配列を使用すると、情報の格納方法をさらに細かくすることができます。文字列が4バイトを超えると仮定すると、文字列ではなく数字を使用するほうが意味があります。また

私は形質はオブジェクトに、最終的な機能ではなく、私はポストのためのものと改名