PDA

Просмотр полной версии : Помогите соптимизировать вычисления для повышения быстродействия


MyXus
18.10.2006, 17:04
Вот простая функция. Она инвертирует альфу на битмапе (параллельно заливая черным цветом). Фиша в том, что если просто брать цвет из битмапа и класть его тут же на место, это будет работать на 45% быстрее чем моя функция. Получается что половину времени занимает строка, в которой вычисляется "с". Можно её както соптимизировать для двоичных вычислений?
Или вообще как-то по другому инвертить альфу битмапа..

static public function invertAlpha(bmp:flash.display.BitmapData, min_alpha:Number, max_alpha:Number):Void {
var w:Number = bmp.width;
var h:Number = bmp.height;
var c:Number;
var coef:Number = -(max_alpha - min_alpha)/255;

for(var i:Number=0;i<w;i++) {
for(var j:Number=0;j<h;j++) {
c = (0xFF - (bmp.getPixel32(i, j)>>24)&0xFF) * coef + max_alpha;
bmp.setPixel32(i, j, c<<24);
}
}
}

iNils
18.10.2006, 17:50
Вот простая функция. Она инвертирует альфу на битмапе (параллельно заливая черным цветом).В смысле?

silin
18.10.2006, 22:12
глянь ColorTransform
в твоем случае что-то типа (трудно понять что на самом деле нужно):
bmp.colorTransform(bmp.rectangle, new ColorTransform(0, 0, 0, (maxA-minA)/255, 0, 0, 0, 255-maxA));

MyXus
19.10.2006, 12:11
В смысле?
Есть битмап. Функция занимается тем, что прописывает в каждую точку цвет 0, и инвертирует альфа-канал. Параллельно верхняя и нижняя границы альфа канала смещаются (похоже на фильтр levels в фотошопе).

silin всё правильно понял. проблема в том что я по дурацки назвал переменные -) Неочевидно что значит maxA и minA. На самом деле maxA - это максимальная прозрачность битмапа. minA, соответственно, ограничивает минимальное значение прозрачности (maxA < minA).

Самое удивительное для меня - что функция colorTransform вообще не съедает ни сколько времени!! То есть ускорение 100% -)
Но есть проблема: там где на битмапе были не-инициализированные точки, колорТрансформ оставляет пустоту (хотя getPixel возвращает 0, то есть прозрачный черный).

Поскольку объяснять я не умею, выложил пример -)
www.myxus.nm.ru/1/__sample.rar
В примере экран заливается черным цветом с альфой minA, при этом в определенном месте оставляется пустое место. Потом в этом месте рисуется круг, блюрится, с него снимается битмап. И вот этот битмап я хочу проинвертировать. Смотреть только функцию invertAlpha().

Теперь я уже понимаю, что путем наименьшего сопротивления было нарисовать нужную форму в векторе, так что можно было бы обойтись без извратов с альфой.. Но раз уж колорТрансформ такой быстрый... Если с его помощью удастся решить проблему - было бы круто :-)

iNils
19.10.2006, 16:22
Если я правильно понял, то надо взять BitmapData, с помощью copyChannel взять значение альфа канала, инвертнуть его и вернуть на место. И залить черным останые каналы.

MyXus
19.10.2006, 16:37
всё так.
Я попробую. Спасибо.

MyXus
01.11.2006, 16:08
Если я правильно понял, то надо взять BitmapData, с помощью copyChannel взять значение альфа канала, инвертнуть его и вернуть на место. И залить черным останые каналы.Что-то у меня ничего не выходит. copyChannel копирует канал из битмапа в битмап, и никак получить его в качестве отдельного массива у меян не получается, а инвертировать канал с помощью colorTransform получается также, как и в примере, который я выложил выше. (то есть глюкаво)

MyXus
01.11.2006, 16:27
Я нашел решение, но это издевательство..
надо предварительно красить инфертируемую флешку в цвет 01000000, тогда colorTransform не глючит, но этож сипец. Никто не может поэлегантней придумать?