Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.08.26;
Скачать: CL | DM;

Вниз

Как избавиться от мерцания?   Найти похожие ветки 

 
Dmk   (2002-06-19 01:48) [0]

Как избавиться от мерцания изображения если я использую BitBlt?
Прорисовка осуществляется на DC формы. Может ссылочка есть?
Было неплохо посмотреть на исходники BitBlt :)


 
SPeller   (2002-06-19 03:15) [1]

Не должно оно мерцать. Лучше код свой приведи, как делаешь, может там косяк а не в BitBlt??


 
Dmk   (2002-06-20 01:25) [2]

Это код:
procedure TViewport.vpDraw(x,y: Integer);
var NewFormX:Integer;
NewWidth:Integer;
NewRegionX:Integer;
NewDrawRegionX:Integer;
ShiftX:Integer;

begin
{If ((x = Regions.PrevX) and (y = Regions.PrevY)) then exit;}
InfoForm.caption := IntToStr(x);
If ((x = 0) and (y = 0)) then
begin
Regions.horzRegion.Left := 0;
Regions.horzRegion.Top := 0;
Regions.horzRegion.Width := vpWidth;
Regions.horzRegion.Height := vpHeight;
ConvertToRGB_Region(_pInfo,Regions.horzRegion,DBuffer);
BitBlt(_pInfo.fgDrawDC,30,30,vpWidth,vpHeight,DBuffer.dbMemDC,0,0,SRCCOPY);
exit;
end;

if not RemovingPlane then
begin
Regions.curX := x;
Regions.curY := y;
//...
If Regions.curX >= Regions.PrevX then
begin
Regions.OffsetX := Regions.curX - Regions.PrevX;
NewWidth := Integer(vpWidth) - Regions.OffsetX;
NewFormX := 0;
NewRegionX := NewWidth + Regions.curX;
NewDrawRegionX := NewWidth;
ShiftX := Regions.OffsetX;
end
else
begin
Regions.OffsetX := Regions.PrevX - Regions.curX;
NewWidth := Integer(vpWidth) - Regions.OffsetX;
NewFormX := Regions.OffsetX;
NewRegionX := Regions.curX;
NewDrawRegionX := 0;
ShiftX := 0;
end;


If Regions.OffsetX <> 0 then
begin
Regions.horzRegion.Left := NewRegionX + ShiftX;
Regions.horzRegion.Top := 0;
Regions.horzRegion.Width := Regions.OffsetX;
Regions.horzRegion.Height := Regions.drawHeight;
ConvertToRGB_Region(_pInfo,Regions.horzRegion,DBuffer);
end;


//
Regions.curDestY := Regions.curY - Regions.OffsetY;



//..................................
BitBlt(_pInfo.fgDrawDC,
30 + NewFormX,
30,
NewWidth,
Regions.drawHeight,
_pInfo.fgDrawDC,
30 + ShiftX,
30,
SRCCOPY);
//..................................


If Regions.OffsetX <> 0 then
BitBlt(_pInfo.fgDrawDC,
30 + NewDrawRegionX,
30,
Regions.OffsetX,
Regions.drawHeight,
DBuffer.dbMemDC,
0,
0,
SRCCOPY);

//..................................
Regions.PrevX := Regions.curX;
Regions.PrevY := Regions.curY;
Regions.OffsetX := 0;
Regions.OffsetY := 0;
end;
end;
//..............................................................

Под NT мерцания нет, а под 98, по Y примерно 50-60 pixels от загаловка окна начинает дергаться полоса. Дрожание полосы примерно 2-3 пикселя. От мощности компа и видюхи не зависит. На P4 с 3 форсом та же история. Мож 98 это большой лаг? :)
Хотя есть подозрение, что это происходит из-за начала прорисовки в клиентской области не с y = 0, а с 30 пикселов от заголовка. Но в Shope такого же нет?! :)


 
Dmk   (2002-06-20 01:33) [3]

Могу выслать по почте EXE с Tif"ами сам убедишься. размер 3,37 MB


 
Dmk   (2002-06-20 01:36) [4]

Либо один EXE без Tif"ов(515 Kb), но тифы к нему нужны либо PackBits либо CMYK без альфа каналов.


 
int64   (2002-06-20 05:46) [5]

Если _pInfo.fgDrawDC - DC формы, то замени это на DC канвы формы.


 
Dmk   (2002-06-21 03:31) [6]

Заменил. Только куда все это рисуется?
На форме ничего не появляется. А при копировании содержимого DC canvas на DC формы копируется сама форма. А где же содержимое canvas? функция BitBlt рапортует об успешном копировании N строк.
_pInfo.fgDrawDC для формы я узнавал так: _pInfo.fgDrawDC := GetDC(xForm.Handle);, а для Canvas формы _pInfo.fgDrawDC := xForm.Canvas.Handle;
Хоть хэндлы и разные по значению, DC для них один. :(


 
int64   (2002-06-21 06:48) [7]

Совет был немного не в тему; хрен въедешь, что ты там делаешь.

Вообще избався от хранения дескрипторов - это вредно. А доступ к ним получай только динамически: xForm.Canvas.Handle.
И никаких GetDC(xForm.Handle), в данном случае по-барабану, но кто знает что у тебя там ещё за манипуляции.
А если уж очень приспичило GetDC, так сначала получи, используй, и "очисть". И так каждый раз, когда он нужен, потомучто подобные действия параллельно вызываются во внутренностях формы (TControl.Repaint, например). И после всего этого ещё могут оставаться глюки GDI под 9х.

И что за необходимость такая: строить программу из VCL, а рисовать на WinAPI! Ты думаешь, очень выиграешь в производительности, если заменишь Canvas.CopyRect (он же StretchBlt) на BitBlt?



 
valery_f   (2002-06-21 15:53) [8]

int64: "Ты думаешь, очень выиграешь в производительности, если заменишь Canvas.CopyRect (он же StretchBlt) на BitBlt?"

BitBlt работает быстрее, т.к. StretchBlt, кроме копирования, преобразовывает размер, а Canvas.CopyRect дополняет это еще и своими операциями.

2 Dmk> Мерцания бывают двух типов:

1) Обычно перед собственно рисованием (WM_PAINT) происходит очистка фона (WM_ERASEBACKGROUND), что создает жуткое мелькание, особенно при частой перерисовке. Если ты берешься рисовать ВСЕ содержимое клиентской части окна, то его можно просто заблокировать.

2) Если рисование идет на "видимый" DC и не за один раз, то рисуемое будет появляться по частям (после каждой операции - перерисовка на экране).

Что касается NT, то он, как я понял, буферизует экранную отрисовку, поэтому под ним мелькание может и отсутствовать. Так что это не глюк win9x - просто они по разному работают.


 
int64   (2002-06-21 17:29) [9]

BitBlt работает быстрее, т.к. StretchBlt, кроме......

А задавался ли ты вопросом, насколько быстрее BitBlt, чем Canvas.CopyRect для нерастянутых изображений?
Сначала опредили, а потом с этими тестами сюда. И раскажи нам - стоит ли из-за этих микросекунд иметь геморои с дескрипторами под 9х, или делать как предлагает Borland (хотя, избавиться от глюков можно, проштудировав генотип и скопировав нужное в свой проект; вот, маразм!).
Да, постарайся обойтись на этот раз без азбучных истин: кто-что преобразовывает, и кто-что дополняет.


 
valery_f   (2002-06-21 17:52) [10]

int64> А задавался ли ты вопросом, насколько быстрее BitBlt, чем Canvas.CopyRect для нерастянутых изображений?

Задавался и проверял. Таки быстрее :)

int64> И раскажи нам - стоит ли из-за этих микросекунд иметь геморои с дескрипторами под 9х, или делать как предлагает Borland

Если есть необходимость - стОит. В некоторых случаях ровность и скорость отрисовки для меня была ОЧЕНЬ критична.

int64> Да, постарайся обойтись на этот раз без азбучных истин...

Извини, просто я пытаюсь обосновывать свои слова. Давай ты постаешься уважать чужое мнение...


 
int64   (2002-06-21 18:22) [11]

valery_f (21.06.02 17:52)

Ну так, а какая скорость в процентах?
Или хотя бы в секундах (с описанием железа и алгоритма).

С уважением...


 
Dmk   (2002-06-22 00:54) [12]

Ребят! Я уже избавился от "мерцания". Спасибо вам за помощь! Иначе не весь desktop моргал, а просто BitBlt не успевала за один fps перерисовать изображение. Но почему на мощных компах тоже самое? у меня pIII550(512Кб)& Voodoo 3-3000.
Вообще задача: прорисовать изображение в нелинейном цветовом пространстве как можно быстрее. Я сделал для CMYK"a и для LAB"а.
Но поскольку преобразования CMYK в RGB делаются через LAB, а вычисления требуют очень много времени, то мне пришлось "изобрести" Photoshop. Прорисовка регионами самое оно.
Получилось просто супер. Я очень рад.:) Да и каналы в реальном времени теперь удается отключать. 8D
А BitBlt все-таки быстрее чем остальные. Быстрее только SetDIBitsToDevice. Да и то, только потому, что не синхронизируется с вертикальной разверткой. ИЛИ DirectX. буду его пробовать.
А ссориться по пустякам не стоит. У каждого методы написания свои. Главное результат.

Кстати регион с шириной 1220 и высотой 898 пикселов с помощью BitBlt успевает на моей машине прорисоваться около 79-80 раз в секунду.
Удачи Вам! :)



Страницы: 1 вся ветка

Текущий архив: 2002.08.26;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.02 c
3-84929
Иван
2002-08-06 08:36
2002.08.26
Пароли пользователей


3-84898
ZG
2002-08-06 14:19
2002.08.26
SQL и у меня не получается в Дельфи создать таблицу


14-85192
Jee
2002-07-30 15:32
2002.08.26
Оцените прикол.


1-84991
zavdim
2002-08-15 07:34
2002.08.26
Код возврата.


7-85261
as2002
2002-05-26 01:03
2002.08.26
надо спрятать папки