Как ускорить прорисовку векторной графики ?

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Re: Как ускорить прорисовку векторной графики ?

Сообщение zub » 07.11.2016 00:52:14

Alex2013 Ответ нет и ненадо разводить очередную демагогию
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

Re: Как ускорить прорисовку векторной графики ?

Сообщение Alex2013 » 07.11.2016 02:39:01

Упс ... по ссылке смотрел ? Что это такое ?
Код: Выделить всё
function FastBitmapToBitmap(FastBitmap: TFastBitmap; Bitmap: TBitmap);
var
  X, Y: Integer;
  PixelPtr: PInteger;
  PixelRowPtr: PInteger;
  P: TPixelFormat;
  RawImage: TRawImage;
  BytePerPixel: Integer;
begin
  try
    Bitmap.BeginUpdate(False);
    RawImage := Bitmap.RawImage;
    PixelRowPtr := PInteger(RawImage.Data);
    BytePerPixel := RawImage.Description.BitsPerPixel div 8;
    for Y := 0 to Size.Y - 1 do begin
      PixelPtr := PixelRowPtr;
      for X := 0 to Size.X - 1 do begin
        PixelPtr^ := Pixels[X, Y] * $010101;
        Inc(PByte(PixelPtr), BytePerPixel);
      end;
      Inc(PByte(PixelRowPtr), RawImage.Description.BytesPerLine);
    end;
  finally
    Bitmap.EndUpdate(False);
  end; 
end;

Или я что-то не верно понял ? :roll: Возможно .
Последний раз редактировалось Alex2013 07.11.2016 14:42:30, всего редактировалось 1 раз.
Alex2013
долгожитель
 
Сообщения: 2923
Зарегистрирован: 03.04.2013 11:59:44

Re: Как ускорить прорисовку векторной графики ?

Сообщение zub » 07.11.2016 03:02:02

Упс ... вопрос читал ? понял про что в приведеном куске ?
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

Re: Как ускорить прорисовку векторной графики ?

Сообщение Лекс Айрин » 07.11.2016 09:53:14

Alex2013 писал(а):Но можно заставить нарисовать, что-то на картинке или например форме (причем во втором случае никакой памяти на уровне программы выделятся не будет ) А вот что происходит дальше зависит от механизмов GUI ,GDI и т.д. и т.п .


Прими как данность, что нельзя нарисовать напрямую. Дело в особенностях отрисовки окон.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Как ускорить прорисовку векторной графики ?

Сообщение zub » 07.11.2016 12:42:25

>>Дело в особенностях отрисовки окон
Дело в современных ос и безопасности. Давно уже нет прямого доступа к видеопамяти (как и комногим другим сушьностям), только через интерфейсы GDI-DX-OGL и иже с ними.
Быстрым подобный изврат быть никак не может, т.к. перегон данных CPU->GPU и обратно очень накладен
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

Re: Как ускорить прорисовку векторной графики ?

Сообщение Alex2013 » 07.11.2016 13:11:48

zub писал(а):Упс ... вопрос читал ? понял про что в приведеном куске ?

Сори, действительно вопрос просто забыл "в ночном полете над гнездом кукшки" :oops: ... Начал отвечать верно, а потом увлекся разборкой с RawImage и забыл на что отвечал . :wink: :idea:

Присоединяюсь на канвасе "нельзя нарисовать напрямую"
(Ну как минимум способ не известен но очень похоже, что его действительно НЕТ )
Ещё раз извиняюсь косяк полностью мой , увлекся ....

Зы
В процессе разборок с Fast direct pixel access обнаружил много интересного например методы работы через DMA(Direct Memory Access) .... Интересно насколько быстрее (и быстрее ли вообще) способ передачи данных через ДМА по сравнению с обычным ? Мне бы не помешало быстрое копирование теневого битмапа на видимый (Придется правда от PaintВох отказаться заменив его на TImage или OGL контекст ) Еще появились идеи как можно сделать быстрое определение области прорисовки (границ фигуры ) .
Alex2013
долгожитель
 
Сообщения: 2923
Зарегистрирован: 03.04.2013 11:59:44

Re: Как ускорить прорисовку векторной графики ?

Сообщение Лекс Айрин » 07.11.2016 14:09:38

zub писал(а):Дело в современных ос и безопасности. Давно уже нет прямого доступа к видеопамяти (как и комногим другим сушьностям),

я бы сказал, с win 1.0 нету. И речь не только в безопасности.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Как ускорить прорисовку векторной графики ?

Сообщение Alex2013 » 07.11.2016 14:56:51

Лекс Айрин писал(а):
zub писал(а):Дело в современных ос и безопасности. Давно уже нет прямого доступа к видеопамяти (как и комногим другим сушьностям),

я бы сказал, с win 1.0 нету. И речь не только в безопасности.

Угу... доступ к видеопамяти в современных многооконных интерфейсах просто не нужен ...
Изображение
(ага Вин7 + WinTab для просветления... много ли будет проку от доступа к видеопамяти в этом случае ? )
...а в КДЕ может быть еще круче ... :arrow: https://www.youtube.com/watch?v=TZMT9bd-9YQ

...и держать в ОС свой буфер на каждое окно и каждый элемент управления тоже мало эффективно .
Alex2013
долгожитель
 
Сообщения: 2923
Зарегистрирован: 03.04.2013 11:59:44

Re: Как ускорить прорисовку векторной графики ?

Сообщение Лекс Айрин » 07.11.2016 15:18:14

Alex2013 писал(а):и держать свой буфер на каждое окно и каждый элемент управления тоже мало эффективно .


Зачем, под каждый элемент? Под окно и по буферу на компоненты типа TMemo. TButton, фактически, имеет до трех (реже 4) вариантов оформления (неактивна, курсор в области отрисовки {выделена}, нажата, заблокирована), но буфер ей не особо нужен.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Как ускорить прорисовку векторной графики ?

Сообщение zub » 07.11.2016 15:21:08

>>Мне бы не помешало быстрое копирование теневого битмапа на видимый
Надо иметь все буфера на стороне видеокарты, и ненадо ничего будет копировать

>>Придется правда от PaintВох отказаться заменив его на TImage или OGL контекст
В курсе что интерфейс предоставляемый OGL "чутьчуть" отличается от того что есть у канваса? метафайл уже не прокатит и реализацию опенгл канваса придется делать самому. в часности предстоит секас с шрифтами))

>>...и держать свой буфер на каждое окно и каждый элемент управления тоже мало эффективно .
Рассуждения о том чего незнаешь... как ты себе это представляешь подругому?
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

Re: Как ускорить прорисовку векторной графики ?

Сообщение Alex2013 » 07.11.2016 17:26:46

zub писал(а):>>Мне бы не помешало быстрое копирование теневого битмапа на видимый
Надо иметь все буфера на стороне видеокарты, и ненадо ничего будет копировать

Гм, мудро но сложно ...

zub писал(а):>Придется правда от PaintВох отказаться заменив его на TImage или OGL контекст
В курсе что интерфейс предоставляемый OGL "чутьчуть" отличается от того что есть у канваса? метафайл уже не прокатит и реализацию опенгл канваса придется делать самому. в часности предстоит секас с шрифтами))


В курсе и даже чуть опыта есть
ИзображениеИзображение
Но мне нужно всего навсего скопировать уже готовый битмап на OGL контекст ...
(просто явно видно падение скорости при увеличении окна вне зависимости от количества элементов )

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

Я сказал именно "держать" а не создавать по мере надобности ...
Но кроме того возможна прямая прорисовка в том числе и с использованием "железячного" 2D ускорения .
То есть идет из водимого окна команда нарисовать прямоугольник, в драйвер предаются его размеры и цвет, а дальше драйвер или вызывает аппаратную функцию или рисует фигуру сам прямо в видеопамяти .
И буфера нет в принципе.
Последний раз редактировалось Alex2013 07.11.2016 17:47:50, всего редактировалось 1 раз.
Alex2013
долгожитель
 
Сообщения: 2923
Зарегистрирован: 03.04.2013 11:59:44

Re: Как ускорить прорисовку векторной графики ?

Сообщение Лекс Айрин » 07.11.2016 17:47:41

Alex2013 писал(а):Но мне нужно всего навсего скопировать уже готовый битмап на OGL контекст ...


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

Добавлено спустя 6 минут 8 секунд:
Alex2013 писал(а):То есть идет из водимого окна команда нарисовать прямоугольник в драйвер предаются его размеры и цвет а дальше драйвер или вызывает аппаратную функцию или рисует фигуру сам прямо в видеопамяти .


такое может быть только при "захвате" окна, когда программа гарантирует, что она сама все рисует. И, кстати, нет никакой уверенности, что речь идет о видеопамяти как таковой, а не о буфере. Т. е. скорее всего рисование идет на виртуальный "монитор".
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Как ускорить прорисовку векторной графики ?

Сообщение Alex2013 » 07.11.2016 17:55:17

Лекс Айрин писал(а):
Alex2013 писал(а):Но мне нужно всего навсего скопировать уже готовый битмап на OGL контекст ...


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


Ты не понял, у меня-то в программе теневой буфер есть ... (просто для того чтобы не было видно последовательной перерисовки элементов, которое создает ощущение недоделки ) и вот этот буфер (то бишь "картинку а не текст") я и думаю попробовать копировать на OGL контекст. :idea: Я вычитал, что якобы OGL юзает ДМА мимо процессора, а это значит, что есть шанс, что выйдет быстрее.
Последний раз редактировалось Alex2013 07.11.2016 18:12:28, всего редактировалось 2 раз(а).
Alex2013
долгожитель
 
Сообщения: 2923
Зарегистрирован: 03.04.2013 11:59:44

Re: Как ускорить прорисовку векторной графики ?

Сообщение zub » 07.11.2016 18:01:30

Что есть теневой буфер? Наверно есть какоето более привычное название этого дела?
>>Но мне нужно всего навсего скопировать уже готовый битмап на OGL контекст ...
Зачем это? вывести какуюто картинку?
А если ты все рисуешь в какойто теневой буфер то нафиг вообще OGL контекст

Добавлено спустя 3 минуты 50 секунд:
>>Я вычитал, что якобы OGL юзает ДМА мимо процессора а это значит что есть шанс что выйдет быстрее
Блин, пожалуй я умою руки из этой темки - это уже слишком для меня
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

Re: Как ускорить прорисовку векторной графики ?

Сообщение Alex2013 » 07.11.2016 18:10:02

zub писал(а):Что есть теневой буфер? Наверно есть какоето более привычное название этого дела?
>>Но мне нужно всего навсего скопировать уже готовый битмап на OGL контекст ...
Зачем это? вывести какуюто картинку?
А если ты все рисуешь в какойто теневой буфер то нафиг вообще OGL контекст

Добавлено спустя 3 минуты 50 секунд:
>>Я вычитал, что якобы OGL юзает ДМА мимо процессора а это значит что есть шанс что выйдет быстрее
Блин, пожалуй

Вот !
Короче для ясности нужно заменить вот эту строчку...
// Копирую буфер на экран
PaintBox1.Canvas.CopyRect( R , BufBMP.Canvas, R );

...и посмотреть , что работает быстрее ... :idea:
Alex2013
долгожитель
 
Сообщения: 2923
Зарегистрирован: 03.04.2013 11:59:44

Пред.След.

Вернуться в Lazarus

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 39

Рейтинг@Mail.ru