Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 07.12.2012, 18:06
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 21  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Господи пожалуйста не Новосибирск
Сообщений: 6,598
Записей в блоге: 17
Цитата:
Это решит проблему с отрисовкой, которая описывалась в первом сообщении, так как все изменение будут обрабатываться в одном месте.
Дак как решит? Отрисовка на экран всё равно будет происходить после исполнения скриптов кадра.
И тем более, по словам топикстартера - меняет width/height один раз.

Старый 07.12.2012, 19:04
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 22  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,879
Записей в блоге: 7
Цитата:
Сообщение от udaaff Посмотреть сообщение
Вот и пользуйся RENDEROM после этого... )

Добавлено через 5 минут
Тут получается надо вручную вызывать отрисовку дочерних компонентов.
Для начала нужно понять идеологию invalidate. А если ты криво написал код, то кто в этом виноват кроме тебя?)
Смысл invalidate в том, что ты сначала подготавливаешь все данные, и только перед самым рендером производишь какие-то действия. А ты в примере даешь данные и когда наступает ренедр, пытаешься передать данные снова.
Строка
Код AS3:
this._child.width = this.width / 2;
должна быть тут
Код AS3:
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;
}
Добавлено через 3 минуты
Цитата:
Сообщение от Psycho Tiger Посмотреть сообщение
Дак как решит? Отрисовка на экран всё равно будет происходить после исполнения скриптов кадра.
И тем более, по словам топикстартера - меняет width/height один раз.
Отрисовке может предшествовать сложные вычисления. Например у тебя должна рисоваться bitmapData с кучей вставок, вызывая width и height один раз, ты на самом деле рисуешь эту bitmapData два раза. С начала с новым width, а потом и с новым height. А invalidate откладывает отрисовку до самого последнего момента, когда новые width и height уже тебе известны.
__________________
(и)Нильс.ru | Плагины для FlashDevelop


Последний раз редактировалось iNils; 07.12.2012 в 21:16.
Старый 07.12.2012, 20:16
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 23  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Я думаю, Psycho Tiger прекрасно знает что такое invalidate, и пытается сказать что к проблеме топикстартера это никак не относится. Проблема то не в сотне ненужных вычислений, а в том что изменение размеров происходит у него вроде как (визуально) за два кадра.
__________________
Reality.getBounds(this);

Старый 07.12.2012, 20:30
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 24  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Господи пожалуйста не Новосибирск
Сообщений: 6,598
Записей в блоге: 17
Цитата:
Сообщение от Wolsh Посмотреть сообщение
Я думаю, Psycho Tiger прекрасно знает что такое invalidate, и пытается сказать что к проблеме топикстартера это никак не относится. Проблема то не в сотне ненужных вычислений, а в том что изменение размеров происходит у него вроде как (визуально) за два кадра.
Ну да, относится слабо, но я всё-таки ещё не до конца понял.
Цитата:
А invalidate откладывает отрисовку до самого последнего момента, когда новые width и height уже тебе известны.
Т.е. в момент Event.RENDER отрисовки не происходит? В этот момент я могу 40 раз поменять width/height, и это никак не скажется на производительности?
Я имею ввиду, что:
"Обычное" время:
Код AS3:
s.width = 100; //перерисовалось
s.height = 100; //опять
А в момент Event.RENDER
Код AS3:
s.width = 100; //не перерисовалось, потому что Event.RENDER
s.height = 100; //всё ещё не перерисовалось
И в после завершения Event.RENDER начинается отрисовка?

Именно из за этих соображений для Event.RENDER нужно инициализировать через invalidate?

Старый 07.12.2012, 21:15
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 25  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,879
Записей в блоге: 7
Из описания Event.RENDER
Цитата:
Отправляется перед обновлением и визуализацией списка отображения. Это событие дает последнюю возможность объектам, прослушивающим данное событие, внести изменения перед визуализацией списка отображения
Просто так оно не отправляется. Для того, что оно отправилось, нужно сделать stage.invalidate ()

Схема такая:
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.
__________________
(и)Нильс.ru | Плагины для FlashDevelop

Старый 07.12.2012, 21:44
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 26  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Господи пожалуйста не Новосибирск
Сообщений: 6,598
Записей в блоге: 17
НилЬс, я отлично и прекрасно знаю, что такое инвалидаторы и как они работают. Но твой пример в этом контексте описывает несколько иное поведение, что меня и смущает.
Инвалидатор складывает изменения в буфер, а потом работает с ними, прямо перед обновлением. Если мы поменяем width у объекта 40 раз – объект перерисуется 40 раз. Если копить в буфере – то один перед отрисовкой Event.RENDER. С этим вопросов нет.

Но в контексте этой темы:
Автор меняет width/height по одному разу, т.е. объект перерисовывается дважды. Ты утверждаешь, что с инвалидатором мы обновим объект один раз, а не два. Из твоего последнего поста ситуация так и не прояснилась: во время Event.RENDER мы установим как width, так и height, и во время каждой из этих установок объект обновится, т.е. дважды.
Короче говоря, я считаю, что меняя по разу width/height совершенно не важно, на каком этапе это будет происходить. Объект перерисуется дважды. Сможешь объяснить где я не прав из моих слов?


Последний раз редактировалось iNils; 07.12.2012 в 22:34.
Старый 07.12.2012, 22:23
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 27  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,879
Записей в блоге: 7
Ты не прав в том месте, где утверждаешь, что
Цитата:
во время Event.RENDER мы установим как width, так и height, и во время каждой из этих установок объект обновится
Изменятся значения width и height, но объект ты нарисуешь после Event.RENDER, а он вызывается один раз.

Допустим ты подписан на Event.ENTER_FRAME.
Там ты изменил width, там новое значение записалось в _width и для changed выставилось true, что в свою очередь вызвало stage.invalidate (), но пересовки нет.
Потом ты изменил height и там произошло тоже самое, что и с width.
Далее выполняется еще какой-то то код.
Но вот, все выполнилось. И плеер собирается перерисовать экран, то тут он видит, что был вызван stage.invalidate () и поэтому он посылает Event.RENDER, который у твоего объекта вызывает метод redraw и где ты стираешь graphics и рисуешь его заново.

И где ты тут видишь, что объект рисовался дважды?
__________________
(и)Нильс.ru | Плагины для FlashDevelop

Старый 07.12.2012, 22:53
udaaff вне форума Посмотреть профиль Отправить личное сообщение для udaaff Найти все сообщения от udaaff
  № 28  
Ответить с цитированием
udaaff
...

модератор форума
Регистрация: Sep 2006
Адрес: Minsk
Сообщений: 4,286
Цитата:
Сообщение от iNils Посмотреть сообщение
Строка
Код AS3:
this._child.width = this.width / 2;
должна быть тут
Код AS3:
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;
}
Ну так при таком подходе теряется смысл самой инвалидации. Допустим, свойтсво A дочерних компонентов, вычисляется как произведение B * С родительского компонента. Получается расчет А необходимо будет производить каждый раз при изменении B или C. Т.е. это уже идет не подготовка данных, а сами вычиления, которые по идее должны производиться единожды централизовано.

Добавлено через 5 минут
Единсвенным выходом, я тут вижу в ручную дергать redraw() детей на стадии рендера.

Добавлено через 9 минут
Еще смущает такой момент связанный с вызовом invalidate(), что на предмет необходимости перерисовки будут опрошены все AInvalidate объекты, а не только тот, который запросил эту самую перерисовку.

Старый 07.12.2012, 23:34
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 29  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,879
Записей в блоге: 7
Цитата:
так при таком подходе теряется смысл самой инвалидации
Можно все что угодно довести до маразма.
Ты опять не видишь суть invalidate. Ты можешь 100 раз произвести простые расчеты типа B * C, но тебе только один раз придется все от отрисовать.
Ну перемножил ты 100 раз, это не скажется на производительности. А вот когда ты 100 раз удалил содержимое graphics, 100 раз создал новую матрицу для градиента, 100 раз нарисовал этот градиент, 100 раз изменил координаты текстового поля. Или 100 раз сгенерировал новый bitmapData, 100 вызвал perlinNoise для него и т.п., тогда ты заметишь разницу.

Цитата:
Еще смущает такой момент связанный с вызовом invalidate(), что на предмет необходимости перерисовки будут опрошены все AInvalidate объекты, а не только тот, который запросил эту самую перерисовку.
Ну есть минус, но перерисованы будет только те, у которых changed == true, так в целом ...
__________________
(и)Нильс.ru | Плагины для FlashDevelop


Последний раз редактировалось iNils; 08.12.2012 в 22:53.
Старый 08.12.2012, 00:46
udaaff вне форума Посмотреть профиль Отправить личное сообщение для udaaff Найти все сообщения от udaaff
  № 30  
Ответить с цитированием
udaaff
...

модератор форума
Регистрация: Sep 2006
Адрес: Minsk
Сообщений: 4,286
Цитата:
Сообщение от iNils Посмотреть сообщение
Можно все что угодно довести до маразма.
И кого угодно
Я тебя понял: всё нативное, что касается отображения, мы задаем в redraw.
Я лишь пытаюсь смотреть на задачу в общем виде. Если у нас будет 400 детей рендомно распределяемых по области, то считать рендом 800 раз, вместо 400, не очень хотелось бы.

Создать новую тему Ответ Часовой пояс GMT +4, время: 21:50.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 21:50.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.