双缓冲绘图中显卡对于分担CPU任务的作用有多大。我现在做了一个程序,双缓冲绘图,将一个20W个数据的队列绘制成曲线图,每秒更新一次。但CPU占用率比较高,达到80%。
如何能够提高效率降低CPU占用率?队列数据为double型,纵坐标每格大小也以double型表示,每点的纵坐标以(int)(double/double)得到。

解决方案 »

  1.   

    双缓冲绘图不会降低CPU利用率,因为双缓冲是用来防止闪烁的,事实上因为增加了一些绘图操作(选入选出位图、BitBlt),反而使CPU使用率上升,虽然位图的Blt操作可以得到显卡加速的支持。
      

  2.   

    同意3楼的意见,应该是计算比较费时间
    看看有没有办法把计算分散,就是说不要一下子计算这么多,比如在添加该数据时候就计算。
    PS:
    绘制完一次后加个Sleep(0)应该也不能减少cpu的使用,只能使其他程序比较有反应。
      

  3.   

    如果是每秒更新一次的话,检查一下主循环是否有空运行情况如果有,则cpu一直处于使用状态
      

  4.   

    同意3楼,可能在计算上耗费了时间。
    你为什么要 1秒 更新显示一次数据,是有新的数据加入? 还是所有 20W 数据同时更新?
    1,如果是 新数据加入,可以只显示新数据, 所有数据的显示放在 OnPaint中进行.
    2,如果同时 20W 数据更新,因为显示屏 其实不可能 分辨 20W个数据,可选择性的显示部分数据。例如间隔取数.
      

  5.   

    经过将程序检查后,时间不是浪费在计算坐标上,而是位图操作的
    MemDC->MoveTo(startPOINT);
    for(i=start;i<end;i++)
    {
        MemDC->LineTo(nextPOINT);
    }此过程占用了相当多的时间。
      

  6.   

    20W个点不是都要绘制上去的.
    很可能几个连续点是在同一个像素上的,这几个点只要绘制一个就行了.
    lineto太占时间了.要取舍,不能所有的点全部画上.
      

  7.   

    数据量太大,
    第一:最好使用区域而不要使用LineTo
    第二:在做这个的时候首先要考虑去除无用信息,比如说重合点,
    第三:在BITBLT的时候不要缩放不要旋转,直接上屏
      

  8.   

    还忘了,不要用Double/Double这个是除法是浮点运算,太耗时了
      

  9.   

    Cmem 类有没有 这个能快速显示 效果很好