addChild (): Как узнать, действительно ли DisplayObject отображается на сцене?

У меня есть большое изображение (4096x4096), загруженное в память, но когда я пытаюсь использовать addChild, возникает большая задержка, прежде чем оно действительно отобразится на экране. Это ожидаемо. Однако есть ли событие, которое я могу прослушать, чтобы узнать момент, когда DisplayObject (изображение .png) действительно отображается на экране?

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


person producerism    schedule 08.01.2013    source источник
comment
До сих пор моим обходным решением было запускать таймер на 100 мс, который постоянно проверяет ширину DisplayObject. Когда число больше 0, я знаю, что оно наконец-то было нарисовано на экране.   -  person producerism    schedule 09.01.2013
comment
Event.ADDED_TO_STAGE работает? Или это отправляется сразу после добавления, только до того, как оно будет отрисовано?   -  person puggsoy    schedule 09.01.2013
comment
Вы загружаете изображение извне или это изображение скомпилировано в swf?   -  person Tim Lieberman    schedule 09.01.2013
comment
Вы можете попробовать. если (youImgName.framesLoaded) {}   -  person Tim Lieberman    schedule 09.01.2013
comment
Наряду с Added_To_Stage (если это слишком рано) вы можете проверить событие RENDER. Конечно, если вам просто нужно иметь возможность манипулировать bitmapData, вы можете использовать событие COMPLETE из загрузчика (если оно загружается во время выполнения, а не встроено).   -  person shaunhusain    schedule 09.01.2013
comment
к сожалению, события ADDED_TO_STAGE и RENDER не помогают. Оба они вызываются, когда DisplayObject добавляется в рабочую область, но до фактического вывода данных на экран остается не менее 3-5 секунд. Я загружаю внешние изображения (PNG и GIF) размером от 10 до 60 МБ каждое.   -  person producerism    schedule 09.01.2013
comment
@puggsoy, к сожалению, ADDED_TO_STAGE отправляется после добавления, а не после рендеринга. Что касается проверки на соответствие framesLoaded, это будет полезно только для SWF или фрагмента ролика, но не для Bitmap. Пока что цените совет, это кажется второстепенной проблемой.   -  person producerism    schedule 11.01.2013
comment
А, тогда ладно. Думал, стоит попробовать. Насколько мне известно, ваше решение в первом комментарии, вероятно, настолько хорошо, насколько оно возможно, но, возможно, проверка его на каждом новом кадре с использованием ENTER_FRAME вместо каждых 100 мс может быть лучше. Я мало знаю об оптимизации, но, поскольку вы проверяете, когда он отображается, было бы более эффективно проверять каждый кадр.   -  person puggsoy    schedule 11.01.2013
comment
Спасибо, это хороший момент для рассмотрения. Я осторожно отношусь к добавлению ненужной логики к каждому кадру, поскольку это потенциально может увеличить время отображения пикселей, но это все теоретически, пока я не найду решение без обходного пути.   -  person producerism    schedule 11.01.2013
comment
Я подозреваю, что вместо добавления очень большого изображения в список отображения вы бы больше выиграли от копирования только тех пикселей, которые вам нужны, из 10-мегапиксельного изображения (изображений) в объект BitmapData / Bitmap, который всегда находится на сцене. Это может занять время, но в идеале должно занять меньше времени, чем добавление всего большого изображения на сцену.   -  person scriptocalypse    schedule 11.01.2013
comment
@scriptocalypse тоже пробовал подход, похожий на блиттинг, но поскольку этот процесс включает плавное панорамирование изображения (по сути, перетаскивание изображения на большой сенсорный экран высокой четкости), и, возможно, в дополнение к большому количеству пикселей, которые необходимо обработать, он совсем не помогло. Как предполагали другие, использование Starling может быть другим подходом.   -  person producerism    schedule 11.01.2013
comment
Howdy Producerism, я хочу подключиться. Я думаю, что у вас есть продюсерский сайт, а у меня продюсерский сайт, и я считаю, что мы должны работать вместе. Orbitingeden @ gmail   -  person Orbiting Eden    schedule 13.07.2020


Ответы (2)


Задержка связана с тем, что Flash Player распаковывает изображение при подготовке к рендерингу.

Хитрость заключается в том, чтобы заставить Flash Player распаковаться до того, как он вам понадобится - тогда он «мгновенно» появится на сцене.

Я не могу поверить в идею, но возьму награду;). Вот статья, которая меня просветила и полностью объяснила: http://jacksondunstan.com/articles/2080

person Community    schedule 11.01.2013
comment
вау, именно то, что я искал, спасибо. Это все еще взлом, но похоже, что это лучший ответ, на который я мог надеяться. - person producerism; 11.01.2013
comment
Святая моли, это фантастика. Я понятия не имел, что это так работает, и эта статья была одновременно интересной и чрезвычайно полезной. Иногда я работаю и с массивными изображениями, поэтому обязательно буду использовать это в будущем. Не то чтобы мне эта функция была нужна, но тем не менее она могла бы помочь. Так что большое спасибо. Спасибо вам за продюсерский подход, за то, что вы задали этот вопрос и установили награду, чтобы получить этот ответ;) - person puggsoy; 12.01.2013
comment
нп, рад, что это могло помочь и кому-то другому. fyi, вот ссылка, которая описывает более подробно. По-видимому, вы можете установить свойство loaderContext загрузчика, чтобы оно не запускало событие COMPLETE, пока оно также не будет распаковано. Он даже указывает, что это полезно для изображений 10MP + для приложений AIR. Не мог и попросить больше информации! help.adobe.com/en_US/as3/dev/ - person producerism; 12.01.2013
comment
Ого, спасибо. Тоже асинхронно! Решение Ли, хотя и великолепное, кажется синхронным, насколько я могу судить. Так что, если у вас действительно гигантское изображение, оно может на время заблокировать приложение. Конечно, если вы не используете Loader, вы, вероятно, все равно не встретите такие гигантские изображения, но все же. В любом случае оба метода хороши, спасибо, что поделились этим! - person puggsoy; 12.01.2013
comment
Приятная работа с загрузчиком Контекстная информация! Это определенно путь. Он также должен работать со встроенными изображениями; с помощью Loader.loadBytes (byteArray, loaderContext); - person ; 12.01.2013

Если вы используете класс Loader, это потому, что контент еще не загружен.

Вероятно, где-то в вашем коде есть что-то вроде этого:

var loader : Loader = new Loader();
loader.load( new URLRequest( "theURL" ) );
stage.addChild( loader );

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

Вот что вам нужно сделать.

var loader : Loader = new Loader();
loader.contentLoaderInfo.addEventListener( Event.COMPLETE, onImageLoaded, false, 0, true );
loader.load( new URLRequest( "theURL" ) );
stage.addChild( loader );

Затем используйте эту функцию в той же области.

function onImageLoaded( evt : Event ) : void
{
    loader.contentLoaderInfo.removeEventListener( Event.COMPLETE, onImageLoaded );
}

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

Надеюсь, это поможет!

person Jordan    schedule 08.01.2013
comment
Спасибо, и вы правы. Я использую загрузчик (точнее, библиотеку greensock LoaderMax). Получение свойств объекта не является проблемой. Даже если я полностью загружаю изображения в память (или даже встраиваю их в SWF во время компиляции вместо использования загрузчика), добавление их на дисплей через addChild, кажется, добавляет задержку (для больших изображений 10MP +) . Если я попытаюсь использовать addChild для родительского элемента с visible = false ... тогда при установке этого родительского элемента в visible.true после загрузки и добавления дочерних элементов это вызовет ту же проблему. - person producerism; 09.01.2013
comment
Похоже, что вы ничего не можете сделать с помощью средства визуализации DisplayList для решения вашей проблемы, но может помочь просто использовать совершенно другой подход к визуализации. Вы пробовали использовать Starling или какой-либо другой 2D-фреймворк на основе Stage3D? Используя Stage3D, вы ограничены размером текстуры 2048x2048, но вы можете разделить большие изображения на несколько частей. - person borisgolovnev; 11.01.2013
comment
@borisgolovnev - Я изучил Starling для повышения производительности, и, возможно, действительно придется пойти по этому пути, если эта проблема станет более распространенной по мере продолжения разработки. Спасибо, я продолжу рассматривать это как вариант. Я также рассматривал возможность использования чего-то вроде DeepZoom, который разбивает изображения в высоком разрешении на множество разных плиток, но большинство проектов было заброшено, и в любом случае это не идеально. Но еще одним отличным вариантом была бы система тайлов с отбраковкой ... если она уже существует. - person producerism; 11.01.2013