Скорость чтения графических форматов

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

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

Re: Скорость чтения графических форматов

Сообщение debi12345 » 05.02.2013 14:54:44

И пока ещё рано говорить, что виновата перекодировка, т.к. это не подтверждено.

Виновата - проверено перекодировкой внешними утиллитами (почти самыми лучшими). Безо всякой отрисовки имеем задержки в пол-секунды на один файл.

Клоузсорный софт одако как-то выкручивается - XNview, или http://www.mediaresizer.com/. Жуть как интересно - как они это делают ?

Добавлено спустя 3 минуты 58 секунд:
Это именно TStream и TFileStream - тормозят загрузку!
Код: Выделить всё
TFileStream.Create(UTF8ToSys('любая картинка2000x2000px.любое расширение'), fmOpenRead or fmShareDenyWrite)


??? Секундные IO-задержки на современных машинах с винтами 150+ MB/sec, большими кэшами и т.п. ?
"Винт" случайно не в PIO-режиме ?

Добавлено спустя 3 минуты 26 секунд:
UTF8ToSys

Это зачем ? Во 1-х не нужно. Во 2-х - UTF8-конверсия весьма ресурсроемка.
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: Скорость чтения графических форматов

Сообщение vitaly_l » 05.02.2013 15:06:44

debi12345 писал(а):"Винт" случайно не в PIO-режиме ?

пардон, это была ошибка(наверно лазарус не пересчитал проект) - на самом деле Tstream грузится моментально.

Добавлено спустя 1 минуту 39 секунд:
debi12345 писал(а):Безо всякой отрисовки имеем задержки в пол-секунды на один файл.

Это правда - это нужно как-то починить... :cry:
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Скорость чтения графических форматов

Сообщение Kemet » 05.02.2013 15:27:00

Действительно, Лазарус здесь медленнее на порядок.
Скорее всего затык происходит даже не при распаковке графических форматов, а при размещении результата в памяти.

Добавлено спустя 33 минуты 38 секунд:
Думаю, имеет смысл исследовать графическую библиотеку Vampyre Imaging Library
Kemet
постоялец
 
Сообщения: 241
Зарегистрирован: 10.02.2010 19:28:32
Откуда: Временно оккупированная территория

Re: Скорость чтения графических форматов

Сообщение vitaly_l » 05.02.2013 17:35:35

Kemet писал(а):Vampyre Imaging Library

Они тоже используют, для загрузки - стандартный TGraphic и TPicture - которые собственно и тормозят >>>на порядок...<<< при загрузке.
:!: :arrow: Неужели нет ни одной самостоятельной независимой библиотеки?
:arrow: :cry: Я самый несчастный в мире Карлсон. Неужели ни у кого нет для меня трёхлитровой баночки вкусного варенья? :cry:
:!: :arrow: Неужели нет ни одной самостоятельной независимой компоненты?

.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Скорость чтения графических форматов

Сообщение debi12345 » 05.02.2013 18:00:04

ИМХО, здесь поможет только использование форматно-зависимых понижающих алгоритмов, и на их выходе грузить уже маленькие битмапы в Timage (а раз маленькие де еще готовые битпамы, то и тормознутость TImage никак не скажется).
Кто скажет, какой из опенсорсных (чтобы глянуть в исходники) вьюеров умеет мгновенно рисовать превьюшки, причем для многих форматов ?
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: Скорость чтения графических форматов

Сообщение Kemet » 05.02.2013 18:43:56

vitaly_l писал(а): :!: :arrow: Неужели нет ни одной самостоятельной независимой библиотеки?
:!: :arrow: Неужели нет ни одной самостоятельной независимой компоненты?

Что значит самостоятельной независимой...
От чего независимой?
Чтобы оперировать графикой разных форматов ее все равно придется считать в битмап (распаковать).
Можно этот процесс несколько оптимизировать, но полностью его исключить не получится. С учетом, что в Дельфи оно вполне нормально работает, в отличии от Лазаруса, то нужно брать напильник.
В принципе, есть же модули
FPReadJpeg, ... Tiff, ...Gif ...
которые и занимаются этим напоямую
Kemet
постоялец
 
Сообщения: 241
Зарегистрирован: 10.02.2010 19:28:32
Откуда: Временно оккупированная территория

Re: Скорость чтения графических форматов

Сообщение debi12345 » 05.02.2013 18:55:50

Можно этот процесс несколько оптимизировать,

Для достижения реал-тайм-филинга - не несколько, а в десятки раз :)
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: Скорость чтения графических форматов

Сообщение vitaly_l » 18.03.2013 13:00:53

Kemet писал(а):Что значит самостоятельной независимой...
От чего независимой?

Независимой от Timage, точнее от TPicture, т.к. загрузкой распоряжается он.
И все подгружаемые модули - тоже используют родителем TPicture, а TPicture при загрузке тормозит.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Скорость чтения графических форматов

Сообщение alexey38 » 18.03.2013 18:25:05

vitaly_l писал(а):Независимой от Timage, точнее от TPicture, т.к. загрузкой распоряжается он.
И все подгружаемые модули - тоже используют родителем TPicture, а TPicture при загрузке тормозит.

Вопрос. Если Вы заранее с помощью отдельной утилиты или графического редактора сделаете картинки строго того размера, как конкретный TImage или TPicture у Вас на форме, то тоже тормозит? Насколько мой старый опыт (10-15 летней давности) говорит, что работа без масштабирования была быстрой еще тогда. Насколько я знаю, очень медленно реализовано масштабирование, а собственно вывод он очень быстрый.
alexey38
долгожитель
 
Сообщения: 1627
Зарегистрирован: 27.04.2011 19:42:31

Re: Скорость чтения графических форматов

Сообщение vitaly_l » 18.03.2013 18:41:13

alexey38 писал(а):собственно вывод он очень быстрый

Нет. Скорость уже проверяли на нескольких машинах см. топик выше.
Мы даже не выводили картинку на экран, а только засекали время загрузки/распаковки в bitmap.
И в итоге сделан вывод что виноват TPicture т.к. является родителем абсолютно для всех графических форматов при загрузке изображений.
И именно TPicture - тормозит инициализацию графических файлов - независимо от формата.

И, ввиду того что - любой (из 12 пересмотренных) компонентов является child для TPicture, то
поэтому тормозят(вдвое по отношению к другим IDE) именно при загрузке - абсолютно все графические компоненты.
Так незаметно, а когда нужно загрузить 100-1000 изображений, это торможение очень весомо...

Я, своими силами, вряд ли смогу исправить или найти ошибку в TPicture(я могу лишь констатировать что она где-то там)...
Вот и жалуюсь... Вдруг кто знает как решить? :cry: :roll:


.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Скорость чтения графических форматов

Сообщение alexey38 » 18.03.2013 19:04:56

vitaly_l писал(а):Нет. Скорость уже проверяли на нескольких машинах см. топик выше.

Я говорю немного о другом. Вы на форму ставите TImage с размером, например, 800 х 800. И делаете картинки в формате BMP тоже строго 800 на 800, ни 801, ни 799, а именно такие размеры, какие в точках указали для TImage. И делаете испытания в данных конкретных условиях, когда размер изображения в файле на 100% совпадает с размером компоненты на форме. Попробуйте такой частный случай на предмет быстродействия. В Дельфи 10-15 лет назад на компе с частотой 200 МГц с видеокартой на 4 Мб у меня это все работало довольно быстро, а просмотр фотографий (JPEG) тогда был медленным, каждая картинка открывалась 2-5 сек. А если была большая, то и все 10 сек.
alexey38
долгожитель
 
Сообщения: 1627
Зарегистрирован: 27.04.2011 19:42:31

Re: Скорость чтения графических форматов

Сообщение haword » 19.03.2013 00:25:27

TPicture не родитель. Родитель TFPImageBitmap. Может я не все прочитал но ты не пробовал загрузить картинку не в TPicture а в TBitmap или TJPegImage и потом уже перенести картинку распакованную на TPicture? Попробуй для тестов открой картинку в TBitmap и засеки время на открытие, потом прорисуй ее на канве формы просто через Form1.Canvas.Draw и засеки время на чем тормоза.
haword
постоялец
 
Сообщения: 301
Зарегистрирован: 02.03.2006 11:34:40

Re: Скорость чтения графических форматов

Сообщение vitaly_l » 19.03.2013 00:42:53

В TBitmap пробовал - результат тот же.
Даже не выводя на Canvas - все графические форматы в Лазарусе тормозят при загрузке в два и более раз.
Проверяется просто. Берётся одна картинка 1000х1000px и перезагружается сто раз (без вывода на Canvas ).
А для сравнения скорости берётся таже картинка и загружается любым известным вьювером и наблюдается что,
даже при условии что, вьювер - отображает картинку, а TBitmap нет - скорость чтения в два и более раз превышает.
И это признали несколько человек. Как так получается?

Там что-то где-то в коде, чтения файлов из Stream.
Голый Stream - грузится быстро.
Дальше я не капал, т.к. это (пока ещё) выше моих знаний.


.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Скорость чтения графических форматов

Сообщение alexey38 » 19.03.2013 05:10:43

vitaly_l писал(а):Берётся одна картинка 1000х1000px

1. Какой формат картинки?
2. Пробовали ли делать BMP без компрессии? Размер файла тогда должен быть равен строго 3 000 054 байта (1000*1000*3 + заголовок).
2. После считывания из файла в TImage, TBitMap и др. какие значения полей width и height Вы имеете?
alexey38
долгожитель
 
Сообщения: 1627
Зарегистрирован: 27.04.2011 19:42:31

Re: Скорость чтения графических форматов

Сообщение SeZuka » 19.03.2013 08:37:43

По умолчанию jpeg грузится по алгоритму оптимизированному на качество, попробуй примерно так:
Код: Выделить всё
uses
  FPReadJPEG;

{ TForm1 }

procedure TForm1.Image1Click(Sender: TObject);
var
  JPEGImage: TJPEGImage;
begin
  if OpenPictureDialog1.Execute
  then begin
    JPEGImage := TJPEGImage.Create;
    try
      JPEGImage.Performance := jpBestSpeed;
      JPEGImage.LoadFromFile(OpenPictureDialog1.FileName);
      Image1.Picture.Graphic := JPEGImage;
    finally
      JPEGImage.Free;
    end;
  end;
end;

Хотя я особой разницы в скорости не заметил.

vitaly_l писал(а):Там что-то где-то в коде, чтения файлов из Stream.
Голый Stream - грузится быстро.
Дальше я не капал, т.к. это (пока ещё) выше моих знаний.

TStream - тот еще тормоз, попробуй в TFileStrem сделать побайтовое чтение файла для парсинга, успеешь выпить кружку кофе.
Плюс к этому после открытия изображение целиком хранится в памяти в битовом формате (bitmap).
Я тестировали на изображении 10240х7680 размером, в jpeg файл весит 8.5Мб, а в bmp ~750Мб, так вот при открытии этого jpegа, объем памяти занимаемой приведенной выше прогой доходил до ~1.5Гб, после открытия, когда картинка уже показалась на форме, уменьшался до ~750Мб, а при повторной попытке открыть этот же файл, уже вылетает Out of memorry :D
Хотя при открытии этого же jpega в стандартном просмотрщике Windows, открывается также долго, при открытии доходит до ~500Мб занимаемой памяти, а потом падает до <30Мб и уже после этого можешь его масштабировать, двигать, размер в памяти практически не меняется.
В общем дело тут все в ООП, универсальности и погоне за совместимостью с Delphi, никаких особых оптимизаций в коде компонентов не делается.
SeZuka
постоялец
 
Сообщения: 209
Зарегистрирован: 05.09.2012 14:58:05

Пред.След.

Вернуться в Lazarus

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

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

Рейтинг@Mail.ru
cron