Форум 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)
-   -   быстрая попиксельная обработка bitmapData (http://www.flasher.ru/forum/showthread.php?t=86921)

miramax 25.10.2006 16:33

быстрая попиксельная обработка bitmapData
 
Так и хотел назвать тему "ПОМОГИТЕ !!!!!", "ГОРЮ !!!!!!"," СРОКИ ЛЕТЯТ!!!!", "РЕБЯТА ПОДМОГНИТЕ".:)
Вобщем есть объект bitmapData. Составляется из других методом copyPixels при каждом кадре заново. По битмапдате разбросаны разноцветные пикселы.

Код:

t = getTimer();
var b:BitmapData = new BitmapData(2000, 2000);
//можно произвести какие-то действия по заливке битмап даты разными пикслеми. copyPixels из других битмапов и т.п.
var ar:Array = []
//назначаем массив с парами цветов которые будем заменять
obj = {}
obj.o = 0xff54d645;
obj.n = 0x2222dd33;
ar.push(obj)
//и так раз 100
//нужно произвести какие-то манипуляции по замене страых цветов на новые
trace(getTimer()-t)  ///нужно меньше 30

Я нашёл три основных решения
1. threshold - как нельзя лучше подходит. Но эта функция слишком медленная. И ищет по одному цвету. Т.е. перерывает весь массив пикселов и заменяет требуемый цвет на другой. Вот если бы в одной функции задать поиск и замену сразу нескольких цветов..... Тогда скорость наверное была бы приемлимой.
2. Последовательный перебор и замена пикселов методами getPixel и setPixel. Картинка 1024*768 обрабатывается > 700 милисекунд. Если создать наследника класса bitmapData и вызывать наследованные функции то скорость немного подрастает.
3. Получить методом getPixels объект ByteArray и по байтово заменить все цвета. Но сам вызов методов setPixels (имея готовый ByteArray) намного медленне чем copyPixels.
По третьему пункту см. топик
http://flasher.ru/forum/showthread.php?t=86918
Вобщем хочу обработать пикселы со скоростью функции copyPixels. Которая очень быстро копирует пикселы. Возможно есть какие-то инкапсулированные возможности bitmapData? Например что бы расширить функцию threshold. Она работает только с одним цветом за время вызова. Но похоже обрабатывает все пикселы в поисках нужного цвета.
Было бы здорово если эта функция заменяла бы несколько цветов, не обрабатывая каждый раз все пикселы заново.

etc 25.10.2006 16:41

Что-то мне подсказывает, что есть только первый вариант. Остальные явно медленнее…

Кстати, 700 мс не так уж и много.

miramax 25.10.2006 16:45

Цитата:

Сообщение от __etc
Что-то мне подсказывает, что есть только первый вариант. Остальные явно медленнее…

Кстати, 700 мс не так уж и много.

Допустим есть битмапдата в которой всего один пиксел цвета ffffff а все остальные 000000. И в первом и во втором случае время обработки одинаковое, сл-но перебираются все пикселы. Как бы заставить функцию менять не один цвет а несколько?

MerlinTwi 25.10.2006 16:58

Распиши конкретно задачу, возможно будут другие решения кроме копирования пикселей в лоб, как вариант создать несколько битмапов и накладывать друг на друга.

miramax 25.10.2006 17:06

Цитата:

Сообщение от MerlinTwi
Распиши конкретно задачу, возможно будут другие решения кроме копирования пикселей в лоб, как вариант создать несколько битмапов и накладывать друг на друга.

Это карта с битмап кэшированием. Есть эффект наведения и выделения страны, области и т.п. На картинке все страны имеют уникальный цвет, но в зависимости от того выделена страна или нет эти пикселы меняются на зелёный или на жёлтый. Из-за плавного зума и пана необходимо прорисовывать такую картинку довольно быстро. Вот именно с этой заменой возникают проблемы. Все методы что я пробовал - слишком медленные.
В принципе есть и другие пути решения, кроме присвоемия и замены уникальных цветов. Но этот самый короткий и удобный.

etc 25.10.2006 17:12

А floodFill не катит?

miramax 25.10.2006 17:29

Страна может быть извилистой, несколько раз выезжать из-за экрана. На стране, сверху есть реки. floodFill со всех сторон опробовал, подходит только частично и только для простых карт. Может просто я не могу найти правильного пути использования flooFill?.
Неизвестно где и какие пикселы появятся.

etc 25.10.2006 17:30

Сделай карту рек отдельно и накладывай сверху.

Самым нижним слоем будет карта, на которой только обведены страны.

Можно и моря выше наложить. Т.е. склеить всё copyPixels-ом.

MerlinTwi 25.10.2006 17:30

Что-то я не понял, почему
> Из-за плавного зума и пана необходимо прорисовывать такую картинку довольно быстро.
разве картинка меняется не при выделении страны? Зачем ее перерисовывать при зуме?

iNils 25.10.2006 17:31

Мне интересно, а откуда copyPixels берет начальную инфу которая картинку формирует?


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

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