-
Использую тупо циклы for + draw в buffer. paint перерисовывает буфер только при изменении размеров control. В моём случае что-то дофига умножений выходит, как можно ускорить ? Не горит, но интересно.
-
а зачем умножать ? tiling, насколько я понимаю, это заполнение шаблоном ?
-
> tiling, насколько я понимаю, это заполнение шаблоном ?
ага заполнение изображения нужным количеством копий по размеру отображения, нужно перерисовка в runtime и быстрая.
ЗЫ: наследник TCustom Panel все работает быстро кроме этого тайлинга при изменении размера формы.
-
tesseract © (28.03.08 20:25) [2]
DoubleBuffered ?
А вообще код давай (с)
-
а не надо draw, попробуй canvas.copyrect()/bltbtn
-
> canvas.copyrect()
Copyrect медленне Draw кстати. Он Resize делает.
> DoubleBuffered ?
Tripple выходит :-)
Там просто через For идёт заполнение backbuffer - сам буффер меняеться только при изменении размера или параметров картинки.
-
> Copyrect медленне Draw кстати
а попробывать? :) он почти такой же по скорости, как и BitBlt, я на нем игры пишу :) а вот draw, не знаю, что там проиходит внутрях, но тормозит немеряно...
-
кстати, блитятся картинки одной pixelformat?
-
> вот draw, не знаю, что там проиходит внутрях, но тормозит > немеряно...
У меня другие результаты. Возможно потому, что не игры. Внутрях он может вызывать преобразование Tgraphic в HBitmap, но как правило так не делает.
-
> кстати, блитятся картинки одной pixelformat?
Задача размножить картинку на весь Canvas, с вычислением обрезки по краям.
-
покажи код, плиз
-
Он в разработке. Говорю пока выходит сильно фиговый.
ttSimpleTile: begin
WidthDiff := (ClRect.Right -ClRect.Left-xCount*FullImageWidth);
HeightDiff:= (ClRect.Bottom -ClRect.Top- yCount*FullImageHeight);
tX:=ClRect.Right-WidthDiff;
tY:=ClRect.Left-HeightDiff;
for cX:= 0 to xCount-1 do
begin
for cY := 0 to yCount - 1 do
begin
TileRec:=Rect(cX*FullImageWidth+fTileBorderWidth+ClRect.Left,cY*FullImageHeight+fTileBorderWidth+clRect.Top,0,0);
fBackBuffer.Canvas.Draw(TileRec.left,TileRec.top,FPicture.Bitmap);
TileRec:=Rect(tx,cY*FullImageHeight+fTileBorderWidth+ClRect.Top,ClRect.Right,cY*FullImageHeight+fTileBorderWidth+ClRect.Top+HeightDiff);
fBackBuffer.Canvas.Draw(TileRec.Left,TileRec.Top,FPicture.Bitmap);
end;
end;
end;
-
> [9] tesseract © (28.03.08 20:42) > > кстати, блитятся картинки одной pixelformat? > Задача размножить картинку на весь Canvas, с вычислением > обрезки по краям.
Ответ не соответствует вопросу.
-
так, щас будет много корявого кода :) procedure FillTexturka2canvas( Acanvas:Tcanvas; _Texturka:Tbitmap; _R:Trect; _x,_y:integer);
var i,ii,xtmp,ytmp,ww,hh:integer;
begin
ww:=_Texturka.Width;
hh:=_Texturka.Height;
xtmp:=(_x-(_x div ww)*ww);
ytmp:=(_y-(_y div _Texturka.Height)*_Texturka.Height);
for i:=-1 to ((_R.Right-_R.Left) div ww) do
for ii:=-1 to ((_R.Bottom-_R.top) div hh) do
Acanvas.CopyRect(rect(i*ww+xtmp,ii*hh+ytmp,(i+1)*ww+xtmp,(ii+1)*hh+ytmp), _Texturka.Canvas ,rect(0,0,ww,hh));
end;
procedure FillTexturka2canvas2( Acanvas:Tcanvas; _Texturka:Tbitmap; _R:Trect; _x,_y:integer);
var i,ii,xtmp,ytmp,ww,hh:integer;
begin
ww:=_Texturka.Width;
hh:=_Texturka.Height;
xtmp:=(_x-(_x div ww)*ww);
ytmp:=(_y-(_y div _Texturka.Height)*_Texturka.Height);
for i:=-1 to ((_R.Right-_R.Left) div ww) do
for ii:=-1 to ((_R.Bottom-_R.top) div hh) do
Acanvas.Draw(i*ww+xtmp,ii*hh+ytmp,_Texturka);
end;
procedure FillTexturka2canvas3( Acanvas:Tcanvas; _Texturka:Tbitmap; _R:Trect; _x,_y:integer);
var i,ii,xtmp,ytmp,ww,hh:integer;
begin
ww:=_Texturka.Width;
hh:=_Texturka.Height;
xtmp:=(_x-(_x div ww)*ww);
ytmp:=(_y-(_y div _Texturka.Height)*_Texturka.Height);
for i:=-1 to ((_R.Right-_R.Left) div ww) do
for ii:=-1 to ((_R.Bottom-_R.top) div hh) do
BitBlt(ACanvas.Handle,i*ww+xtmp,ii*hh+ytmp,(i+1)*ww+xtmp,(ii+1)*hh+ytmp,_Texturka.Canvas.Handle,0,0,SRCCOPY);
end; Тест для трех процедурок, первая canvas.copyrect(), вторая canvas.draw, третья BitBlt(). В тесте на картнку 1600*1200пикселей копировалась битмапка 48*48 в цикле 1000 раз. FillTexturka2canvas: 5,36519529716766 FillTexturka2canvas2: 5,53980799235657 FillTexturka2canvas3: 5,13526998543111
-
и кстати, более чем уверен, что это из-за моего коре дуо результаты так мало расходятся, хотелось бы проверить на атлоне, щас напишу тестик :)
-
> и кстати, более чем уверен, что это из-за моего коре дуо > результаты так мало расходятся, хотелось бы проверить на > атлоне, щас напишу тестик :)
Всегда считал что bitblt видеокартой выполняеться.
-
вот и проверим... http://desksoft.ru/index.php?downloads=attachments&id=71 (208Кб, zip) запустить и написать сюда, мой кора: canvas.CopyRect: 5,28903645575066 canvas.Draw: 5,5305635213414 BitBlt: 5,10156989226284 хотелось бы увидеть именно атлоны, они в прошлый раз моего теста нехорошо себя показали :)
-
гляну завтра - но умножений всё равно перебор. Алгоритм работает даже в потоке, но подмигивает. +/- 10 миллисекунд неколышет. BackBuffer перерисовываеться только при изменении размера формы или параметров отрисовки - т.е примерно раз в полгода (именно так софт 24/7) :-).
-
> вот и проверим...
VgaSafe поставь. И так потесть. На процессор ведь дрова видюхи влиять не могут ?
-
> VgaSafe поставь. И так потесть.
у меня правило - работает - не трожь :) особенно это косается драйверов и администрирования :)
|