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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 09.12.2012, 15:03
romzes вне форума Посмотреть профиль Отправить личное сообщение для romzes Найти все сообщения от romzes
  № 1  
Ответить с цитированием
romzes

Регистрация: Mar 2010
Сообщений: 18
По умолчанию Работа с альфа-каналом Bitmapdata с высокой производительностью

Всем доброго дня.

Мне нужно получить BitmapData, залитую одним цветом, чтоб она вся была полупрозрачной, а в некоторых местах чтоб в ней были полностью прозрачные "дыры" произвольной формы, с "мягкими" краями. И чтоб можно было программно управлять видом и положением этих дыр. Всё это нужно делать каждый кадр, а стало быть нужно делать быстро.
Размер BitmapData 600 на 500 пикселей. Она впоследствии будет с помощью copyPixels накладываться с прозрачностью на другую BitmapData. Это всё - часть программы визуализации на основе блиттинга.

Я пробовал сделать так.
  • создаю bd:BitmapData с поддержкой прозрачности и заливаю её желаемым цветом с желаемой прозрачностью всей итоговой BitmapData
  • создаю alpha_bd:BitmapData без поддержки прозрачности и заливаю ее цветом, в котором синяя и зеленая составляющие равны 0, а красная равна желаемой прозрачности всей итоговой BitmapData
Потом каждый кадр:
  • заливаю bd и alpha_bd теми же цветами с помощью fillRect
  • у меня есть массив с координатами и BitmapData-ми "дыр". BitmapData дыры вся черная и с альфа-каналом в форме дыры. Для каждой дыры:
    • с помощью copyPixels копирую "дыру" на alpha_bd в нужном месте
    • с помощью copyChannel копирую красный канал alpha_bd в альфа-канал bd, только в прямоугольнике, который изменился после наложения "дыры".
Готово! bd имеет нужный мне вид и готова к дальнейшему использованию.

Только производительность падает. Судя по моим измерениям, самое медленное место - copyChannel.

Подскажите пожалуйста, как можно сделать это всё быстрее?

Насколько я понимаю, существуют фреймворки, которые реализуют что-то подобное, но если это возможно, хотелось бы обойтись без них - весь остальной код уже написал сам и хочется всё сделать самому)

Спасибо!


Последний раз редактировалось romzes; 09.12.2012 в 15:23.
Старый 09.12.2012, 16:30
Sintesis вне форума Посмотреть профиль Отправить личное сообщение для Sintesis Найти все сообщения от Sintesis
  № 2  
Ответить с цитированием
Sintesis
 
Аватар для Sintesis

Регистрация: Jul 2008
Сообщений: 912
Можно попробовать векторной графикой это сделать с помощью Shape.graphics http://help.adobe.com/ru_RU/FlashPla.../Graphics.html

Старый 09.12.2012, 19:35
cleptoman вне форума Посмотреть профиль Отправить личное сообщение для cleptoman Найти все сообщения от cleptoman
  № 3  
Ответить с цитированием
cleptoman
 
Аватар для cleptoman

блогер
Регистрация: Mar 2007
Сообщений: 1,291
Записей в блоге: 5
Отправить сообщение для cleptoman с помощью ICQ
тяжеловато...а не пробовали просто таскать ваши красные "псевдодырки" поверх с режимом наложения EREASE? и срисовывать результат только когда вам нужно, а не каждый кадр.
__________________
http://cleptoman.free-lance.ru
achivements: дважды благословлен на воровство. осеяный благодатью

Старый 09.12.2012, 20:23
Sintesis вне форума Посмотреть профиль Отправить личное сообщение для Sintesis Найти все сообщения от Sintesis
  № 4  
Ответить с цитированием
Sintesis
 
Аватар для Sintesis

Регистрация: Jul 2008
Сообщений: 912
А вообще можно попробовать в Stage3D блендинг.

Старый 09.12.2012, 20:49
romzes вне форума Посмотреть профиль Отправить личное сообщение для romzes Найти все сообщения от romzes
  № 5  
Ответить с цитированием
romzes

Регистрация: Mar 2010
Сообщений: 18
Спасибо, буду пробовать.

В случае с использованием Shape.graphics, я так понимаю, нужно будет создавать объект класса Shape и потом переносить его на нужную мне BitmapData с помощью метода draw? Попробовать можно, но не совсем уверен - "дырки" хочется делать растровыми, чтоб иметь возможность нарисовать их любой формы. К тому же, в перспективе я их (дырки) планировал анимировать.

С blendMode.ERASE, я так понял, нужно будет создавать Sprite с изображением дырки и переносить его на нужную мне BitmapData с помощью метода draw с режимом наложения ERASE, правильно? Попробую.
Немного смущает, что вроде бы draw довольно медленный. Надо будет померить, что быстрее.
Да, на счет срисовывания не каждый кадр разумное замечание. У даже меня так и сделано уже (не стал упоминать в и так длиннющем описании проблемы) ), но это мало помогает - "дырки" всё время двигаются.

Почти ничего не знаю о Stage3D. Только сейчас понял, что её можно использовать и для ускорения 2D-графики. Возможно, стоит всё переделать под неё. Изучаю, спасибо за совет)

Старый 09.12.2012, 21:35
Sintesis вне форума Посмотреть профиль Отправить личное сообщение для Sintesis Найти все сообщения от Sintesis
  № 6  
Ответить с цитированием
Sintesis
 
Аватар для Sintesis

Регистрация: Jul 2008
Сообщений: 912
Цитата:
Сообщение от romzes Посмотреть сообщение
Спасибо, буду пробовать.

В случае с использованием Shape.graphics, я так понимаю, нужно будет создавать объект класса Shape и потом переносить его на нужную мне BitmapData с помощью метода draw?
Не обязательно всё отрисовывать в bitmap, не пробовал таким заниматься, но вроде есть матрицы которыми можно управлять заливками и градиентами.
Если решили сделать это в Stage3D то только на готовых движках Starling например, без движка новичку в Stage3D делать нечего.
Можно и шейдер такого материала написать, но это сложно.
А самое простое и самое быстроработающее решение вот:
например обратите внимание на Alternativa3D 8 там есть standerdmaterial в нём есть уже готовое решение для вашей задачи - это opacity map в Альтернативе 8 можно 3D проекцию отключить и всё готово. Скорее всего opacity map есть и в Starling'е. Блин, хотя это то-же самое) опасити мап то-же битмап и в неё то-же прийдётся рисовать.


Последний раз редактировалось Sintesis; 09.12.2012 в 21:47.
Старый 10.12.2012, 21:44
romzes вне форума Посмотреть профиль Отправить личное сообщение для romzes Найти все сообщения от romzes
  № 7  
Ответить с цитированием
romzes

Регистрация: Mar 2010
Сообщений: 18
Благодарю за совет.
С этой задачей меня никто кроме меня самого не торопит, и энтузиазм пока есть, так что я всё же сначала рискну разобраться в Stage3D API и AGAL-е.
Нашел серию статей от Марко Скабиа - http://www.adobe.com/devnet/author_b...co_scabia.html Пишет доходчиво и начиная с самых азов. Пока всё понятно и к тому ж увлекательно.
Конечно, если ничего не выйдет, обращусь к Starling или Альтернативе. Еще читал хвалебные отзывы о Genome2D - https://github.com/pshtif/Genome2D

Старый 10.12.2012, 21:54
Sintesis вне форума Посмотреть профиль Отправить личное сообщение для Sintesis Найти все сообщения от Sintesis
  № 8  
Ответить с цитированием
Sintesis
 
Аватар для Sintesis

Регистрация: Jul 2008
Сообщений: 912
тогда тебе пригодится книжка можешь поискать оригрнал на английском, а тут вот перевод есть, спасибо redefy! http://redefy.net/2011/12/14/adobe-f...e3d-chapter-1/

Старый 11.12.2012, 02:53
zuxul вне форума Посмотреть профиль Отправить личное сообщение для zuxul Найти все сообщения от zuxul
  № 9  
Ответить с цитированием
zuxul

Регистрация: Dec 2009
Адрес: 59°13′N, 39°54′E
Сообщений: 445
Записей в блоге: 1
Если самое медленное место copyChanel избавьтесь от него. Почему у Вас не получается все сделать с помощью copyPixels?

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

Теги
bitmapdata , copyChannel , производительность
Опции темы
Опции просмотра

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

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


 


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


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