Форум программистов, компьютерный форум, киберфорум
Delphi: Графика, звук, видео
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
1576 / 809 / 146
Регистрация: 13.06.2015
Сообщений: 3,013
1

Прямой доступ к битмапу

11.08.2016, 03:25. Просмотров 1003. Ответов 11
Метки нет (Все метки)


К сожалению, в моей предыдущей теме какие-то конкретные советы по моей проблеме дать никто не смог, поэтому пришлось брать инициативу в свои руки.
Решил попробовать оптимизировать то, что есть, переписав расчёты на ассемблер и заменив метод Canvas.LineTo на самопальный. Во время работы я замеряю число тактов инструкцией rdtsc, поэтому сразу вижу узкие места. И вот к каким выводам это привело: один только метод ScanLine битмапа выполняется в 6-7 раз медленнее, чем все остальные расчёты точек.
В связи с чем вопрос - как "распрямить" весь битмап в непрерывный линейный массив в ОЗУ и получить на него указатель без использования ScanLine?

Добавлено через 2 часа 3 минуты
По старой доброй традиции разобрался сам.
В самом начале при инициализации битмапа надо получить указатель на первую строку (которая в памяти на самом деле последняя)
Delphi
1
pBmp:=bmp.ScanLine[0];
и ширину байтовой строки (8 бит на пиксел)
Delphi
1
w:=4*((Bmp.Width-1) div 4)+4;
а потом просто вычитать сколько надо строк.
Прирост скорости - феноменальный.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.08.2016, 03:25
Ответы с готовыми решениями:

по битмапу
Друзья, я нуб и опозорился Вопрос такой, Есть пэйнтбокс, в нем рисунок произвольной формы...

Перевод вектора в битмапу
Интересует вопрос, есть ли разница в производительности для исходного рендера, если векторную...

Прямой доступ к памяти
Как прочитать произвольный адрес оперативной памяти? Заранее спасибо!

Прямой доступ к видеопамяти
Здраствуйте уважаемы программеры! У меня к вам огромная просьба не могу написать казалось бы...

11
4831 / 3812 / 1272
Регистрация: 14.04.2014
Сообщений: 17,645
Записей в блоге: 18
11.08.2016, 07:52 2
весь битмап так и лежит в виде непрерывного масива в озу
и Scanline[i] именно так и вычисляет адрес начала очередной строки.
и если задаться конкретным форматом битмапа, то есс-но получаем ускорение на порядок.

посмотрел упомянутую тему. DX и OGL наше все, быстрое рисование в GDI невозможно принципиально

у меня в одном приложении интерактивная карта рисуется, там тысячи объектов. использую фреймворк Asphyre под DirectX.
В FMX рисование тоже сейчас использует аппаратное ускорение
0
586 / 453 / 147
Регистрация: 09.12.2013
Сообщений: 2,386
Записей в блоге: 2
11.08.2016, 13:36 3

Не по теме:

Ещё бывает SetBitmapBits().


Цитата Сообщение от Kukuxumushu Посмотреть сообщение
метод ScanLine битмапа выполняется
А это известно, что он сделан через попу. Поэтому обычно его вызывают не больше одного/двух раз.
Цитата Сообщение от Kukuxumushu Посмотреть сообщение
и ширину байтовой строки (8 бит на пиксел)
Вы имеете ввиду ширину строки массива пикселей в байтах, учитывая выравнивание? Это называют Stride. Он бывает и положительным и отрицательным. Чуток понадёжнее (пишу по памяти):
Delphi
1
2
3
4
5
6
Var Stride: Integer; PixelsPt: Pointer;
... // инициализируем:
PixelsPt:=bmp.ScanLine[0];
Stride:=bmp.ScanLine[1]-PixelsPt;
... // и вызываем когда надо:
Inc(PixelsPt, Stride);

Не по теме:

Можно, можно рисовать быстро в GDI, такие демки видел - закачаетесь.

1
1576 / 809 / 146
Регистрация: 13.06.2015
Сообщений: 3,013
11.08.2016, 15:34  [ТС] 4
Цитата Сообщение от BOGG ART Посмотреть сообщение
Чуток понадёжнее
Я изначально, кстати, так и сделал. Но потом убрал, чтобы 2 раза ScanLine не вызывать, поковырявшись в его внутренностях и установив, что в моём случае это число всегда отрицательное.

Добавлено через 2 минуты
Цитата Сообщение от krapotkin Посмотреть сообщение
DX и OGL наше все, быстрое рисование в GDI невозможно принципиально
Дело в том, что тут нужно специфическое аппаратное ускорение - видеокарту надо научить рассчитывать и отрисовывать графики. Вот как это сделать?
0
BOGG ART
11.08.2016, 16:17
  #5

Не по теме:

Может зависеть от ОС. Как знак так и выравнивание.

0
4831 / 3812 / 1272
Регистрация: 14.04.2014
Сообщений: 17,645
Записей в блоге: 18
11.08.2016, 19:48 6
не надо ей тут пока ничего рассчитывать. не настолько все запушенно, достаточно, чтобы примитивы рисовались раз в 10 быстрее...
это дорогого стоит...)
0
1576 / 809 / 146
Регистрация: 13.06.2015
Сообщений: 3,013
11.08.2016, 20:40  [ТС] 7
Цитата Сообщение от krapotkin Посмотреть сообщение
достаточно, чтобы примитивы рисовались раз в 10 быстрее
Проблема в том, что график - это не примитивы.
Его, конечно, можно довольно неплохо заменить примитивами (и такая попытка была), но их опять-таки надо аппаратно ускорять. Как это сделать - никто не подсказал((
Непосредственный расчёт на GPU с рисованием прямо в видеопамяти был бы идеальным вариантом.
0
4831 / 3812 / 1272
Регистрация: 14.04.2014
Сообщений: 17,645
Записей в блоге: 18
12.08.2016, 06:16 8
график это примитивы
не примитивы - это натягивание шкурок на пространственные треугольники

любой вывод на экран с помощью DX будет в разы быстрее
этого достаточно

по поводу построения гладкой линии здесь код на PHP
он легко переносится в Delphi
а учитывая, что он создан по примерам из вики, думаю, не особо проблема
0
1576 / 809 / 146
Регистрация: 13.06.2015
Сообщений: 3,013
12.08.2016, 08:09  [ТС] 9
Цитата Сообщение от krapotkin Посмотреть сообщение
по поводу построения гладкой линии здесь код на PHP
он легко переносится в Delphi
Вы понимаете, проблема несколько не в этом (не в том, чтобы точки рассчитать).
Проблема в том, что точки считаются, а главное - выводятся на экран, без какого-либо аппаратного ускорения, чисто мощностями ЦПУ. Вот я уже несколько недель и пытаюсь у профессионалов выяснить, как скормить видеокарте решето точек, а лучше прямо саму функцию, чтобы она её самостоятельно рассчитала и построила аппаратно. Все говорят да, это круто, сейчас все современные технологии на этом строятся, но никто почему-то не может не то что нарисовать таким способом хотя бы простейшую синусоиду или параболу, но и даже просто ткнуть носом в живой рабочий пример. А поскольку для меня область аппаратного ускорения совершенно нова, то без этого моё дело не сдвинется в данном направлении.
0
4831 / 3812 / 1272
Регистрация: 14.04.2014
Сообщений: 17,645
Записей в блоге: 18
12.08.2016, 13:47 10
как вообще вы видите
Цитата Сообщение от Kukuxumushu Посмотреть сообщение
скормить саму функцию
?
функция это абстрактное понятие. иногда ее можно выразить формулой, иногда алгоритмом.
вот линию по двум точкам карта и так рассчитывает аппаратно

а для использования CUDA или OpenCL делфи и вовсе ни к чему...
0
2461 / 1273 / 213
Регистрация: 26.02.2009
Сообщений: 5,425
Записей в блоге: 5
17.08.2016, 12:11 11
Цитата Сообщение от Kukuxumushu Посмотреть сообщение
даже просто ткнуть носом в живой рабочий пример
Мой пример не живой?
0
1576 / 809 / 146
Регистрация: 13.06.2015
Сообщений: 3,013
17.08.2016, 16:28  [ТС] 12
Цитата Сообщение от snake32 Посмотреть сообщение
Мой пример не живой?
Да он живой и замечательный, только в моём то деле он совершенно бесполезен. Мне графики надо, а не фракталы.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.08.2016, 16:28

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Прямой доступ к видеопамяти
Требуется написать программу, которая будет напрямую обращаться в видеопамяти. Описание: ...

Прямой доступ к переменным
Доброго времени суток, форумчане. Сразу оговорю, что название темы может не совсем корректно...

Прямой доступ к памяти
Подскажите как сделать чтобы функция ChangeId меняла член структуры, я рассматриваю что после...

Прямой IP-доступ запрещен
Здравствуйте, при подключении к сайту возвращается ответ, в котором сказано: "Direct IP access not...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.