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

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

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

Регистрация: Mar 2001
Адрес: msk
Сообщений: 1,416
По умолчанию Помогите соптимизировать вычисления для повышения быстродействия

Вот простая функция. Она инвертирует альфу на битмапе (параллельно заливая черным цветом). Фиша в том, что если просто брать цвет из битмапа и класть его тут же на место, это будет работать на 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);
		}
	}
}

Старый 18.10.2006, 17:50
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 2  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
Цитата:
Сообщение от MyXus
Вот простая функция. Она инвертирует альфу на битмапе (параллельно заливая черным цветом).
В смысле?
__________________
(и)Нильс.ru | Плагины для FlashDevelop

Старый 18.10.2006, 22:12
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 3  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
глянь ColorTransform
в твоем случае что-то типа (трудно понять что на самом деле нужно):
Код:
bmp.colorTransform(bmp.rectangle, new ColorTransform(0, 0, 0, (maxA-minA)/255, 0, 0, 0, 255-maxA));


Последний раз редактировалось silin; 18.10.2006 в 22:27.
Старый 19.10.2006, 12:11
MyXus вне форума Посмотреть профиль Отправить личное сообщение для MyXus Посетить домашнюю страницу MyXus Найти все сообщения от MyXus
  № 4  
Ответить с цитированием
MyXus
 
Аватар для MyXus

Регистрация: Mar 2001
Адрес: msk
Сообщений: 1,416
Цитата:
Сообщение от iNils
В смысле?
Есть битмап. Функция занимается тем, что прописывает в каждую точку цвет 0, и инвертирует альфа-канал. Параллельно верхняя и нижняя границы альфа канала смещаются (похоже на фильтр levels в фотошопе).

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

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

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

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

Старый 19.10.2006, 16:22
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 5  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
Если я правильно понял, то надо взять BitmapData, с помощью copyChannel взять значение альфа канала, инвертнуть его и вернуть на место. И залить черным останые каналы.
__________________
(и)Нильс.ru | Плагины для FlashDevelop

Старый 19.10.2006, 16:37
MyXus вне форума Посмотреть профиль Отправить личное сообщение для MyXus Посетить домашнюю страницу MyXus Найти все сообщения от MyXus
  № 6  
Ответить с цитированием
MyXus
 
Аватар для MyXus

Регистрация: Mar 2001
Адрес: msk
Сообщений: 1,416
всё так.
Я попробую. Спасибо.


Последний раз редактировалось MyXus; 19.10.2006 в 16:39.
Старый 01.11.2006, 16:08
MyXus вне форума Посмотреть профиль Отправить личное сообщение для MyXus Посетить домашнюю страницу MyXus Найти все сообщения от MyXus
  № 7  
Ответить с цитированием
MyXus
 
Аватар для MyXus

Регистрация: Mar 2001
Адрес: msk
Сообщений: 1,416
Цитата:
Сообщение от iNils
Если я правильно понял, то надо взять BitmapData, с помощью copyChannel взять значение альфа канала, инвертнуть его и вернуть на место. И залить черным останые каналы.
Что-то у меня ничего не выходит. copyChannel копирует канал из битмапа в битмап, и никак получить его в качестве отдельного массива у меян не получается, а инвертировать канал с помощью colorTransform получается также, как и в примере, который я выложил выше. (то есть глюкаво)

Старый 01.11.2006, 16:27
MyXus вне форума Посмотреть профиль Отправить личное сообщение для MyXus Посетить домашнюю страницу MyXus Найти все сообщения от MyXus
  № 8  
Ответить с цитированием
MyXus
 
Аватар для MyXus

Регистрация: Mar 2001
Адрес: msk
Сообщений: 1,416
Я нашел решение, но это издевательство..
надо предварительно красить инфертируемую флешку в цвет 01000000, тогда colorTransform не глючит, но этож сипец. Никто не может поэлегантней придумать?

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

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

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


 


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


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