![]() |
Модераторы: Snowy, Alexeis, MetalFan |
![]() ![]() ![]() |
|
CompWorm |
|
|||
![]() Допеределыватель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1689 Регистрация: 6.12.2004 Где: / Репутация: нет Всего: 31 |
нет, нет! у меня не совсем обычный поворот изображения.
я уже понял что нормальных алгоритмов поворота не найти, поэтому вопрос немного в другом. (но если есть у вас хороший алгоритм - буду рад заюзать ![]() вот надо повернуть огромное изображение и часть его отрисовать в небольшом имидже. помогите придумать шустрый алгоритм. ![]() пока придумал следующую оптимизацию, коей не сильно доволен. ![]() итак, - грузим большое изображение в битмап - из большого изображения BitBlt'им в битмап1 кусок вдвое больше имиджа, на который выводим. - поворачиваем битмап1 и результат пишем в битмап2 - из повернутого в битмап2 изображения, которое все еще вдвое больше имиджа, BitBlt'им кусок из середины, равный имиджу в этот имидж. - повторить ![]() вот прога http://www.filehoster.ru/files/bx3882 поворот взял конечно чужой. он в модуле Rotate... больше 10 фпс не выдает, хотя существенно быстрее, чем крутить все изображение целиком. кто может подсказать алгоритм быстрее моего дам плюс ![]() |
|||
|
||||
AntonN |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 491 Регистрация: 8.8.2006 Репутация: 7 Всего: 18 |
Вырезать из большого центр, размеры нетрудно посчитать (диагонали области вывода будут габаритными), сохраняем в буфере (единожды, а не как в примере).
На подопытный битмап наносим повернутое изображение из буфера, выводим в область вывода. Вот чуть оптимизированный вариант, примерно 10-15% выигрыша ![]()
Для более серьезного ускорения нужно уже бросать scanline и работать с памятью напрямую (scanline годится для последовательной выборки строк, а не как в данном случае - вразнобой, хоть и в 7 раз быстрее чем с pixels[] ![]() |
|||
|
||||
CompWorm |
|
|||
![]() Допеределыватель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1689 Регистрация: 6.12.2004 Где: / Репутация: нет Всего: 31 |
благодарю, лови плюс.
поместил в отдельный тред и наступило счастье (тут) модификации к _scanline это конечно хорошо, но ты упомянул работу с памятью (я так надеюсь, без директ-ыхс)... можно попросить тебя ответить более развернуто? какая именно память, ссылки на статьи и исходники дабы я мог обучиться этому кудесничеству... ![]() |
|||
|
||||
AntonN |
|
||||||||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 491 Регистрация: 8.8.2006 Репутация: 7 Всего: 18 |
могу скинуть примерчик, но попозже, работаю ![]() Если описательно: Создается обычный динамический массив, array of dword (4 байта, как раз ARGB). Массив линейный даже можно.
Выделяется его ровно на кол-во пикселей в нашей картинке и битмап в него загоняется:
Все, теперь в памяти кусок данных, доступ к "пикселям":
Используем эти функции вместо соотвествующих в функции поворота, скорость доступа будет гораздо быстрее. Ну а в конце сохраняем массив обратно в битмап и выводим его:
Вообще вся эта мишура тем эффективней, чем больше операций нужно провести над "битмапами". Загрузив исходные картинки в массивы и выгружая лишь один раз результат скорость будет немалая. Сам такой класс есть в моих танчиках, тут (в самом низу) - http://desksoft.ru/index.php?files&id=3&owner=3 , вроде умеет загружаться и сохраняться в битмап, ну и для самой игры он может быстро рисоваться с альфаканалом и прозрачным цветом друг на друге ![]() Функция, такая же как выше, пимерно так выглядела (писал как раз для теста ![]()
(т.е. создаешь два TBT, один исходныик, второй буферный, поворачиваешь исходник на буфер и буфер перегоняешь в битмап, битмап рисуешь на контроле). Вот ![]() |
||||||||||||
|
|||||||||||||
AntonN |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 491 Регистрация: 8.8.2006 Репутация: 7 Всего: 18 |
ну вот, немножко тестов
![]() canvas.pixel - 20,66 сек, fpt ~5 scanline - 5,43 сек, fps ~18 "массив" - 0,26 сек (с выводом в tbitmap в каждом кадре 0,28-0,29), fps~384 в каждом тесте поворачивалась картинка в цикле 100, соотношение скоростей налицо ![]() конечно зависимость от процессора, но скорость явно разная ![]() сам тест с классом-"псевдобитмапом" - http://desksoft.ru/index.php?downloads=att...ents&id=123 (190кб) |
|||
|
||||
CompWorm |
|
|||
![]() Допеределыватель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1689 Регистрация: 6.12.2004 Где: / Репутация: нет Всего: 31 |
любопытно...
действий действительно надо делать много. зачастую в приемник надо вывести десяток крупных наложенных друг на друга повернутых картинок в 10мсек. полагаю, тут как раз идея с массивами должна сильно помочь. спасибо, этого материала мне хватит поразвлекаться на неделю ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Звук, графика и видео" | |
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делится вскрытыми компонентами
FAQ раздела лежит здесь! Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |