![]() |
|
||||||||||
|
|||||
|
в данном случае работает:
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(); } } 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();" или пишу, то эффект один и тот же битмап изменяеться!) |
|
|||||
|
Регистрация: Apr 2009
Сообщений: 117
|
Я так понимаю, что Bitmap при изменении его bitmapData (вероятно на следующий кадр), отобразит первый раз ее независимо от того заблокирована она или нет. Вот пример:
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(); } } |
|
|||||
|
Дак нет же, 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. |
|
|||||
|
А, я просто не тестил - подумал что у тебя код работает. Подождём гуру )
__________________
Тут мужик танцует и поёт про флэш |
|
|||||
|
Регистрация: Apr 2009
Сообщений: 117
|
А что их ждать. Тут и так все ясно - просто при изменении bitmapDat'ы, она не сразу же меняется в самом Bitmap, а просто вызывает в нем что-то вроде invalidate(). Это сигнализирует Bitmap'у о том, что при следующей отрисовке нужно обновить его собственную bitmapDat'у. Таким образом и получается, что якобы не работает lock(). Это сделано в целях экономии ресурсов, чтобы не обновлять в самом Bitmap bitmapDat'у при каждом изменении ее ссылки.
Последний раз редактировалось GentleFLASH; 22.02.2010 в 18:35. |
|
|||||
|
товарищи, вы не поняли в чем ошибка.
Если в моём первом случае закамментить "bitmapData.unlock();" то белый полосы на красном квадрате не будет. (тобишь все работает как в справочнике писанно. БитмапДата меняеться, а Битмап подгружающий её - нет!) А во втором варианте "bitmapData.unlock();" пиши или не пиши - эффект одинаковый. Битмап дата меняеться на цветную мишуру и вместо того что бы остаться красным квадратом наш Битмап становиться новой битмап датой! Вот в чем проблема - то |
|
|||||
|
Регистрация: Apr 2009
Сообщений: 117
|
все правильно, потому что в своем случае ты начинаешь ее менять со следующего кадра, при чем не в цикле, а каждый кадр, т.е Bitmap уже успел перерисовался первый раз. А по книге bitmapData меняется сразу же, т.е до наступления перерисовки Bitmap'a, еще и в цикле, поэтому нет разницы в этом случае стоит ли unlock() или нет. Однако если его не поставить и начать менять что то по событию ENTER_FRAME, то изменения уже НЕ будут отображаться в самом Bitmap'e
|
|
|||||
|
ах вот оно как на самом -то деле. Тобишь lock и unlock влияют на производительность только в том случае если битмапдата меняеться в "потом". Я правильно понял?
Вот кстати, если интересующимся интересно код "2го случая", где битмап дата меняеться на 5м кадре. (если закаментить unlock то перерисовки не случиться!) 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(); |
|
|||||
|
Регистрация: Apr 2009
Сообщений: 117
|
Это только лишь мое предположение, отражающее действительность. Как там действительно работают lock() unlock() и как конкретно на производительность влияют - нужно разработчиков спрашивать
![]() |
![]() |
![]() |
Часовой пояс GMT +4, время: 18:52. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|