Форум: "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