Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

как работает 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 байта) на пиксель, процессору удобнее адресовать такие данные. И скорее всего совпадает с экранным разрешением.
А прочие форматы заставляют перепаковывать информацию.


Наверх

Титульная страница Поиск, карта сайта Написать письмо