Конференция "Media" » как работает PixelFormat [D7, WinXP]
 
  • Andrey_ka (10.11.08 12:33) [0]
    создаю 2 битмапа А и С, в А загружаю картинку из файла размер 3000х2000pix
    размер С устанавливаю в размер экрана (форма полноэкранная)
    затем устанавливаю параметры пиксела:
    a.PixelFormat:= pfDevice;
    c.PixelFormat:=pfDevice;

    создаю мультитаймер с параметрами
    timeSetEvent(1,500,@timeproc,0,TIME_PERIODIC);
    в процедуре обработчике посылаю сообщение обновить окно
    InvalidateRect(handle,nil,false);

    рисую
    BeginPaint(handle,p);
    BitBlt(c.Canvas.Handle,0,0,clientwidth,clientHeight,a.Canvas.Handle,px,py,SRCCOP Y);
    ..........................
    BitBlt(Canvas.Handle,0,0,clientwidth,clientHeight,c.Canvas.Handle,0,0,SRCCOPY);
    EndPaint(handle,p);

    Вопрос вот в чем:
    при параметрах пиксела
    a.PixelFormat:= pfDevice;
    c.PixelFormat:=pfDevice;
    выдает 250 кадров в сек
    тоже при pf32bit,
    а вот при  pf24bit или даже pf16dit
    fps падает раза в 2, почему так ведь качество хуже?

    Спасибо!
  • icWasya © (10.11.08 13:33) [1]
    pf32bit - это одно двойное слово(4 байта) на пиксель, процессору удобнее адресовать такие данные. И скорее всего совпадает с экранным разрешением.
    А прочие форматы заставляют перепаковывать информацию.
  • brother © (10.11.08 13:38) [2]
    > fps падает раза в 2, почему так ведь качество хуже?

    думаю, перепаковка как раз и тормозит... тк качество просто так же не ухудшается)
  • Andrey_ka (10.11.08 14:11) [3]
    тут еще проблема появилась в связи с этим перешел дописывать программу на другой комп, запускаю так:
    a.PixelFormat:= pfDevice;
    c.PixelFormat:=pfDevice;
    670 кадров выдает, правда сообщения о нажатиях кнопок обрабатываются с задержкой сек в 5
    а если поставить
    a.PixelFormat:=pf32bit;
    c.PixelFormat:=pf32bit;
    выдает 100 кадров
    а при  
    a.PixelFormat:=pf32bit;
    //c.PixelFormat:=pf32bit;
    выдает 290
    и это при розрешении 1152х864.....
    если же поставить 1024х768 то при любых изменениях 65 кадров, как  с этим боротся?
  • Sapersky (10.11.08 15:17) [4]
    pfDevice - наиболее удобный для видеокарты формат, на NT-линейке это обычно означает создание битмапа в видеопамяти и вывод с аппаратным ускорением. Только вот это ускорение в исполнении GDI зачастую работает криво ("нажатия кнопок обрабатываются с задержкой сек в 5" и т.п.). И доступ к пикселям такого битмапа работает очень медленно (на Королевстве Дельфи, кстати, есть статья о форматах битмапов).

    В общем, наверное, лучше ставить pf32bit. Обычно оно быстрее 24, т.к. совпадает с форматом экранной поверхности, меньше конвертировать надо.

    И зачем супер-скорости в 670 FPS, неужели 100 недостаточно?
    Если таки недостаточно, имеет смысл подумать о DirectX, там эти же 670 будут без побочных эффектов.
  • Eraser © (11.11.08 01:26) [5]
    > [0] Andrey_ka   (10.11.08 12:33)

    причина в том, что при прорисовке изображения, функция BitBlt (и её производные) конвертируют формат пикселей источника в формат приемника (в данном случае приемник - HDC экрана). Соответственно, чтобы получить максимальную производительность, нужно работать в том же формате пикселей, что и у экрана, чтобы избежать этого конвертирования.
 
Конференция "Media" » как работает PixelFormat [D7, WinXP]
Есть новые Нет новых   [134431   +10][b:0][p:0]