Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Помогите соптимизировать вычисления для повышения быстродействия (http://www.flasher.ru/forum/showthread.php?t=86571)

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

Цитата:

Сообщение от MyXus
Вот простая функция. Она инвертирует альфу на битмапе (параллельно заливая черным цветом).

В смысле?

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

Цитата:

Сообщение от iNils
В смысле?

Есть битмап. Функция занимается тем, что прописывает в каждую точку цвет 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

Цитата:

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

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

MyXus 01.11.2006 16:27

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


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

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