![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
|
Думал заюзать BitmapData.noise, чтобы создать рандомные точки для копирования, а он оказывается довольно тормознутый (функция ниже работает в 2раза медленней, чем предложеный вариант выше), но эффект получился довольно красивый! Точки не сразу ставятся на свои места, а плавно проявляются.
var cnt:int = 0;
function onDraw2(e:Event):void {
var alphaBitmap:BitmapData = new BitmapData(bitmapWidth, bitmapHeight, true);
alphaBitmap.noise(cnt++, 0,50, BitmapDataChannel.ALPHA);
resultBitmapData.copyPixels(myBitmapData, new Rectangle(0,0, bitmapWidth, bitmapHeight),
new Point(0,0), alphaBitmap,new Point(0,0), false);
}
|
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Хотел как лучше, получилась всякая чушь:
var bitmapWidth:Number = 550;
var bitmapHeight:Number = 400;
var startBitmap:BitmapData = new BitmapData(bitmapWidth,bitmapHeight,false,0xFFFF00);
var endBitmap:BitmapData = new BitmapData(bitmapWidth,bitmapHeight,false,0xFF0000);
this.addChild(new Bitmap(endBitmap));
var bitmapArray:Array = new Array();
var lineArray:Array = new Array();
var rowArray:Array = new Array();
var tempArray:Array = new Array();
for (var i:Number = 0;i<bitmapWidth;i++) {
lineArray.push(i);
}
for (var j:Number = 0;j<bitmapHeight;j++) {
tempArray = (new Array()).concat(lineArray);
bitmapArray.push(tempArray);
rowArray.push(j);
}
lineArray = null;
var rand:Number;
var pixelCounter:Number = 0;
var pixelX:Number;
var pixelY:Number;
var randX:Number;
var randY:Number;
var line:Array;
var defaultRand:Number = 2000;
var t:Number = getTimer();
var enterFrameHandler:Function = function(event:Event):void {
rand = defaultRand;
while(--rand&&rowArray.length) {
randY = Math.floor(Math.random()*rowArray.length);
pixelY = rowArray[randY];
line = bitmapArray[pixelY];
randX = Math.floor(Math.random()*line.length);
pixelX = line.splice(randX,1);
line.shift();
line.pop();
endBitmap.setPixel(pixelX,pixelY,startBitmap.getPixel(pixelX,pixelY));
if (!line.length) {
rowArray.splice(randY,1);
}
}
if (rand==defaultRand-1) {
removeEventListener(Event.ENTER_FRAME,enterFrameHandler);
trace(getTimer()-t);
}
}
this.addEventListener(Event.ENTER_FRAME,enterFrameHandler);
![]() |
|
|||||
это ОЧЕНЬ плохо в цикле!. splice, shift очень ресурсоемкие операции, pop вроде не очень... но тоже занимает больше времени чем простое обращение по индексу []. Кнут сказал "90% времени выполнения программа находится в циклах, поэтому следует оптимизировать именно их" Ну, а по практике нужно думать %) Врядли я рожу тут оптимальную идею по тому как это сделать быстро( В принципе первый способ который предложен MerlinTwi Претендует на оптимальность если в него добавить мои советы %). Единственное, что я незнаю/непридумал как это создание массива с рендомными точками/получение не повторяющихся точек. %(
__________________
33 коровы |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Дык, я же не собирался демонстировать вариант оптимизации, я просто показал, какой эффект получается (а его, как раз, и дают shift, pop и splice).
Если убрать shift и pop, то мой вариант при 2000 итераций отстает от варианта MerlinTwi где-то на 50 мс. С другой стороны, длинные массивы, например, Flash 8 очень не любит — гораздо быстрее работает с множеством коротких, чем с одним длинным. Последний раз редактировалось etc; 29.11.2006 в 13:11. |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
WindWalker, а прочитать первой пост темы по ссылке совесть не позволила?
|
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
В том, что прочитана была только первая строчка. Про threshold там упоминалось несколько раз, но он не подходит из-за своей медлительности, внимательнее нужно быть.
|
|
|||||
|
Цитата:
На я как-то подымал тему работы с массивами и с ассоциативными массивами. Там были тесты для разных плееров. Ну и продолжая разговор, делал я проект там была работа я ОГРОМНЫМИ массивами. Допустим подгружались статистические данные посекундно/минутно/часово для нескольких месяцев/лет... (ну естественно не все сразу , а по запросу некоторое их количество). Но все хранилось в массиве, посчитай его виртуальную длинну реально канешно он был чуть поменьше (флеш как показывает практика хранит их по типу ассоциативных...), но все равно огромные массивы. А работало шустро %).ЗЫ проект был на мх2004.
__________________
33 коровы |
|
|||||
|
Ого теперь у меня вывих мозга
![]() |
|
|||||
|
Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
|
__etc, в твоем примере замещается не вся картинка?
|
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
MerlinTwi, вся, если убрать shift и pop. Просто с ними прикольный градиент получается
![]() __i, вместе с Дембицким делали что-то подобное, что в этой теме, так вот один длинный массив тормозил много больше, чем двумерный. |
![]() |
![]() |
Часовой пояс GMT +4, время: 11:23. |
|
|
« Предыдущая тема | Следующая тема » |
|
|