┌────────┐说明: 1.  左边的<<大边框>>是<<图形数据>>
│                │       2.  左边的<<小边框>>是<<屏幕当前显示区域>>
│                │       3.  <<屏幕当前显示区域>>可以在<<大边框>>内自由的活动
│                │       4.  得到<<屏幕当前显示区域>>的<<图形数据>>是需要大量时间来计算
│   ┌───┐   │       5.  当<<屏幕当前显示区域>>被显示过以后就叫<<显示过的区域>>
│   │      │   │目的: 求一个思路能够满足:
│   │      │   │       最大可能的利用<<显示过的区域>>减少冗余计算(实在太占用CPU了)
│   │      │   │       
│   └───┘   │
│                │        各位高手帮忙给我个思路。
└────────┘

解决方案 »

  1.   

    昏迷!怎么变形了   上面的图形其实就是个  <<回>>字形状
      

  2.   

    怎么才能精确计算出 <<需要重绘的区域>> 内?
    这个区域不是个规则矩形阿!
    请教!
      

  3.   

    其实你也没必要计算
    你用这样的代码就可以解决
    void CXXView::OnDraw(CDC* pDC) 
    {
    CRect rcClient;
    GetClientRect(&rcClient);
    if (m_bBitmap)
    {
                      //画你想要画的
    m_bBitmap = FALSE;
    }
             pDC->BitBlt(0, 0, rcClient.Width(), rcClient.Height(),
    &m_MemDC, 0, 0, SRCCOPY);
    }
    m_MemDC是成员变量在OnSize里创建,或者OnCreate(如果大小不改变)
    void CXXView::OnSize(UINT nType, int cx, int cy) 
    {

    if (IsWindow(m_hWnd))
    {
    if (m_MemDC.GetSafeHdc())
    m_MemDC.DeleteDC();
    if (m_Bitmap.GetSafeHandle())
    m_Bitmap.DeleteObject();
    CDC* pDC = GetDC();
    m_MemDC.CreateCompatibleDC(pDC);
    m_Bitmap.CreateCompatibleBitmap(pDC, cx, cy);
    m_MemDC.SelectObject(&m_Bitmap);
    }
    CView::OnSize(nType, cx, cy);
    }
      

  4.   

    需要真正重绘的时候将m_bBitmap设为TRUE; 否则只是Copy一下原来画过的
      

  5.   

    谢谢楼上的这位 <<goodboyws(深夜不眠者)>> 不过<<这种情况>>出现的时候 是画多还是不画呢?画多大呢?<<这种情况>> = <<屏幕当前显示区域>>向下微小移动1个单位 那么这时候 m_bBitmap = ?
    如果是FALSE 那么着新出现的数据我就没有绘制出来 显然不行 
    如果是TURE  那么我需要重画多大的区域呢? 如果全部重画那么我牺牲了太多的CPU时间(特殊:本工程处理数据量实在大 本工程使用在PPC下CPU时间宝贵) 如果部分重画那么又回到了我的难点!这个区域是个不规则矩形怎么办?
      

  6.   

    楼上的 << DentistryDoctor(My heart will fly,in the sky.) >>
    我已经采用的双缓冲了 可就是不知道怎么去精确维护。
      

  7.   

    偶这里的特殊性再说下 处理图形数据的时间>>显示图像的时间
      

  8.   

    你应该根据数据的变化而不是屏幕当前显示区域的位置来决定更新,看看那些数据更新,将相应的变化更新到内存DC,同时COPY到屏幕DC,屏幕DC用GetDC获取,直接画需要更新的部分,不要调用Invalidate这样更新只是变化的部分。另外,建议你把屏幕当前显示区域和绘图区域做成两块内存DC,这样比较方便实现移动效果
      

  9.   

    楼上的<<hjunxu(hjun) >>谢谢回复
    我也想一次性计算好 8过实在是计算量有点大阿!
    基本上<<图形数据>>需要大约3分钟的时间计算。对于一个实时的系统来说让用户等待3分钟
    -_-!!
      

  10.   

    楼上的<<goodboyws(深夜不眠者)>> 
    认为处理图形数据和绘制应该是两个独立的过程,不要因为显示去处理图形数据我的意见是:
         不错!过程是互相独立的! 可是出现这种<<问题>>呢?
     <<问题>> =  用户可以自由的使用<<屏幕当前显示区域>>来浏览<<图形数据>> 
    我无法预先知道用户下一步会看到什么位置!也就是说<<图形数据>>这块内容的是否需要计算取决于用户把<<屏幕当前显示区域>>移动到那个位置。
      

  11.   

    楼上的<<goodboyws(深夜不眠者)>> 
    认为用多线程,一边处理一边更新试试我的意见是:
    多线程只是手段,还是避免不了要去判断 那些区域显示过了不要去计算 那些区域还未显示需要去计算的问题。
      

  12.   

    楼上的<<goodboyws(深夜不眠者)>> 
    认为用多线程,一边处理一边更新试试我的意见是:
    多线程只是手段,还是避免不了要去判断 那些区域显示过了不要去计算 那些区域还未显示需要去计算的问题。======================================
    可以程序一起来就用后台线程去计算,尝试所有内容都计算好。或者可以让线程优先计算当前要显示的内容?如果当前要显示的已经计算过,可以直接显示。另:存储的时候就放计算好的内容可不可以 ?
      

  13.   

    我现在的想法是这样的 请各位斧正:1.建立一个 <<缓冲位图类>> 存储已显示的所有数据
    2.建立一个 <<已显示过的矩形链表类>> 来记录所有现实过的矩形数据处理办法是:
    当 <<屏幕当前显示区域>> 位置发生改变的时候 立刻通过<<已显示过的矩形链表类>> 中的纪录计算出一个最小的需要重画的区域。那么重画该区域并添加到<<已显示过的矩形链表类>> 中。并刷新<<缓冲位图类>>
      

  14.   

    谢谢楼上的<< hjunxu(hjun)>>的回复
    认为:可以程序一起来就用后台线程去计算,尝试所有内容都计算好。或者可以让线程优先计算当前要显示的内容?如果当前要显示的已经计算过,可以直接显示。另:存储的时候就放计算好的内容可不可以 ?我的意见:
    1)一起来就计算,尝试所有内容都计算好.  
    这点可能性不大 因为不是PC机上使用 是PDA上用的(1.计算量>>ARM的计算力 2.耗电 3.影响别的程序运行)
    2)或者可以让线程优先计算当前要显示的内容? 
    这是十分必要的 我现在就在确定这个问题的解决办法。
    3)如果当前要显示的已经计算过,可以直接显示。
    就是这个意思,难度在于判断那些显示过 那些没有显示过
    另:存储的时候就放计算好的内容可不可以 ?
    我存储的数据是图形数据  不是位图 无法直接显示的 而且还要支持缩放 再缩放的时候图形数据必须重新计算的
      

  15.   

    其实内存消耗不会很大 纠正下
    2.建立一个 <<已显示过的矩形链表类>> 来记录所有现实过的矩形数据应该是2.建立一个 <<已显示过的矩形链表类>> 来记录所有现实过的矩形尺寸数据
      

  16.   

    总算明白你的意思了,建议你不用最小的需要重画的区域,这样你的显示过的矩形链表类会非常碎,建议一次用整块的矩形,每个区域的大小要看处理数据的时间,最好有预处理技术,在程序空闲的时候,把屏幕当前显示区域周边的未处理区域搞定如何区分已处理和未处理的图形建议你用区域RGN
    CreateRectRgn/CombineRgn将每次处理的图形组成一个大的区域,这样你每次只要用PtInRegion
    判断一下边界点是不是在已处理RGN之内就可以了。你的需求有点像内存池技术,可以参考一下相关资料,重申一下不建议把每次的处理区域弄得大小,这样用户的感觉反而慢
      

  17.   

    已显示过的矩形链表类可以用Region来替代
      

  18.   

    谢谢楼上的<< goodboyws(深夜不眠者)>>
    如何区分已处理和未处理的图形建议你用区域RGN
    CreateRectRgn/CombineRgn将每次处理的图形组成一个大的区域,这样你每次只要用PtInRegion
    判断一下边界点是不是在已处理RGN之内就可以了我的意见:
    很有点意思 明天我做下 再来和你聊
      

  19.   

    楼上<<Mackz(在相互)>>
    看半天不明白是不是我理解错了,不就是设置一个剪切区域吗?怎么设置内?
      

  20.   

    上一次的显示矩形区域和目前的显示矩形区域进行XOR运算。
      

  21.   

    同意 goodboyws(深夜不眠者) 说的。
    “这样你的显示过的矩形链表类会非常碎“无论是 
    .建立一个 <<已显示过的矩形链表类>> 来记录所有现实过的矩形数据还是建立一个 <<已显示过的矩形链表类>> 来记录所有现实过的矩形尺寸数据。下一次用户要求显示的区域,在链表中很难找到一个正好匹配,即使是差一个pixel.