На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
  
> Скорость работы с TBitmap попиксельно , сильно зависит от PixelFormat
    У меня острый приступ рукоблудия: в программе для визуализации данных научного характера решил заняться оптимизацией.

    Вопрос есть по конкретному куску кода: image:TBitmap, двойной цикл по x,y, интенсивность из массива масштабируется на интервал 0-255, и далее
    ExpandedWrap disabled
      image.Canvas.Pixels[x-1,y-1]:=(cc*($FF+1)+cc)*($FF+1)+cc;

    После чего image отрисовывается целиком на канвасе объекта TImage. Вроде все просто.

    Сам двойной цикл + расчет параметров для масштабирования до цикла для картинки 765х510 занимает порядка 683мс. За счет вынесения одной константы из формулы в цикле (по сути закешировал, расчет 1 раз) получил время 662мс. Дальше веселее: в цикле код не меняется.

    После image:=TBitmap.Create; добавил image.PixelFormat:= чего-то там и изучил влияние этого на время.
    not set ~ 672 ms
    pf8bit ~ 750 ms
    pf15bit ~ 235 ms
    pf16bit ~ 220 ms
    pf24bit ~ 203 ms
    pf32bit ~ 219 ms
    Кто может это объяснить? Везде среднее по 4 тестам, данные одни и те же. По умолчанию если не задать, там черт знает что, оно работет быстрее чем если заданное вручную "256 цветов", но тот же код существенно быстрее работает если после создания выставить pf32bit.
      Pixels - медленный способ доступа. Для каждого пиксела проводится куча операций, в том числе по преобразованию формата.
      Например, pf8bit это режим с палитрой - похожий цвет ищется в палитре.


      Раз в сто будет быстрее, если использовать ScanLine или
      http://www.delphimaster.ru/articles/pixels/
        Про кучу операций я согласен, но замена
        image.Canvas.Pixels[x-1,y-1]:=(cc*($FF+1)+cc)*($FF+1)+cc;
        на апишное
        SetPixel(image.Canvas.Handle, X-1, Y-1, (cc*($FF+1)+cc)*($FF+1)+cc);
        из GDI32 не дает почти ничего.

        За ссылку спасибо, установив pf16bit добился снижения задержки отображения картинки 2048х2048 в 3 раза, 2 секунды пока приемлемо, но видимо придется учить ассемблер когда окончательно прижмет...
          Pixels использует SetPixel, он и есть медленный.

          Ассемблер-то зачем учить?
            По ссылке почти весь код на асме.
            Уже не зачем. Благодарю за идею, ScanLine'ом уменьшил время еще в 4 раза (220 -> 46 мс), только точки позеленели. В чем проблема уже знаю, сначала выясню какой для меня все таки оптимальный PixelFormat без палитры, а потом уже буду исправлять глюк. Это время уже приемлемое.
              Сверху статьи ссылка на модуль для 32-битных версий
                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                0 пользователей:


                Рейтинг@Mail.ru
                [ Script execution time: 0,0307 ]   [ 16 queries used ]   [ Generated: 16.04.24, 19:09 GMT ]