Adobe AIR: запретить запуск GC - PullRequest
       7

Adobe AIR: запретить запуск GC

3 голосов
/ 25 февраля 2012

Для игры (использующей AIR для iOS) я хочу запретить запуск GC в течение определенной 30-секундной последовательности (поскольку это вызывает очень заметные лаги).

То, что я уже делаю, вызывает System.gc() прямо перед началом последовательности.Во время последовательности я не создаю много новых объектов, и только некоторые анимации играют и объекты перемещаются (в 3D).некоторые объекты перемещаются со сцены.

статистика памяти во время этой последовательности приблизительно:

System.totalMemory: 4.5 MB
System.freeMemory: 1.0 MB
System.privateMemory: 75 MB

Когда ГХ запускается, System.privateMemory падает до 74 МБ, но вызываетотставание примерно на одну секунду.GC запускается дважды в течение этой 30-секундной последовательности.

Так что мой вопрос о любых методах, взломах или обходных путях (кроме оптимизации использования памяти в целом - очевидно, я уже работаю над этим), чтобы предотвратить GCот стрельбы в течение этих 30 секунд?

спасибо.

Ответы [ 5 ]

2 голосов
/ 25 февраля 2012

Вы не можете запретить запуск GC. Но я хотел бы отметить, что есть две проблемы с вызовом System.gc().

Во-первых, вы должны проверить, включен ли он. документация гласит:

Только для версии отладчика Flash Player и приложений AIR. В приложении AIR метод System.gc () включается только в контенте, запущенном в AIR Debug Launcher (ADL), или в установленном приложении в контенте в изолированной программной среде безопасности приложения.

Во-вторых, вызов System.gc() только один раз, может на самом деле не освободить память. Смотрите здесь для получения дополнительной информации .

1 голос
/ 31 мая 2012

Вы можете попробовать позвонить system.useForGCIfCollectionImminent() до начала последовательности.

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/system/System.html#pauseForGCIfCollectionImminent() с высоким значением неизбежности (1)?

1 голос
/ 26 февраля 2012

Как уже говорили другие, невозможно предотвратить запуск ГХ.Есть 2 возможных подхода, которые могут помочь избавиться от лага:

  1. Убедитесь, что вы держитесь за все объекты, созданные во время анимации, до ее окончания.Однако это может привести к серьезным проблемам с памятью, все в зависимости от количества объектов и их потребления памяти
  2. регулярно запускайте System.gc () (дважды) во время анимации, что приведет к распределению очистки памяти и, мы надеемся,будет распространяться лаг
1 голос
/ 25 февраля 2012

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

Сборка мусора запускается, потому что системе требуется больше ресурсов, и если в системе не хватает ресурсов, ваше приложение аварийно завершит работу. Возможно, вам следует подумать о другом способе выполнения вашей задачи, который требует меньше ресурсов.

Также помните, что использование System.gc () в вашем коде будет работать только в отладочной версии Flash Player.

Мне кажется, я также где-то читал, что для правильного использования System.gc () в качестве части вашего тестирования вы должны вызвать его дважды:

 System.gc();
 System.gc();

Первый раз отметка неиспользуемой памяти, а второй развертка .

http://www.adobe.com/devnet/flashplayer/articles/garbage_collection.html

0 голосов
/ 20 апреля 2014

Вы можете предотвратить это, не создавая мусор.Это означает, что у вас нет объектов без ссылок, null объектов и т. Д. Когда вы знаете, что производительность не критична, вы можете уничтожить объекты, удалив все ссылки и сделав их null, и GC начнет выполнять свою работу.

GC все еще будет "искать мусор", но он должен использовать гораздо меньше неожиданных ресурсов.

Дело со ссылками в том, что все объекты в AS3 являются указателями на "настоящий" объект,за исключением примитивных значений, таких как int, uint, String и т. д. Это легко проверить

var a = new Object(); // we create an Object and a pointer called "a"
a.property = "I'm alive";
var b = a; // we create a pointer to the Object called "b"
a = null; // the Object still exists
trace(b.property) // I'm alive
b = null; // the Object still exists but is unreferenced, and will be GCed
trace(b.property) // Error

Имейте это в виду при работе с GC.

...