|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
блогер
Регистрация: Jun 2005
Адрес: Господи пожалуйста не Новосибирск
Сообщений: 6,598
Записей в блоге: 17
|
Цитата:
И тем более, по словам топикстартера - меняет width/height один раз.
__________________
Тут мужик танцует и поёт про флэш |
|
|||||
Негуру
администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,879
Записей в блоге: 7
|
Цитата:
Смысл invalidate в том, что ты сначала подготавливаешь все данные, и только перед самым рендером производишь какие-то действия. А ты в примере даешь данные и когда наступает ренедр, пытаешься передать данные снова. Строка должна быть тут override public function set width(value:Number):void { if (this._width == value) return; Logger.trace("parent width set to ", value); this._width = value; this._child.width = value / 2; super.changed = true; } Отрисовке может предшествовать сложные вычисления. Например у тебя должна рисоваться bitmapData с кучей вставок, вызывая width и height один раз, ты на самом деле рисуешь эту bitmapData два раза. С начала с новым width, а потом и с новым height. А invalidate откладывает отрисовку до самого последнего момента, когда новые width и height уже тебе известны. Последний раз редактировалось iNils; 07.12.2012 в 21:16. |
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Я думаю, Psycho Tiger прекрасно знает что такое invalidate, и пытается сказать что к проблеме топикстартера это никак не относится. Проблема то не в сотне ненужных вычислений, а в том что изменение размеров происходит у него вроде как (визуально) за два кадра.
__________________
Reality.getBounds(this); |
|
|||||
блогер
Регистрация: Jun 2005
Адрес: Господи пожалуйста не Новосибирск
Сообщений: 6,598
Записей в блоге: 17
|
Цитата:
Цитата:
Я имею ввиду, что: "Обычное" время: А в момент Event.RENDER s.width = 100; //не перерисовалось, потому что Event.RENDER s.height = 100; //всё ещё не перерисовалось Именно из за этих соображений для Event.RENDER нужно инициализировать через invalidate?
__________________
Тут мужик танцует и поёт про флэш |
|
|||||
Негуру
администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,879
Записей в блоге: 7
|
Из описания Event.RENDER
Цитата:
Схема такая: 1. Идет рассылка событий типа клика мыши или нажатия клавиши 2. Идет рассылка события Event.ENTER_FRAME 3. Идет рассылка события Event.EXIT_FRAME 4. Идет рассылка события загрузки, типа Event.INIT, Event.OPEN, Event.COMPLETE и тп. 5. Идет рассылка события Event.RENDER, если в любом из этапов 1-4 был вызван stage.invalidate () 6. Плеер выводит графику. Допустим у нас есть спрайт с нарисованным квадратом 100 на 100, у которого переопределен width. Когда мы его меняем на этапе 1-4, допустим на 200, то сохраняем его значение в _width и вызваем stage.invalidate (). Если после этого, кто-то обратится к свойству width, то он вернет значение _width, то есть 200. Когда все события разосланы и плеер собирается отрисовать графику, рассылается последнее событие Event.RENDER, которые вызывает наш redraw, где мы что-то делаем. Допустим стираем graphics и рисуем новый прямоугольник, но с шириной равной _width. |
|
|||||
блогер
Регистрация: Jun 2005
Адрес: Господи пожалуйста не Новосибирск
Сообщений: 6,598
Записей в блоге: 17
|
НилЬс, я отлично и прекрасно знаю, что такое инвалидаторы и как они работают. Но твой пример в этом контексте описывает несколько иное поведение, что меня и смущает.
Инвалидатор складывает изменения в буфер, а потом работает с ними, прямо перед обновлением. Если мы поменяем width у объекта 40 раз – объект перерисуется 40 раз. Если копить в буфере – то один перед отрисовкой Event.RENDER. С этим вопросов нет. Но в контексте этой темы: Автор меняет width/height по одному разу, т.е. объект перерисовывается дважды. Ты утверждаешь, что с инвалидатором мы обновим объект один раз, а не два. Из твоего последнего поста ситуация так и не прояснилась: во время Event.RENDER мы установим как width, так и height, и во время каждой из этих установок объект обновится, т.е. дважды. Короче говоря, я считаю, что меняя по разу width/height совершенно не важно, на каком этапе это будет происходить. Объект перерисуется дважды. Сможешь объяснить где я не прав из моих слов?
__________________
Тут мужик танцует и поёт про флэш Последний раз редактировалось iNils; 07.12.2012 в 22:34. |
|
|||||
Негуру
администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,879
Записей в блоге: 7
|
Ты не прав в том месте, где утверждаешь, что
Цитата:
Допустим ты подписан на Event.ENTER_FRAME. Там ты изменил width, там новое значение записалось в _width и для changed выставилось true, что в свою очередь вызвало stage.invalidate (), но пересовки нет. Потом ты изменил height и там произошло тоже самое, что и с width. Далее выполняется еще какой-то то код. Но вот, все выполнилось. И плеер собирается перерисовать экран, то тут он видит, что был вызван stage.invalidate () и поэтому он посылает Event.RENDER, который у твоего объекта вызывает метод redraw и где ты стираешь graphics и рисуешь его заново. И где ты тут видишь, что объект рисовался дважды? |
|
|||||
...
модератор форума
Регистрация: Sep 2006
Адрес: Minsk
Сообщений: 4,286
|
Цитата:
Добавлено через 5 минут Единсвенным выходом, я тут вижу в ручную дергать redraw() детей на стадии рендера. Добавлено через 9 минут Еще смущает такой момент связанный с вызовом invalidate(), что на предмет необходимости перерисовки будут опрошены все AInvalidate объекты, а не только тот, который запросил эту самую перерисовку. |
|
|||||
Негуру
администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,879
Записей в блоге: 7
|
Цитата:
Ты опять не видишь суть invalidate. Ты можешь 100 раз произвести простые расчеты типа B * C, но тебе только один раз придется все от отрисовать. Ну перемножил ты 100 раз, это не скажется на производительности. А вот когда ты 100 раз удалил содержимое graphics, 100 раз создал новую матрицу для градиента, 100 раз нарисовал этот градиент, 100 раз изменил координаты текстового поля. Или 100 раз сгенерировал новый bitmapData, 100 вызвал perlinNoise для него и т.п., тогда ты заметишь разницу. Цитата:
Последний раз редактировалось iNils; 08.12.2012 в 22:53. |
|
|||||
...
модератор форума
Регистрация: Sep 2006
Адрес: Minsk
Сообщений: 4,286
|
И кого угодно
Я тебя понял: всё нативное, что касается отображения, мы задаем в redraw. Я лишь пытаюсь смотреть на задачу в общем виде. Если у нас будет 400 детей рендомно распределяемых по области, то считать рендом 800 раз, вместо 400, не очень хотелось бы. |
Часовой пояс GMT +4, время: 21:50. |
|
« Предыдущая тема | Следующая тема » |
|
|