Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2002.08.26;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2002.08.26;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.006 c
1-85002
sammy
2002-08-16 09:33
2002.08.26
---|Ветка была без названия|---


7-85268
Tahion
2002-06-03 20:20
2002.08.26
Как перестроить кэш иконок в Виндовс?


1-84965
-=Spike=-
2002-08-15 15:27
2002.08.26
Как заставить TOpenDialog запоминать последний рабочий каталог?


1-85069
TTCustomDelphiMaster
2002-08-13 21:37
2002.08.26
DesctopPreview


14-85172
arbiter
2002-07-26 18:24
2002.08.26
Приплыли





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский