Преимущества подхода с использованием списка отображения

Flash Player 9 и более поздних версий, Adobe AIR 1.0 и более поздних версий

В ActionScript 3.0 отсутствуют отдельные классы для различных типов экранных объектов. В ActionScript 1.0 и 2.0 многие из однотипных объектов включены в один и тот же класс MovieClip.

Обособление классов и иерархической структуры списков отображения имеет следующие преимущества:

  • более эффективная визуализация и пониженные требования к памяти;

  • Усовершенствованное управление глубиной

  • Полный обход списка отображения

  • Экранные объекты, не вошедшие в список

  • Упрощенное распределение экранных объектов по подклассам

Более эффективная визуализация и файлы меньшего размера

В ActionScript 1.0 и 2.0 рисовать фигуры можно только в объекте MovieClip. В ActionScript 3.0 существуют более простые классы экранных объектов, в которых можно рисовать фигуры. Поскольку эти классы экранных объектов ActionScript 3.0 не включают полный набор методов и свойств, которые содержит объект MovieClip, они используют меньше ресурсов процессора и памяти.

Например, любой объект MovieClip включает свойства для временной шкалы фрагмента ролика, тогда как объект Shape не включает их. Свойства, относящиеся к управлению временной шкалой, могут требовать много ресурсов процессора и памяти. В ActionScript 3.0 использование объекта Shape приводит к повышению производительности. Объект Shape имеет меньше служебных данных, чем сложный объект MovieClip. Flash Player и AIR не требуется оперировать неиспользованными свойствами объекта MovieClip. Это повышает скорость его обработки и снижает объем используемой памяти.

Усовершенствованное управление глубиной

В ActionScript 1.0 и 2.0 глубина регулировалась с помощью линейной схемы и таких методов, как getNextHighestDepth().

ActionScript 3.0 включает класс DisplayObjectContainer, который обладает более удобными методами и свойствами для управления глубиной экранных объектов.

В ActionScript 3.0 при перемещении экранного объекта на новое положение в списке дочерних объектов экземпляра DisplayObjectContainer другие дочерние объекты в контейнере экранного объекта автоматически смещаются. Им присваиваются соответствующие позиции в указателе дочерних объектов, относящемся к контейнеру экранного объекта.

Также в ActionScript 3.0 всегда можно обнаружить все дочерние объекты любого контейнера экранного объекта. Каждый экземпляр DisplayObjectContainer обладает свойством numChildren, в котором перечислено количество дочерних элементов в контейнере экранного объекта. И поскольку список дочерних объектов контейнера экранных объектов всегда является индексированным, вы можете изучить любой объект в списке, начиная с позиции указателя 0 до последней позиции (numChildren - 1). Это было невозможно сделать с помощью методов и свойств объекта MovieClip в ActionScript 1.0 и 2.0.

В ActionScript 3.0 можно легко выполнить последовательный обход списка отображения; номера в указателе списка дочерних объектов для контейнера экранного объекта идут один за другим. Обход списка отображения и управление глубиной объектов сильно упрощены по сравнению с ActionScript 1.0 и 2.0. В ActionScript 1.0 и 2.0 фрагмент ролика мог содержать объекты с перемежающимися разрывами в порядке глубины, которые могут усложнить обход списка объекта. В ActionScript 3.0 каждый список дочерних объектов контейнера экранного объекта кэшируется внутри в качестве массива, что приводит к резкому ускорению поиска по указателю. Циклический просмотр всех дочерних объектов контейнера экранного объекта также происходит очень быстро.

В ActionScript 3.0 дочерние объекты можно также вызвать в контейнере экранного объекта путем использования метода getChildByName() класса DisplayObjectContainer.

Полный обход списка отображения

В ActionScript 1.0 и 2.0 некоторые объекты (например, векторные фигуры, отрисованные в инструменте разработки Flash) вызвать невозможно. В ActionScript 3.0 все объекты в списке отображения доступны (как объекты, созданные с помощью ActionScript, так и все объекты, созданные в инструменте разработки Flash. Дополнительные сведения см. в разделе «Обход списка отображения».

Экранные объекты, не вошедшие в список

В ActionScript 3.0 можно создавать экранные объекты, которые не находятся в выводимом на экран списке отображения. Они называются экранными объектами, не вошедшими в список. Экранный объект добавляется в видимый список отображения только при вызове метода addChild() или addChildAt() экземпляра DisplayObjectContainer, который уже был добавлен в список отображения.

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

Упрощенное распределение экранных объектов по подклассам

В ActionScript 1.0 и 2.0 часто приходилось добавлять новые объекты MovieClip в SWF-файл, чтобы создать основные фигуры или показать растровые изображения. В ActionScript 3.0 класс DisplayObject содержит многие встроенные подклассы, включая Shape и Bitmap. Поскольку классы в ActionScript 3.0 больше специализируются на конкретных типах объектов, легче создавать базовые подклассы на основе встроенных классов.

Например, чтобы нарисовать круг в ActionScript 2.0, можно было бы создать класс CustomCircle, который является расширением класса MovieClip при создании экземпляра объекта, принадлежащего к заказному классу. Однако этот класс будет также включать ряд свойств и методов из класса MovieClip (например, totalFrames), которые к нему не относятся. Однако в ActionScript 3.0 можно создать класс CustomCircle, который является расширением объекта Shape, и в качестве такового не включает несвязанные свойства и методы, которые содержатся в классе MovieClip. Следующий код является примером класса CustomCircle:

import flash.display.*; 
 
public class CustomCircle extends Shape 
{ 
    var xPos:Number; 
    var yPos:Number; 
    var radius:Number; 
    var color:uint; 
    public function CustomCircle(xInput:Number,  
                                        yInput:Number,  
                                        rInput:Number,  
                                        colorInput:uint) 
    { 
        xPos = xInput; 
        yPos = yInput; 
        radius = rInput; 
        color = colorInput; 
        this.graphics.beginFill(color); 
        this.graphics.drawCircle(xPos, yPos, radius); 
    } 
}