首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

用双缓冲区画多条线的图像如何这么慢哟

2013-01-12 
用双缓冲区画多条线的图像怎么这么慢哟?使用delphi的Image控件,采用双缓冲区画图形,每条曲线的颜色不一样,

用双缓冲区画多条线的图像怎么这么慢哟?
使用delphi的Image控件,采用双缓冲区画图形,每条曲线的颜色不一样,画图的时候好慢哟。各位同仁有没有可行的快速的方法,帮帮小妹吧。线条大概有30条吧。
我每次画线调用的代码如下:
  Mypen.lopnclolor:=对应的线条颜色;
  Ppen:=createpenIndirect(Mypen);
  Selectobject(MemDC,Ppen);
  MoveToEX(MemDC,x1,y1,nil);
  LineTo(MemDC,x1-1,y1-1);
  x1:=x1-1;
  y1:=y1-1;
  DeleteObject(Ppen);


其中x1,y1是上一个点的值,x1-1,y1-1是新数据计算出来的新点的值。


请各位大侠帮帮我吧。或者有其他可好的方法??
[解决办法]
第一:
Image 图象的意思,明显它是用来处理图象更合适,
PaintBox 绘制容器,明显它是用来自己绘图的
因此可以看出在选择控件上有问题

第二:
Delphi已经封装好了的Canvas不用,而选择API,关键是你选择API也不是这么用的吧
每画一条线都要Create,Select,Delete,当然慢了,

用Image时,看看这个代码,效率肯定没PaintBox快

var
  i , X , Y , Color : integer;
begin
  Color := $000000;
  for X:=0 to Image1.Width-1 do begin
    Image1.Canvas.Pen.Color := Color;
    for Y:=0 to Image1.Height-1 do begin
      Image1.Canvas.MoveTo(X , Y);
      Image1.Canvas.LineTo(Image1.Width , Y);
    end;
    Color := Color + $010101;
  end;
end;

[解决办法]
引用:
引用:同时画30条线 没什么问题 关键是你多长时间画一次 10毫秒吧。
其实不是多少时间画一次吧,而是数据量很大,线条多,自然就速度慢了



数据量大其实和画图关系真的不大,你的图像的大小肯定是有限制的。假设图片为1280×800的,X坐标其实就只有1280个点 你在多的数据画出来有效点的个数还是有限的。要解决效率问题,我觉得还是在画之前的数据处理上

类似这种多条曲线海量数据的应用场景,我想还是在示波器上吧。他也不是把所有的数据都画了的。而是只画视野范围内的图片
[解决办法]
不管你有多少数据,并不要全部画出来啊,只画界面显示出来的部分就要以了.

双缓冲区的意思是,你先在内部的一个画板上画好,然后在显示的画板上一次贴出来.
你内部创建一个TBitmap,大小就是显示器的大小就可以了,有了数据先在上面画好,
然后在界面的画布上一次贴出来.
http://blog.csdn.net/zyxip/article/details/1546379
用双缓冲实现图形的移动 


[解决办法]
不行就直接在屏幕缓冲区画吧,速度肯定比多重缓冲要快,毕竟少了缓冲区复制。但根本问题是你的缓冲区数据是如何组织的,我觉得有两种解决办法,一是根据可视范围的不同,组织不同的数据,削减数据量,再加入一个深度缓冲区,被覆盖的数据不绘制,这样有点类似d3d的处理方式,但牵扯很多算法,难度比较大。二是定义一个超大缓冲区作为后缓冲区,把所有数据在这个后缓冲区绘制好以后就不动了,屏幕缓冲区只是根据可视范围的不同复制这个缓冲区的不同部分,这样的弊端是要大内存,我理解photoshop应该就是这种处理方法。

热点排行