![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Ну да. Сама ситуация как в твоем тесте непрактична, потому что подразумевается, что парент перерисуется в текущем кадре, а чайлд — только при следующем рендере, то есть в следующем кадре. И если такой цепочкой будет собран компонент из нескольких наследников AInvalidate, простой ресайз сцены превратится в многосерийный мультик о захватывающей внутренней жизни компонентов.
__________________
Reality.getBounds(this); |
|
|||||
|
...
модератор форума
Регистрация: Sep 2006
Адрес: Minsk
Сообщений: 4,286
|
Задача, на самом деле, интересная и нетривиальная. Если заморочиться с подобной инвалидацией свойств, то надо будет писать менеджер, который будет всё это укладывать в один кадр. Но игра, на мой взгляд не стоит свеч. Я использую такой "отложенный расчет" только в нескольких классах-лейаутах, которые позиционируют детей, т.к. за раз может добавиться целая пачка, то чтобы не считать при каждом добавлении.
|
|
|||||
|
Цитата:
И тем более, по словам топикстартера - меняет width/height один раз.
__________________
Тут мужик танцует и поёт про флэш |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Я думаю, Psycho Tiger прекрасно знает что такое invalidate, и пытается сказать что к проблеме топикстартера это никак не относится. Проблема то не в сотне ненужных вычислений, а в том что изменение размеров происходит у него вроде как (визуально) за два кадра.
__________________
Reality.getBounds(this); |
|
|||||
|
Цитата:
Цитата:
Я имею ввиду, что: "Обычное" время: А в момент Event.RENDER s.width = 100; //не перерисовалось, потому что Event.RENDER s.height = 100; //всё ещё не перерисовалось Именно из за этих соображений для Event.RENDER нужно инициализировать через invalidate?
__________________
Тут мужик танцует и поёт про флэш |
|
|||||
|
Негуру
администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 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. |
|
|||||
|
НилЬс, я отлично и прекрасно знаю, что такое инвалидаторы и как они работают. Но твой пример в этом контексте описывает несколько иное поведение, что меня и смущает.
Инвалидатор складывает изменения в буфер, а потом работает с ними, прямо перед обновлением. Если мы поменяем width у объекта 40 раз – объект перерисуется 40 раз. Если копить в буфере – то один перед отрисовкой Event.RENDER. С этим вопросов нет. Но в контексте этой темы: Автор меняет width/height по одному разу, т.е. объект перерисовывается дважды. Ты утверждаешь, что с инвалидатором мы обновим объект один раз, а не два. Из твоего последнего поста ситуация так и не прояснилась: во время Event.RENDER мы установим как width, так и height, и во время каждой из этих установок объект обновится, т.е. дважды. Короче говоря, я считаю, что меняя по разу width/height совершенно не важно, на каком этапе это будет происходить. Объект перерисуется дважды. Сможешь объяснить где я не прав из моих слов?
__________________
Тут мужик танцует и поёт про флэш Последний раз редактировалось iNils; 07.12.2012 в 22:34. |
|
|||||
|
Негуру
администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
|
Ты не прав в том месте, где утверждаешь, что
Цитата:
Допустим ты подписан на Event.ENTER_FRAME. Там ты изменил width, там новое значение записалось в _width и для changed выставилось true, что в свою очередь вызвало stage.invalidate (), но пересовки нет. Потом ты изменил height и там произошло тоже самое, что и с width. Далее выполняется еще какой-то то код. Но вот, все выполнилось. И плеер собирается перерисовать экран, то тут он видит, что был вызван stage.invalidate () и поэтому он посылает Event.RENDER, который у твоего объекта вызывает метод redraw и где ты стираешь graphics и рисуешь его заново. И где ты тут видишь, что объект рисовался дважды? |
|
|||||
|
Негуру
администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 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, время: 11:58. |
|
|
« Предыдущая тема | Следующая тема » |
|
|