Actionscript + Google Maps API Утечка памяти - PullRequest
1 голос
/ 07 сентября 2011

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

Я использую следующий код для добавления маркера карты, заменив предыдущий, если он есть:

public var tracer:Array = new Array();
public var tracerLng:Number = 0;

for ( var i : Number=1 ; i<64000 ; i++)
{
    //Check if there is already a marker, if so get rid of it
    if(tracerLng > 0) {
        map.removeOverlay(tracer[0]);
        tracer[0] = null;
        tracer.pop();
    }
    // Set up a marker
    var trackMrk:Marker = new Marker(
        new LatLng(_lat, _lng),
        new MarkerOptions({
            strokeStyle: new StrokeStyle({color: 0x987654}),
            fillStyle: new FillStyle({color: 0x223344, alpha: 0.8}),
            radius: 12,
            hasShadow: true
        })
    );
    //Add the marker to the array and show it on the map
    tracerLng = tracer.push(trackMrk);
    map.addOverlay(tracer[0]);
}

Моя первая проблема заключается в том, что этот код запускается (64000 повторов предназначены для тестирования, конечное приложение не нужно будет запускать достаточно ТО много раз) В любом случае, использование памяти увеличивается примерно на 4 КБ / с - как избежать этого?

Во-вторых, может ли кто-нибудь посоветовать мне, как сделать эту программу более изящной?

Заранее спасибо за совет

1 Ответ

0 голосов
/ 09 сентября 2011

Это не утечка памяти, это, вероятно, результат созданных событий - ввод фреймов, событий мыши, пользовательских событий и т. Д. При условии, что ваша память не будет постоянно расти и расти, об этом не стоит беспокоиться -он соберет мусор в должное время.

Некоторые пункты в вашем коде:

  • Массив tracer, похоже, ничего не делает - вы, кажется, только держитеодна вещь там одновременно, поэтому массив не имеет смысла.Если вам нужен массив, используйте Vector.Это меньше и быстрее.Более того, если вы создаете файл определенной длины.
  • Не создавайте новый Marker, если он вам не нужен.Повторное использование старых объектов.Узнайте о пуле объектов: http://help.adobe.com/en_US/as3/mobile/WS948100b6829bd5a6-19cd3c2412513c24bce-8000.html или http://lostinactionscript.com/2008/10/30/object-pooling-in-as3/
  • LatLng и MarkerOptions (включая объекты обводки и заливки), похоже, не меняются (я предполагаю, что LatLng объект позволяет вам установить новую позицию).Если это так, не создавайте новые, когда вам это не нужно.Если вам нужно создавать новые, StrokeStyle и FillStyle кажутся хорошими кандидатами для политики «создай один раз, везде используй».
  • Создайте функцию destroy() или аналогичную в вашем классе Marker иявно вызывайте его, когда вам нужно удалить его (непосредственно перед установкой null или извлечением его из массива).В функции destroy() обнуляйте любые параметры для неосновных классов (int, Number, String и т. Д.).Сборка мусора выполняется с использованием метода подсчета ссылок и метода метки и очистки.В идеале вы хотите запускать все, используя подсчет ссылок, так как он собирается быстрее и останавливает любые задержки в вашей программе.

Я немного подробнее расскажу об управлении памятью в AS3: http://divillysausages.com/blog/tracking_memory_leaks_in_as3

Также включен класс, который помогает вам отслеживать утечки памяти, если таковые имеются

...