1

У меня есть класс, который я написал, и он кажется большим, чем нужно. Он ничего не расширяет, и очень мало происходит - или так я думал - но каждый из них занимает чуть меньше 100k 100 байт (спасибо back2dos). Я предполагаю, что я не очень хорошо понимаю, что действительно влияет на то, сколько памяти занимает объект в AS3.AS3: Оптимизация размера памяти объекта

Если кто-нибудь может указать мне на некоторые чтения по этому вопросу, которые могут быть полезными, или, возможно, объяснить некоторое понимание того, как об этом думать, это было бы замечательно.

Я хотел бы сохранить ЛОТО этих объектов в памяти - и я думал, что могу до сих пор, но при таком размере мне придется создавать их или использовать какую-то технику объединения объектов.

Спасибо за помощь.

Edit:Хотя у меня есть это в порядке, я держу код, который я здесь для полноты картины. Класс был сильно изменен с исходной версии. Значения, которые ссылались на другие файлы, были сделаны статичными, чтобы позволить коду работать для кого-то другого (теоретически hehehe ...).

Хотя моя ситуация разобрана, я дам ответ на полезную ссылку для информации о классах и памяти.

В этом случае класс имеет 15 переменных. Я использую только одну String и кучу ints, Numbers и Booleans с некоторыми ссылками на более похожие данные в глобально доступных XML-данных. Он также импортирует Point для конструктора, хотя точки не сохраняются. При тестировании даже без глобальных ссылок XML или класса Point он все еще находится вокруг ~ 84k каждый. В дополнение к конструктору есть геттеры для 7 переменных и несколько методов. Все из них составляют менее 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

я поражен, это компилируется на всех ... когда я пытаюсь скомпилировать его с помощью Flex 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 (для bool) + 4 * 11 (для ints) + 4 (для ссылки на строку) + 8 * 3 (для трех поплавков (у вас есть adder где-то над count) + 8 для пустого класса (ссылка на объекты объектов + что-то еще), что дает вам всего 88 байт ... что, что вы получаете, если вы getSize объект ...обратите внимание, однако, что getSize предоставит вам только размер самого объекта (как рассчитано здесь), игнорируя размер строк или других объектов, на которые ссылается ваш объект ...

так что да, помимо этого имени, вы определенно должны изменение, эта проблема должна быть где-то еще ...

Greetz

back2dos

+0

я переименовал материал для поста, это не мой точное код. Я изменил это. Я также изменил ряд переменных, которые полагаются на другие файлы, чтобы быть фиксированными значениями здесь, что объясняет много странности, которую вы видите. Когда я запускаю профилировщик Flex, я получаю около 12000, когда я запускаю его. Думаю, я предполагал, что используемая память была Kb no b, так как монитор памяти отслеживает kb. Хммм ... так что я думаю, что все в порядке, и я неправильно понял то, что я видел в этом случае. Спасибо, что выпрямил меня. Я обновил сообщение, чтобы отметить, что код был изменен. – grey

0

Если вы действительно хотите, чтобы сэкономить на пространстве, вы можете поддельные шорты с помощью целых чисел без знака, и используя верхние/нижние биты для одна вещь или другое.

ints 4 байта по своей природе, вы можете повторно использовать этот int на чем-то меньшем чем 2^8.

width height 
0xFFFF + 0xFFFF 

offset endframe 
0xFFFF + 0xFFFF 

Это хотя становится уродливым, когда вы хотите написать что-нибудь или читать что-нибудь, чтобы писать ширину или высоту вы должны:

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

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

Это некрасиво. Так как вы используете геттеры в любом случае и считаете, что скорость вычислений не является проблемой, вы можете использовать внутренние массивы байтов, которые могут дать вам еще большую детализацию в отношении того, как вы хотите хранить свою информацию. Предполагая, что ваши строки больше 4 байтов, имеет смысл использовать число, а не строку.

Кроме того, я полагаю, вы действительно получите некоторое увеличение памяти, объявив класс как окончательные, так как я считаю, окончательные функции объектов помещаются в объекте черты, а не

Смежные вопросы