Squeak.ru - шаблоны программирования

быстрый вопрос об управлении памятью в AS3

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

private function onDrag(evt:MouseEvent):void
        {
        this.startDrag(false, dragBounds());
        }

private function dragBounds():Rectangle
    {
    var stagebounds = new Rectangle(0 - swatchRect.x, 0 - swatchRect.y, stage.stageWidth - swatchRect.width, stage.stageHeight - swatchRect.height);
    return stagebounds;
    }

Ответы:


1

Это быстрый вопрос, но очень важный! Слишком мало разработчиков ActionScript заботятся об этих вещах. Так что респект вам!

Каждый раз, когда вы создаете новый прямоугольник, для него выделяется новая память. Как только все ссылки на этот прямоугольник будут удалены, он станет подходящим для сборки мусора (GC), то есть при следующем запуске GC он будет освобожден из памяти. (В этом случае все ссылки удаляются при вызове stopDrag())

Экземпляр Rectangle занимает очень мало памяти, и если сборщик мусора работает через равные промежутки времени, экземпляры будут постоянно очищаться. Кроме того, мы можем быть уверены, что в любой момент времени будет создано не более одного экземпляра, если предыдущий экземпляр не будет доступен для сборщика мусора. (Предположим, что вы будете звонить stopDrag перед тем, как снова позвонить dragBounds.)

Действительно, это тот случай, когда вам просто не нужно об этом беспокоиться. Ваш код в порядке. Вам понадобится много тысяч прямоугольников (например, миллионы одновременно), прежде чем вы столкнетесь с какими-либо потенциальными проблемами.

09.04.2010
  • спасибо за ответ, тайлер. теперь я понимаю, что stopDrag() удалит ссылки из startDrag(). но что, если функция dragBounds() вызывалась много раз, но не вызывалась функцией startDrag()? предположим, что прямоугольник — это большой объект, занимающий много памяти. могу ли я сделать переменную экземпляра доступной для всего класса, чтобы обнулить ее перед созданием новой, подобной этой? -- if (stageBounds) {stageBounds = null}; stageBounds = новый прямоугольник (...); -- 09.04.2010
  • Обнуление значения не освобождает его из памяти, а только удаляет ссылку, потенциально делая его доступным для GC. Пока все ссылки очищены, сборщик мусора найдет и удалит их. Вы не можете заставить это произойти. Большие объекты можно использовать повторно, а не создавать новые. Это может быть полезно, если стоимость создания нового больше, чем поддержание того, который, как вы знаете, вам скоро снова понадобится. 09.04.2010
  • Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...