Как ускорить прорисовку векторной графики ?
Модератор: Модераторы
Alex2013 Ответ нет и ненадо разводить очередную демагогию
Упс ... по ссылке смотрел ? Что это такое ?
Или я что-то не верно понял ?
Возможно .
Код: Выделить всё
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;Или я что-то не верно понял ?
Последний раз редактировалось Alex2013 07.11.2016 13:42:30, всего редактировалось 1 раз.
Упс ... вопрос читал ? понял про что в приведеном куске ?
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
Alex2013 писал(а):Но можно заставить нарисовать, что-то на картинке или например форме (причем во втором случае никакой памяти на уровне программы выделятся не будет ) А вот что происходит дальше зависит от механизмов GUI ,GDI и т.д. и т.п .
Прими как данность, что нельзя нарисовать напрямую. Дело в особенностях отрисовки окон.
>>Дело в особенностях отрисовки окон
Дело в современных ос и безопасности. Давно уже нет прямого доступа к видеопамяти (как и комногим другим сушьностям), только через интерфейсы GDI-DX-OGL и иже с ними.
Быстрым подобный изврат быть никак не может, т.к. перегон данных CPU->GPU и обратно очень накладен
Дело в современных ос и безопасности. Давно уже нет прямого доступа к видеопамяти (как и комногим другим сушьностям), только через интерфейсы GDI-DX-OGL и иже с ними.
Быстрым подобный изврат быть никак не может, т.к. перегон данных CPU->GPU и обратно очень накладен
zub писал(а):Упс ... вопрос читал ? понял про что в приведеном куске ?
Сори, действительно вопрос просто забыл "в ночном полете над гнездом кукшки"
Присоединяюсь на канвасе "нельзя нарисовать напрямую"
(Ну как минимум способ не известен но очень похоже, что его действительно НЕТ )
Ещё раз извиняюсь косяк полностью мой , увлекся ....
Зы
В процессе разборок с Fast direct pixel access обнаружил много интересного например методы работы через DMA(Direct Memory Access) .... Интересно насколько быстрее (и быстрее ли вообще) способ передачи данных через ДМА по сравнению с обычным ? Мне бы не помешало быстрое копирование теневого битмапа на видимый (Придется правда от PaintВох отказаться заменив его на TImage или OGL контекст ) Еще появились идеи как можно сделать быстрое определение области прорисовки (границ фигуры ) .
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
zub писал(а):Дело в современных ос и безопасности. Давно уже нет прямого доступа к видеопамяти (как и комногим другим сушьностям),
я бы сказал, с win 1.0 нету. И речь не только в безопасности.
Лекс Айрин писал(а):zub писал(а):Дело в современных ос и безопасности. Давно уже нет прямого доступа к видеопамяти (как и комногим другим сушьностям),
я бы сказал, с win 1.0 нету. И речь не только в безопасности.
Угу... доступ к видеопамяти в современных многооконных интерфейсах просто не нужен ...

(ага Вин7 + WinTab для просветления... много ли будет проку от доступа к видеопамяти в этом случае ? )
...а в КДЕ может быть еще круче ...
...и держать в ОС свой буфер на каждое окно и каждый элемент управления тоже мало эффективно .
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
Alex2013 писал(а):и держать свой буфер на каждое окно и каждый элемент управления тоже мало эффективно .
Зачем, под каждый элемент? Под окно и по буферу на компоненты типа TMemo. TButton, фактически, имеет до трех (реже 4) вариантов оформления (неактивна, курсор в области отрисовки {выделена}, нажата, заблокирована), но буфер ей не особо нужен.
>>Мне бы не помешало быстрое копирование теневого битмапа на видимый
Надо иметь все буфера на стороне видеокарты, и ненадо ничего будет копировать
>>Придется правда от PaintВох отказаться заменив его на TImage или OGL контекст
В курсе что интерфейс предоставляемый OGL "чутьчуть" отличается от того что есть у канваса? метафайл уже не прокатит и реализацию опенгл канваса придется делать самому. в часности предстоит секас с шрифтами))
>>...и держать свой буфер на каждое окно и каждый элемент управления тоже мало эффективно .
Рассуждения о том чего незнаешь... как ты себе это представляешь подругому?
Надо иметь все буфера на стороне видеокарты, и ненадо ничего будет копировать
>>Придется правда от PaintВох отказаться заменив его на TImage или OGL контекст
В курсе что интерфейс предоставляемый OGL "чутьчуть" отличается от того что есть у канваса? метафайл уже не прокатит и реализацию опенгл канваса придется делать самому. в часности предстоит секас с шрифтами))
>>...и держать свой буфер на каждое окно и каждый элемент управления тоже мало эффективно .
Рассуждения о том чего незнаешь... как ты себе это представляешь подругому?
zub писал(а):>>Мне бы не помешало быстрое копирование теневого битмапа на видимый
Надо иметь все буфера на стороне видеокарты, и ненадо ничего будет копировать
Гм, мудро но сложно ...
zub писал(а):>Придется правда от PaintВох отказаться заменив его на TImage или OGL контекст
В курсе что интерфейс предоставляемый OGL "чутьчуть" отличается от того что есть у канваса? метафайл уже не прокатит и реализацию опенгл канваса придется делать самому. в часности предстоит секас с шрифтами))
В курсе и даже чуть опыта есть


Но мне нужно всего навсего скопировать уже готовый битмап на OGL контекст ...
(просто явно видно падение скорости при увеличении окна вне зависимости от количества элементов )
>>...и держать свой буфер на каждое окно и каждый элемент управления тоже мало эффективно .
Рассуждения о том чего незнаешь... как ты себе это представляешь подругому?
Я сказал именно "держать" а не создавать по мере надобности ...
Но кроме того возможна прямая прорисовка в том числе и с использованием "железячного" 2D ускорения .
То есть идет из водимого окна команда нарисовать прямоугольник, в драйвер предаются его размеры и цвет, а дальше драйвер или вызывает аппаратную функцию или рисует фигуру сам прямо в видеопамяти .
И буфера нет в принципе.
Последний раз редактировалось Alex2013 07.11.2016 16:47:50, всего редактировалось 1 раз.
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
Alex2013 писал(а):Но мне нужно всего навсего скопировать уже готовый битмап на OGL контекст ...
Это все равно что перепечатать текст с картинки... он же уже готов. Не стоит забывать, что если его нет в видеопамяти, то толку от этого мало -- основной тормоз будет в перекачке данных из основной памяти.
Добавлено спустя 6 минут 8 секунд:
Alex2013 писал(а):То есть идет из водимого окна команда нарисовать прямоугольник в драйвер предаются его размеры и цвет а дальше драйвер или вызывает аппаратную функцию или рисует фигуру сам прямо в видеопамяти .
такое может быть только при "захвате" окна, когда программа гарантирует, что она сама все рисует. И, кстати, нет никакой уверенности, что речь идет о видеопамяти как таковой, а не о буфере. Т. е. скорее всего рисование идет на виртуальный "монитор".
Лекс Айрин писал(а):Alex2013 писал(а):Но мне нужно всего навсего скопировать уже готовый битмап на OGL контекст ...
Это все равно что перепечатать текст с картинки... он же уже готов. Не стоит забывать, что если его нет в видеопамяти, то толку от этого мало -- основной тормоз будет в перекачке данных из основной памяти.
Ты не понял, у меня-то в программе теневой буфер есть ... (просто для того чтобы не было видно последовательной перерисовки элементов, которое создает ощущение недоделки ) и вот этот буфер (то бишь "картинку а не текст") я и думаю попробовать копировать на OGL контекст.
Последний раз редактировалось Alex2013 07.11.2016 17:12:28, всего редактировалось 2 раза.
Что есть теневой буфер? Наверно есть какоето более привычное название этого дела?
>>Но мне нужно всего навсего скопировать уже готовый битмап на OGL контекст ...
Зачем это? вывести какуюто картинку?
А если ты все рисуешь в какойто теневой буфер то нафиг вообще OGL контекст
Добавлено спустя 3 минуты 50 секунд:
>>Я вычитал, что якобы OGL юзает ДМА мимо процессора а это значит что есть шанс что выйдет быстрее
Блин, пожалуй я умою руки из этой темки - это уже слишком для меня
>>Но мне нужно всего навсего скопировать уже готовый битмап на OGL контекст ...
Зачем это? вывести какуюто картинку?
А если ты все рисуешь в какойто теневой буфер то нафиг вообще OGL контекст
Добавлено спустя 3 минуты 50 секунд:
>>Я вычитал, что якобы OGL юзает ДМА мимо процессора а это значит что есть шанс что выйдет быстрее
Блин, пожалуй я умою руки из этой темки - это уже слишком для меня
zub писал(а):Что есть теневой буфер? Наверно есть какоето более привычное название этого дела?
>>Но мне нужно всего навсего скопировать уже готовый битмап на OGL контекст ...
Зачем это? вывести какуюто картинку?
А если ты все рисуешь в какойто теневой буфер то нафиг вообще OGL контекст
Добавлено спустя 3 минуты 50 секунд:
>>Я вычитал, что якобы OGL юзает ДМА мимо процессора а это значит что есть шанс что выйдет быстрее
Блин, пожалуй
Вот !
Короче для ясности нужно заменить вот эту строчку...
// Копирую буфер на экран
PaintBox1.Canvas.CopyRect( R , BufBMP.Canvas, R );
...и посмотреть , что работает быстрее ...
