![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
как работает PixelFormat [D7, WinXP]
Andrey_ka © (2008-11-10 12:33:00)создаю 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, почему так ведь качество хуже?
Спасибо!
Eraser (2008-11-11 01:26:00) [1]> [0] Andrey_ka (10.11.08 12:33)
причина в том, что при прорисовке изображения, функция BitBlt (и её производные) конвертируют формат пикселей источника в формат приемника (в данном случае приемник - HDC экрана). Соответственно, чтобы получить максимальную производительность, нужно работать в том же формате пикселей, что и у экрана, чтобы избежать этого конвертирования.
Sapersky (2008-11-10 15:17:00) [2]pfDevice - наиболее удобный для видеокарты формат, на NT-линейке это обычно означает создание битмапа в видеопамяти и вывод с аппаратным ускорением. Только вот это ускорение в исполнении GDI зачастую работает криво ("нажатия кнопок обрабатываются с задержкой сек в 5" и т.п.). И доступ к пикселям такого битмапа работает очень медленно (на Королевстве Дельфи, кстати, есть статья о форматах битмапов).
В общем, наверное, лучше ставить pf32bit. Обычно оно быстрее 24, т.к. совпадает с форматом экранной поверхности, меньше конвертировать надо.
И зачем супер-скорости в 670 FPS, неужели 100 недостаточно?
Если таки недостаточно, имеет смысл подумать о DirectX, там эти же 670 будут без побочных эффектов.
Andrey_ka (2008-11-10 14:11:00) [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 кадров, как с этим боротся?
brother (2008-11-10 13:38:00) [4]> fps падает раза в 2, почему так ведь качество хуже?
думаю, перепаковка как раз и тормозит... тк качество просто так же не ухудшается)
icWasya (2008-11-10 13:33:00) [5]pf32bit - это одно двойное слово(4 байта) на пиксель, процессору удобнее адресовать такие данные. И скорее всего совпадает с экранным разрешением.
А прочие форматы заставляют перепаковывать информацию.