最近在研究一个.net开源的空间ZedGraph,好像动态画图的时候有闪烁的问题,在网上搜的解决方案都说用双缓存画图,不知道这到底是个啥意思?那位高手能解释一下?有demo最好,先谢谢了!!注:我用的语言是C#

解决方案 »

  1.   

    实际上双缓冲绘制还是有分两个意思的.
    1 窗体本身的双缓冲(主要针对控件布局的缓冲)
    2 内存图贴到目标区域实现的内存图缓冲(绘图中真正意义上的双缓冲)窗体本身的双缓冲主要针对控件的PAINT进行的缓冲,但由于它同时要处理所有的控件还有所有的消息,所以它实际上效果不是很大,除非你的界面上只有有限的几个控件,又在控件的PAINT里画图.但不得不提醒的是,如非必要,千万不要用PAINT画图,PAINT是相当相当相当拖速度的,如果某些控件具有背景图属性,尽可能使用第2步里说的内存图贴到背景图来实现.内存图双缓冲与普通PAINT的区别是:
    PAINT事件并不是实时发生,只有当某些东西盖住过部分区域与主窗体相交或重合,才会引发PAINT事件(当然在代码中主动引发PAINT除外).系统的绘制是实时的,当你的主窗体有新内容更新时,比如PAINT区域要更新,那么这将导致系统绘制速度与PAINT速度的不一致,产生闪烁.(系统的基础级绘制速度可比DX).
    为了避免这一现象,使用内存图双缓冲可避免,因为内存图贴到目标区域并不受系统绘制速度影响,在你的代码里也就是 X.BackGroundImage=内存图.这就有效避免了闪烁.当然,它还是付出代价的,比如内存资源的占用.但相比而言,你的程序不会贴一张几万*几万大小的图吧,所以内存资源占用方面可以忽略(除非你的工程实在是庞大,要用数千张贴图).
    先写这么多吧,吃饭重要.呵呵.吃完了再来写几句.
      

  2.   

    .net提供了方便的双缓冲操作方法BufferedGraphicsContext context = BufferedGraphicsManager.Current;
    using (BufferedGraphics buff = context.Allocate(graphics, rectagle))
    {
        在buff.Graphics进行绘画
         最后调用buff.Render()进行显示
    }