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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 22.02.2010, 01:42
dixlofos вне форума Посмотреть профиль Отправить личное сообщение для dixlofos Найти все сообщения от dixlofos
  № 1  
Ответить с цитированием
dixlofos
 
Аватар для dixlofos

Регистрация: Apr 2009
Сообщений: 167
Записей в блоге: 1
По умолчанию не всегда работает lock

в данном случае работает:
Код AS3:
var bitmapData = new BitmapData(200,200,true,0xFFFF0000); 
var bitmap:Bitmap = new Bitmap(bitmapData);
addChild(bitmap);
bitmapData.lock();
var i:int = 0;
 
 
addEventListener(Event.ENTER_FRAME, ef);
function ef(e:Event):void
{
	if (i <= 100)
	{
	bitmapData.setPixel32(i,100,0x00000000);
	i++;
	}
	else 
	{
		bitmapData.unlock();
	}
 
}
а в данном нет о_О
Код AS3:
var bitmapData = new BitmapData(200,200,true,0xFFFF0000); 
var bitmap:Bitmap = new Bitmap(bitmapData);
addChild(bitmap);
bitmapData.lock();
 
for (var i = 0; i < 200; i++)
{
	for (var j = 0; j < 200; j++)
	{
		bitmapData.setPixel32(j,i, Math.floor(Math.random()*0xFFFFFFFF));
	}
}
bitmapData.unlock();
первый вариант сам нафантазировал, а второй копия из книги мукка =]
А вот очень бы хотелось что бы работал второй вариант.
(тобишь если я во втором варианте вконце программы не пишу "bitmapData.unlock();" или пишу, то эффект один и тот же битмап изменяеться!)

Старый 22.02.2010, 16:22
GentleFLASH вне форума Посмотреть профиль Отправить личное сообщение для GentleFLASH Найти все сообщения от GentleFLASH
  № 2  
Ответить с цитированием
GentleFLASH

Регистрация: Apr 2009
Сообщений: 117
Я так понимаю, что Bitmap при изменении его bitmapData (вероятно на следующий кадр), отобразит первый раз ее независимо от того заблокирована она или нет. Вот пример:

Код AS3:
var bitmapData:BitmapData = new BitmapData( 200, 200, true, 0xFFFF0000 ); 
var bitmap:Bitmap;
var i:int = 0;
 
 
 
addEventListener(Event.ENTER_FRAME, ef);
 
function ef( e:Event ):void
{
	if( i++ == 0 )
	{
		bitmap = new Bitmap(bitmapData);
		addChild(bitmap);
 
		bitmapData.lock();
		bitmapData.fillRect( bitmapData.rect, 0xFF0000FF );
	}
	else if( i <= 100 )
	{
		bitmapData.setPixel32(i,100,0x00000000);
	}
	else 
	{
		bitmapData.unlock();
	}
}

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

блогер
Регистрация: Jun 2005
Адрес: Toronto
Сообщений: 6,600
Записей в блоге: 17
Дак нет же, GentleFlash, у вас переработанный первый вариант который работает, а у человека не работает пример от Мука второй. Мне тоже интересно

Старый 22.02.2010, 17:18
GentleFLASH вне форума Посмотреть профиль Отправить личное сообщение для GentleFLASH Найти все сообщения от GentleFLASH
  № 4  
Ответить с цитированием
GentleFLASH

Регистрация: Apr 2009
Сообщений: 117
Psycho Tiger, вообще то должна быть красной картинка, если бы работал lock() корректно. После того, как ENTER_FRAME срабатывает в первый раз, мы создаем Bitmap и блокируем bitmapData, таким образом она должна остаться красной, что бы мы с ней не делали. После lock() мы заливаем ее синим цветом. Позже на экране мы ее уже видим синей, хотя она должна быть красной. Затем lock() работает прекрасно до 100 кадра, вызывается там же unlock(), и только на 101 появляется белая полоса посередине. Так что же у меня правильно работает? В том то и дело что не работает. Картинка должна остаться красной до 100 кадра, а на 101 должна стать синей с белой полоской.
Вот я и высказал предположение, что при изменении bitmapData в экземляре Bitmap, она отобразится при первой же отрисовке Bitmap'a, т.е на следующий кадр, несмотря на заблокированность.


Последний раз редактировалось GentleFLASH; 22.02.2010 в 17:43.
Старый 22.02.2010, 17:52
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 5  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Toronto
Сообщений: 6,600
Записей в блоге: 17
А, я просто не тестил - подумал что у тебя код работает. Подождём гуру )

Старый 22.02.2010, 18:33
GentleFLASH вне форума Посмотреть профиль Отправить личное сообщение для GentleFLASH Найти все сообщения от GentleFLASH
  № 6  
Ответить с цитированием
GentleFLASH

Регистрация: Apr 2009
Сообщений: 117
А что их ждать. Тут и так все ясно - просто при изменении bitmapDat'ы, она не сразу же меняется в самом Bitmap, а просто вызывает в нем что-то вроде invalidate(). Это сигнализирует Bitmap'у о том, что при следующей отрисовке нужно обновить его собственную bitmapDat'у. Таким образом и получается, что якобы не работает lock(). Это сделано в целях экономии ресурсов, чтобы не обновлять в самом Bitmap bitmapDat'у при каждом изменении ее ссылки.


Последний раз редактировалось GentleFLASH; 22.02.2010 в 18:35.
Старый 22.02.2010, 23:43
dixlofos вне форума Посмотреть профиль Отправить личное сообщение для dixlofos Найти все сообщения от dixlofos
  № 7  
Ответить с цитированием
dixlofos
 
Аватар для dixlofos

Регистрация: Apr 2009
Сообщений: 167
Записей в блоге: 1
товарищи, вы не поняли в чем ошибка.
Если в моём первом случае закамментить "bitmapData.unlock();" то белый полосы на красном квадрате не будет. (тобишь все работает как в справочнике писанно. БитмапДата меняеться, а Битмап подгружающий её - нет!)

А во втором варианте "bitmapData.unlock();" пиши или не пиши - эффект одинаковый. Битмап дата меняеться на цветную мишуру и вместо того что бы остаться красным квадратом наш Битмап становиться новой битмап датой!

Вот в чем проблема - то

Старый 23.02.2010, 00:35
GentleFLASH вне форума Посмотреть профиль Отправить личное сообщение для GentleFLASH Найти все сообщения от GentleFLASH
  № 8  
Ответить с цитированием
GentleFLASH

Регистрация: Apr 2009
Сообщений: 117
все правильно, потому что в своем случае ты начинаешь ее менять со следующего кадра, при чем не в цикле, а каждый кадр, т.е Bitmap уже успел перерисовался первый раз. А по книге bitmapData меняется сразу же, т.е до наступления перерисовки Bitmap'a, еще и в цикле, поэтому нет разницы в этом случае стоит ли unlock() или нет. Однако если его не поставить и начать менять что то по событию ENTER_FRAME, то изменения уже НЕ будут отображаться в самом Bitmap'e

Старый 23.02.2010, 01:21
dixlofos вне форума Посмотреть профиль Отправить личное сообщение для dixlofos Найти все сообщения от dixlofos
  № 9  
Ответить с цитированием
dixlofos
 
Аватар для dixlofos

Регистрация: Apr 2009
Сообщений: 167
Записей в блоге: 1
ах вот оно как на самом -то деле. Тобишь lock и unlock влияют на производительность только в том случае если битмапдата меняеться в "потом". Я правильно понял?

Вот кстати, если интересующимся интересно код "2го случая", где битмап дата меняеться на 5м кадре. (если закаментить unlock то перерисовки не случиться!)
Код AS3:
var bitmapData = new BitmapData(200,200,true,0xFFFF0000); 
var bitmap:Bitmap = new Bitmap(bitmapData);
addChild(bitmap);
bitmapData.lock();
 
var ii:int = 0;
addEventListener(Event.ENTER_FRAME, ef);
 
function ef(e:Event)
{
	ii++;
	if (ii == 5)
	{
		f1();
		ii++;
	}
}
function f1()
{
for (var i = 0; i < 200; i++)
{
	for (var j = 0; j < 200; j++)
	{
		bitmapData.setPixel32(j,i, Math.floor(Math.random()*0xFFFFFFFF));
	}
}
}
bitmapData.unlock();

Старый 23.02.2010, 01:33
GentleFLASH вне форума Посмотреть профиль Отправить личное сообщение для GentleFLASH Найти все сообщения от GentleFLASH
  № 10  
Ответить с цитированием
GentleFLASH

Регистрация: Apr 2009
Сообщений: 117
Это только лишь мое предположение, отражающее действительность. Как там действительно работают lock() unlock() и как конкретно на производительность влияют - нужно разработчиков спрашивать

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

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

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


 


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


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