TransparentBlt+AlphaBlend+Rotating+Optimizing... ручками

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
X-hacker
Обычный пользователь
Обычный пользователь
 
Сообщения: 83
Зарегистрирован: 26.08.2006 (Сб) 1:22
Откуда: Moldova

TransparentBlt+AlphaBlend+Rotating+Optimizing... ручками

Сообщение X-hacker » 17.02.2007 (Сб) 3:26

1: Пытался сделать... загемороился
2: Суть ->
Возникла необходимость сделать функцию/class, которая может отобразить картинку под определённым углом(типа PlgBlt), c прозрачным цветом(TransparentBlt), но без стретчинга(то есть если картинка 100*100 то так её и оставить), и прозрачностью относительно фона(AlphaBlend).
3: DirectDraw НЕ ПОДХОДИТ, ВСЕ ЕТИ ф-и по отдельности (сначала TransparentBlt на временный девайс, патом Alpha на третий и PlgBlt обратно) НЕ ПОДХОДИТ
4: Работа должна происходить на битовом уровне, используя только
DIB'ы и GetDIBits\SetDIBitsToDevice, там уже и куча оптимизаций.
5: ОЧЕНЬ долго пытался сделать сам, но честно говоря добился только совмещения TransparentBlt и AlphaBlend, да и то тормозит немного Зато ручками!
6: Очень прошу помочь, а то я загемороился совсем, да и примеров нигде не нашёл...

EUGY
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 214
Зарегистрирован: 09.11.2006 (Чт) 22:51
Откуда: Мурманск

Сообщение EUGY » 17.02.2007 (Сб) 4:10


X-hacker
Обычный пользователь
Обычный пользователь
 
Сообщения: 83
Зарегистрирован: 26.08.2006 (Сб) 1:22
Откуда: Moldova

Сообщение X-hacker » 17.02.2007 (Сб) 6:56

EUGY писал(а):http://upload.wikimedia.org/wikipedia/en/thumb/1/11/Thaivillageflood.jpg/350px-Thaivillageflood.jpg

И?

EUGY
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 214
Зарегистрирован: 09.11.2006 (Чт) 22:51
Откуда: Мурманск

Сообщение EUGY » 17.02.2007 (Сб) 7:06

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

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 17.02.2007 (Сб) 13:53

Что тебе нужно? Конкретно.
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

X-hacker
Обычный пользователь
Обычный пользователь
 
Сообщения: 83
Зарегистрирован: 26.08.2006 (Сб) 1:22
Откуда: Moldova

Сообщение X-hacker » 18.02.2007 (Вс) 0:09

Нужно рендерить квадратную картинку поверх фона с определённой степенью прозрачности и с полностью прозрачным (например vbMagenta) цветом и под определённым углом.
Но, использовать минимум апи функций и работать массивами байтов.

Кстати, скачал 4кб демку Алибека.Утром посмотрю, там вроде есть то что нужно.
Хотя это как назло: искал, искал, создал тему и нашёл.Лишнюю получается...

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 18.02.2007 (Вс) 0:31

Так. А теперь - что не получается?
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

X-hacker
Обычный пользователь
Обычный пользователь
 
Сообщения: 83
Зарегистрирован: 26.08.2006 (Сб) 1:22
Откуда: Moldova

Сообщение X-hacker » 21.02.2007 (Ср) 12:50

Получается - сделал прозрачность, (в том числе и определённого цвета)
Не получается :
1: Правильно повернуть картинку (с синусами и косинусами замучался, поворот то есть, но очень уж коряво)
2: Сглаживание пытался сделать (больно уж квадратное всё при вращении). Получилось всё что угодно (высветление/затемнение, инверсия и др.), но только не сглаживание
__________________________________________________________
Заметил, что если картинка маленькая (до 300х300) то выигрыш в быстродействии примерно вдвое!!!
Проц - 1.41 ГГц

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 21.02.2007 (Ср) 13:17

На vbaccelerator было и то, и другое.
Мой код для вращения лежит на http://mix.web.ur.ru/v7.rar , я с ним квадратностей не видел.
Изображение

X-hacker
Обычный пользователь
Обычный пользователь
 
Сообщения: 83
Зарегистрирован: 26.08.2006 (Сб) 1:22
Откуда: Moldova

Сообщение X-hacker » 23.02.2007 (Пт) 18:23

tyomitch
Скачал, дома посмотрю.
Вот недостаток АПИ (А может просто плохая оптимизация) ->>
Вложения
API.rar
(326.84 Кб) Скачиваний: 211
Transparency.jpg
Transparency.jpg (33.81 Кб) Просмотров: 3430

X-hacker
Обычный пользователь
Обычный пользователь
 
Сообщения: 83
Зарегистрирован: 26.08.2006 (Сб) 1:22
Откуда: Moldova

Сообщение X-hacker » 23.02.2007 (Пт) 22:01

А вот пример на массивах и скрин с моего бэйсика.
(С оптимизациями по имени таймер, я добивался результата в 230-270 фпс)
tyomitch
Большое спасибо за пример, очень пригодился 8)
Вложения
HighPerfomance.jpg
HighPerfomance.jpg (61.69 Кб) Просмотров: 3423
NOT API.rar
(326.15 Кб) Скачиваний: 185
Последний раз редактировалось X-hacker 23.02.2007 (Пт) 22:07, всего редактировалось 1 раз.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 23.02.2007 (Пт) 22:03

Я не пойму -- вопросы, заданные в среду, ещё актуальны или уже нет?
Изображение

X-hacker
Обычный пользователь
Обычный пользователь
 
Сообщения: 83
Зарегистрирован: 26.08.2006 (Сб) 1:22
Откуда: Moldova

Сообщение X-hacker » 23.02.2007 (Пт) 22:14

Да:
Во-первых - оптимизация, т.к. при больших спрайтах тормоза нереальные.
Во-вторых (это впринципе к первому) - там биты можно как-то копировать из памяти не прибегая к GetDIBits, а это возможно даст большую скорость.
(Цель то ведь - максимальное быстродействие при отсутствии ДХ и ОпенГЛ а так же минимум АПИ но на VB)
3: Как сделать form1.Refresh и form1.CLS на АПИ (Подозреваю увеличение быстродействия)

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 23.02.2007 (Пт) 22:19

Так что, с поворотами и ресэмплингом вопросов нет?
Изображение

X-hacker
Обычный пользователь
Обычный пользователь
 
Сообщения: 83
Зарегистрирован: 26.08.2006 (Сб) 1:22
Откуда: Moldova

Сообщение X-hacker » 23.02.2007 (Пт) 22:25

Всё ОК, тут ты помог неимоверно.
Я действительно не заметил багов, а скорость...
скорость.... ну это оптимизации

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 23.02.2007 (Пт) 22:30

X-hacker писал(а):Во-вторых (это впринципе к первому) - там биты можно как-то копировать из памяти не прибегая к GetDIBits, а это возможно даст большую скорость.

У меня в v7 GetDIBits вызывается только один раз при инициализации, вне цикла. Не обратил внимания?

X-hacker писал(а):3: Как сделать form1.Refresh и form1.CLS на АПИ (Подозреваю увеличение быстродействия)

Никак. Они влияют на буфер внутри рантайма, из которого происходит отрисовка по WM_PAINT, и к которому не добраться напрямую.
Если обходиться без них, тогда и WM_PAINT тоже придётся обрабатывать руками.
Изображение

X-hacker
Обычный пользователь
Обычный пользователь
 
Сообщения: 83
Зарегистрирован: 26.08.2006 (Сб) 1:22
Откуда: Moldova

Сообщение X-hacker » 23.02.2007 (Пт) 22:36

tyomitch писал(а):
X-hacker писал(а):Во-вторых (это впринципе к первому) - там биты можно как-то копировать из памяти не прибегая к GetDIBits, а это возможно даст большую скорость.

У меня в v7 GetDIBits вызывается только один раз при инициализации, вне цикла. Не обратил внимания?

X-hacker писал(а):3: Как сделать form1.Refresh и form1.CLS на АПИ (Подозреваю увеличение быстродействия)

Никак. Они влияют на буфер внутри рантайма, из которого происходит отрисовка по WM_PAINT, и к которому не добраться напрямую.
Если обходиться без них, тогда и WM_PAINT тоже придётся обрабатывать руками.


Я смотрел пример по сохранению картинки в джпег, там тоже не GetDIBits а CopyMemory, но я не разобрался, как это работает и у меня массив постоянно заполнен нулями.
И еще спасибо за ссылку www.vbaccelerator.com - очень полезный ресурс! 8)

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 23.02.2007 (Пт) 23:21

X-hacker писал(а):Я смотрел пример по сохранению картинки в джпег, там тоже не GetDIBits а CopyMemory, но я не разобрался, как это работает и у меня массив постоянно заполнен нулями.

А у меня в v7 даже не CopyMemory, а проецирование битмапы в массив: все изменения в массиве моментально отражаются в битмапе. Может, всё же поглядишь?
Изображение

X-hacker
Обычный пользователь
Обычный пользователь
 
Сообщения: 83
Зарегистрирован: 26.08.2006 (Сб) 1:22
Откуда: Moldova

Сообщение X-hacker » 25.02.2007 (Вс) 0:27

tyomitch
Да, вот счас на основе этого и пытаюсь совместить всё вместе.Как только будет готово обязательно выложу.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot, Google-бот и гости: 36

    TopList