-
создаю 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, почему так ведь качество хуже?
Спасибо!
-
pf32bit - это одно двойное слово(4 байта) на пиксель, процессору удобнее адресовать такие данные. И скорее всего совпадает с экранным разрешением. А прочие форматы заставляют перепаковывать информацию.
-
> fps падает раза в 2, почему так ведь качество хуже?
думаю, перепаковка как раз и тормозит... тк качество просто так же не ухудшается)
-
тут еще проблема появилась в связи с этим перешел дописывать программу на другой комп, запускаю так: 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 кадров, как с этим боротся?
-
pfDevice - наиболее удобный для видеокарты формат, на NT-линейке это обычно означает создание битмапа в видеопамяти и вывод с аппаратным ускорением. Только вот это ускорение в исполнении GDI зачастую работает криво ("нажатия кнопок обрабатываются с задержкой сек в 5" и т.п.). И доступ к пикселям такого битмапа работает очень медленно (на Королевстве Дельфи, кстати, есть статья о форматах битмапов).
В общем, наверное, лучше ставить pf32bit. Обычно оно быстрее 24, т.к. совпадает с форматом экранной поверхности, меньше конвертировать надо.
И зачем супер-скорости в 670 FPS, неужели 100 недостаточно? Если таки недостаточно, имеет смысл подумать о DirectX, там эти же 670 будут без побочных эффектов.
-
> [0] Andrey_ka (10.11.08 12:33)
причина в том, что при прорисовке изображения, функция BitBlt (и её производные) конвертируют формат пикселей источника в формат приемника (в данном случае приемник - HDC экрана). Соответственно, чтобы получить максимальную производительность, нужно работать в том же формате пикселей, что и у экрана, чтобы избежать этого конвертирования.
|